mito-ai 0.1.56__py3-none-any.whl → 0.1.57__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. mito_ai/__init__.py +2 -0
  2. mito_ai/_version.py +1 -1
  3. mito_ai/chart_wizard/__init__.py +3 -0
  4. mito_ai/chart_wizard/handlers.py +52 -0
  5. mito_ai/chart_wizard/urls.py +23 -0
  6. mito_ai/completions/completion_handlers/completion_handler.py +11 -2
  7. mito_ai/completions/completion_handlers/scratchpad_result_handler.py +66 -0
  8. mito_ai/completions/handlers.py +5 -0
  9. mito_ai/completions/models.py +23 -2
  10. mito_ai/completions/prompt_builders/agent_smart_debug_prompt.py +5 -3
  11. mito_ai/completions/prompt_builders/agent_system_message.py +97 -5
  12. mito_ai/completions/prompt_builders/chart_conversion_prompt.py +27 -0
  13. mito_ai/completions/prompt_builders/chat_system_message.py +2 -0
  14. mito_ai/completions/prompt_builders/prompt_constants.py +28 -0
  15. mito_ai/completions/prompt_builders/scratchpad_result_prompt.py +17 -0
  16. mito_ai/utils/provider_utils.py +8 -1
  17. {mito_ai-0.1.56.data → mito_ai-0.1.57.data}/data/share/jupyter/labextensions/mito_ai/build_log.json +102 -102
  18. {mito_ai-0.1.56.data → mito_ai-0.1.57.data}/data/share/jupyter/labextensions/mito_ai/package.json +2 -2
  19. {mito_ai-0.1.56.data → mito_ai-0.1.57.data}/data/share/jupyter/labextensions/mito_ai/schemas/mito_ai/package.json.orig +1 -1
  20. mito_ai-0.1.56.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.dfd7975de75d64db80d6.js → mito_ai-0.1.57.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.9d26322f3e78beb2b666.js +2371 -257
  21. mito_ai-0.1.57.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.9d26322f3e78beb2b666.js.map +1 -0
  22. mito_ai-0.1.56.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.1e7b5cf362385f109883.js → mito_ai-0.1.57.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.79c1ea8a3cda73a4cb6f.js +17 -17
  23. mito_ai-0.1.56.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.1e7b5cf362385f109883.js.map → mito_ai-0.1.57.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.79c1ea8a3cda73a4cb6f.js.map +1 -1
  24. {mito_ai-0.1.56.data → mito_ai-0.1.57.data}/data/share/jupyter/labextensions/mito_ai/themes/mito_ai/index.css +7 -2
  25. {mito_ai-0.1.56.dist-info → mito_ai-0.1.57.dist-info}/METADATA +1 -1
  26. {mito_ai-0.1.56.dist-info → mito_ai-0.1.57.dist-info}/RECORD +51 -45
  27. mito_ai-0.1.56.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.dfd7975de75d64db80d6.js.map +0 -1
  28. {mito_ai-0.1.56.data → mito_ai-0.1.57.data}/data/etc/jupyter/jupyter_server_config.d/mito_ai.json +0 -0
  29. {mito_ai-0.1.56.data → mito_ai-0.1.57.data}/data/share/jupyter/labextensions/mito_ai/schemas/mito_ai/toolbar-buttons.json +0 -0
  30. {mito_ai-0.1.56.data → mito_ai-0.1.57.data}/data/share/jupyter/labextensions/mito_ai/static/node_modules_process_browser_js.4b128e94d31a81ebd209.js +0 -0
  31. {mito_ai-0.1.56.data → mito_ai-0.1.57.data}/data/share/jupyter/labextensions/mito_ai/static/node_modules_process_browser_js.4b128e94d31a81ebd209.js.map +0 -0
  32. {mito_ai-0.1.56.data → mito_ai-0.1.57.data}/data/share/jupyter/labextensions/mito_ai/static/style.js +0 -0
  33. {mito_ai-0.1.56.data → mito_ai-0.1.57.data}/data/share/jupyter/labextensions/mito_ai/static/style_index_js.f5d476ac514294615881.js +0 -0
  34. {mito_ai-0.1.56.data → mito_ai-0.1.57.data}/data/share/jupyter/labextensions/mito_ai/static/style_index_js.f5d476ac514294615881.js.map +0 -0
  35. {mito_ai-0.1.56.data → mito_ai-0.1.57.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_auth_dist_esm_providers_cognito_apis_signOut_mjs-node_module-75790d.688c25857e7b81b1740f.js +0 -0
  36. {mito_ai-0.1.56.data → mito_ai-0.1.57.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_auth_dist_esm_providers_cognito_apis_signOut_mjs-node_module-75790d.688c25857e7b81b1740f.js.map +0 -0
  37. {mito_ai-0.1.56.data → mito_ai-0.1.57.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_auth_dist_esm_providers_cognito_tokenProvider_tokenProvider_-72f1c8.a917210f057fcfe224ad.js +0 -0
  38. {mito_ai-0.1.56.data → mito_ai-0.1.57.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_auth_dist_esm_providers_cognito_tokenProvider_tokenProvider_-72f1c8.a917210f057fcfe224ad.js.map +0 -0
  39. {mito_ai-0.1.56.data → mito_ai-0.1.57.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_dist_esm_index_mjs.6bac1a8c4cc93f15f6b7.js +0 -0
  40. {mito_ai-0.1.56.data → mito_ai-0.1.57.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_dist_esm_index_mjs.6bac1a8c4cc93f15f6b7.js.map +0 -0
  41. {mito_ai-0.1.56.data → mito_ai-0.1.57.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_ui-react_dist_esm_index_mjs.4fcecd65bef9e9847609.js +0 -0
  42. {mito_ai-0.1.56.data → mito_ai-0.1.57.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_ui-react_dist_esm_index_mjs.4fcecd65bef9e9847609.js.map +0 -0
  43. {mito_ai-0.1.56.data → mito_ai-0.1.57.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_react-dom_client_js-node_modules_aws-amplify_ui-react_dist_styles_css.b43d4249e4d3dac9ad7b.js +0 -0
  44. {mito_ai-0.1.56.data → mito_ai-0.1.57.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_react-dom_client_js-node_modules_aws-amplify_ui-react_dist_styles_css.b43d4249e4d3dac9ad7b.js.map +0 -0
  45. {mito_ai-0.1.56.data → mito_ai-0.1.57.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_semver_index_js.3f6754ac5116d47de76b.js +0 -0
  46. {mito_ai-0.1.56.data → mito_ai-0.1.57.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_semver_index_js.3f6754ac5116d47de76b.js.map +0 -0
  47. {mito_ai-0.1.56.data → mito_ai-0.1.57.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_vscode-diff_dist_index_js.ea55f1f9346638aafbcf.js +0 -0
  48. {mito_ai-0.1.56.data → mito_ai-0.1.57.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_vscode-diff_dist_index_js.ea55f1f9346638aafbcf.js.map +0 -0
  49. {mito_ai-0.1.56.data → mito_ai-0.1.57.data}/data/share/jupyter/labextensions/mito_ai/themes/mito_ai/index.js +0 -0
  50. {mito_ai-0.1.56.dist-info → mito_ai-0.1.57.dist-info}/WHEEL +0 -0
  51. {mito_ai-0.1.56.dist-info → mito_ai-0.1.57.dist-info}/entry_points.txt +0 -0
  52. {mito_ai-0.1.56.dist-info → mito_ai-0.1.57.dist-info}/licenses/LICENSE +0 -0
@@ -489,6 +489,25 @@ class ChatHistoryManager {
489
489
  });
490
490
  return agentExecutionMetadata;
491
491
  }
492
+ addScratchpadResultMessage(activeThreadId, scratchpadResult) {
493
+ const scratchpadResultMetadata = {
494
+ promptType: 'agent:scratchpad-result',
495
+ threadId: activeThreadId,
496
+ scratchpadResult: scratchpadResult,
497
+ };
498
+ // Add empty user message to display history (like agent execution does for empty input)
499
+ const userMessage = {
500
+ role: 'user',
501
+ content: ''
502
+ };
503
+ this.displayOptimizedChatHistory.push({
504
+ message: userMessage,
505
+ type: 'openai message',
506
+ promptType: 'agent:scratchpad-result',
507
+ scratchpadResult: scratchpadResult,
508
+ });
509
+ return scratchpadResultMetadata;
510
+ }
492
511
  addSmartDebugMessage(activeThreadId, errorMessage) {
493
512
  const activeCellID = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_1__.getActiveCellID)(this.notebookTracker) || '';
494
513
  const activeCellCode = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_1__.getCellCodeByID)(this.notebookTracker, activeCellID) || '';
@@ -1855,9 +1874,11 @@ __webpack_require__.r(__webpack_exports__);
1855
1874
  /* harmony import */ var _components_AgentComponents_GetCellOutputToolUI__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../../components/AgentComponents/GetCellOutputToolUI */ "./lib/components/AgentComponents/GetCellOutputToolUI.js");
1856
1875
  /* harmony import */ var _components_AgentComponents_AssumptionToolUI__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../../components/AgentComponents/AssumptionToolUI */ "./lib/components/AgentComponents/AssumptionToolUI.js");
1857
1876
  /* harmony import */ var _components_SelectedContextContainer__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../../components/SelectedContextContainer */ "./lib/components/SelectedContextContainer.js");
1858
- /* harmony import */ var _components_AgentComponents_RunAllCellsToolUI__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../../components/AgentComponents/RunAllCellsToolUI */ "./lib/components/AgentComponents/RunAllCellsToolUI.js");
1859
- /* harmony import */ var _components_AgentComponents_CreateStreamlitAppToolUI__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../../components/AgentComponents/CreateStreamlitAppToolUI */ "./lib/components/AgentComponents/CreateStreamlitAppToolUI.js");
1860
- /* harmony import */ var _components_AgentComponents_EditStreamlitAppToolUI__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../../../components/AgentComponents/EditStreamlitAppToolUI */ "./lib/components/AgentComponents/EditStreamlitAppToolUI.js");
1877
+ /* harmony import */ var _components_AgentComponents_RunAllCellsToolUI__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../../components/AgentComponents/RunAllCellsToolUI */ "./lib/components/AgentComponents/RunAllCellsToolUI.js");
1878
+ /* harmony import */ var _components_AgentComponents_AskUserQuestionToolUI__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../../../components/AgentComponents/AskUserQuestionToolUI */ "./lib/components/AgentComponents/AskUserQuestionToolUI.js");
1879
+ /* harmony import */ var _components_AgentComponents_ScratchpadToolUI__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../../components/AgentComponents/ScratchpadToolUI */ "./lib/components/AgentComponents/ScratchpadToolUI.js");
1880
+ /* harmony import */ var _components_AgentComponents_CreateStreamlitAppToolUI__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../../../components/AgentComponents/CreateStreamlitAppToolUI */ "./lib/components/AgentComponents/CreateStreamlitAppToolUI.js");
1881
+ /* harmony import */ var _components_AgentComponents_EditStreamlitAppToolUI__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../../../components/AgentComponents/EditStreamlitAppToolUI */ "./lib/components/AgentComponents/EditStreamlitAppToolUI.js");
1861
1882
  /*
1862
1883
  * Copyright (c) Saga Inc.
1863
1884
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -1885,7 +1906,9 @@ __webpack_require__.r(__webpack_exports__);
1885
1906
 
1886
1907
 
1887
1908
 
1888
- const ChatMessage = ({ app, message, promptType, agentResponse, messageIndex, mitoAIConnectionError, mitoAIConnectionErrorType, notebookTracker, renderMimeRegistry, isLastAiMessage, isLastMessage, operatingSystem, previewAICode, acceptAICode, rejectAICode, contextManager, codeReviewStatus, setNextSteps, agentModeEnabled, additionalContext, handleSubmitUserMessage, }) => {
1909
+
1910
+
1911
+ const ChatMessage = ({ app, message, promptType, agentResponse, messageIndex, mitoAIConnectionError, mitoAIConnectionErrorType, notebookTracker, renderMimeRegistry, isLastAiMessage, isLastMessage, operatingSystem, previewAICode, acceptAICode, rejectAICode, contextManager, codeReviewStatus, setNextSteps, agentModeEnabled, additionalContext, handleSubmitUserMessage, scratchpadResult, }) => {
1889
1912
  const [isEditing, setIsEditing] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
1890
1913
  if (message.role !== 'user' && message.role !== 'assistant') {
1891
1914
  return null;
@@ -1915,7 +1938,7 @@ const ChatMessage = ({ app, message, promptType, agentResponse, messageIndex, mi
1915
1938
  setNextSteps(agentResponse.next_steps);
1916
1939
  }
1917
1940
  if (isEditing) {
1918
- return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ChatInput__WEBPACK_IMPORTED_MODULE_4__["default"], { app: app, initialContent: message.content.replace(/```[\s\S]*?```/g, '').trim(), onCancel: handleCancel, isEditing: isEditing, contextManager: contextManager, notebookTracker: notebookTracker, agentModeEnabled: false, handleSubmitUserMessage: handleSubmitUserMessageAndCloseEditing, messageIndex: messageIndex }));
1941
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ChatInput__WEBPACK_IMPORTED_MODULE_4__["default"], { app: app, initialContent: message.content.replace(/```[\s\S]*?```/g, '').trim(), onCancel: handleCancel, isEditing: isEditing, contextManager: contextManager, notebookTracker: notebookTracker, agentModeEnabled: agentModeEnabled, handleSubmitUserMessage: handleSubmitUserMessageAndCloseEditing, messageIndex: messageIndex }));
1919
1942
  }
1920
1943
  if (mitoAIConnectionError) {
1921
1944
  return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: (0,_utils_classNames__WEBPACK_IMPORTED_MODULE_5__.classNames)("message") },
@@ -1977,12 +2000,18 @@ const ChatMessage = ({ app, message, promptType, agentResponse, messageIndex, mi
1977
2000
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_Pencil__WEBPACK_IMPORTED_MODULE_18__["default"], null))),
1978
2001
  (agentResponse === null || agentResponse === void 0 ? void 0 : agentResponse.type) === 'get_cell_output' &&
1979
2002
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_AgentComponents_GetCellOutputToolUI__WEBPACK_IMPORTED_MODULE_19__["default"], null),
2003
+ (agentResponse === null || agentResponse === void 0 ? void 0 : agentResponse.type) === 'scratchpad' &&
2004
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_AgentComponents_ScratchpadToolUI__WEBPACK_IMPORTED_MODULE_20__["default"], { scratchpadCode: agentResponse.scratchpad_code, scratchpadSummary: agentResponse.scratchpad_summary, scratchpadResult: scratchpadResult, renderMimeRegistry: renderMimeRegistry }),
1980
2005
  (agentResponse === null || agentResponse === void 0 ? void 0 : agentResponse.type) === 'run_all_cells' && agentModeEnabled &&
1981
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_AgentComponents_RunAllCellsToolUI__WEBPACK_IMPORTED_MODULE_20__["default"], null),
2006
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_AgentComponents_RunAllCellsToolUI__WEBPACK_IMPORTED_MODULE_21__["default"], null),
2007
+ (agentResponse === null || agentResponse === void 0 ? void 0 : agentResponse.type) === 'ask_user_question' &&
2008
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_AgentComponents_AskUserQuestionToolUI__WEBPACK_IMPORTED_MODULE_22__["default"], { question: agentResponse.question || '', answers: agentResponse.answers, isLastMessage: isLastMessage, onAnswerSelected: (answer) => {
2009
+ handleSubmitUserMessage(answer);
2010
+ } }),
1982
2011
  (agentResponse === null || agentResponse === void 0 ? void 0 : agentResponse.type) === 'create_streamlit_app' && agentModeEnabled &&
1983
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_AgentComponents_CreateStreamlitAppToolUI__WEBPACK_IMPORTED_MODULE_21__["default"], { isRunning: isLastMessage }),
2012
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_AgentComponents_CreateStreamlitAppToolUI__WEBPACK_IMPORTED_MODULE_23__["default"], { isRunning: isLastMessage }),
1984
2013
  (agentResponse === null || agentResponse === void 0 ? void 0 : agentResponse.type) === 'edit_streamlit_app' && agentModeEnabled &&
1985
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_AgentComponents_EditStreamlitAppToolUI__WEBPACK_IMPORTED_MODULE_22__["default"], { isRunning: isLastMessage })));
2014
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_AgentComponents_EditStreamlitAppToolUI__WEBPACK_IMPORTED_MODULE_24__["default"], { isRunning: isLastMessage })));
1986
2015
  };
1987
2016
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ChatMessage);
1988
2017
 
@@ -2876,6 +2905,23 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, str
2876
2905
  };
2877
2906
  await _sendMessageAndSaveResponse(completionRequest, newChatHistoryManager);
2878
2907
  };
2908
+ const sendScratchpadResultMessage = async (scratchpadResult) => {
2909
+ // Step 0: reset the state for a new message
2910
+ resetForNewMessage();
2911
+ // Step 1: Add the scratchpad result message to the chat history
2912
+ const newChatHistoryManager = getDuplicateChatHistoryManager();
2913
+ const scratchpadResultMetadata = newChatHistoryManager.addScratchpadResultMessage(activeThreadIdRef.current, scratchpadResult);
2914
+ setChatHistoryManager(newChatHistoryManager);
2915
+ setLoadingStatus('thinking');
2916
+ // Step 2: Send the message to the AI
2917
+ const completionRequest = {
2918
+ type: 'agent:scratchpad-result',
2919
+ message_id: _lumino_coreutils__WEBPACK_IMPORTED_MODULE_2__.UUID.uuid4(),
2920
+ metadata: scratchpadResultMetadata,
2921
+ stream: false
2922
+ };
2923
+ await _sendMessageAndSaveResponse(completionRequest, newChatHistoryManager);
2924
+ };
2879
2925
  /*
2880
2926
  Send whatever message is currently in the chat input
2881
2927
  */
@@ -3024,8 +3070,8 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, str
3024
3070
  }
3025
3071
  else {
3026
3072
  const content = (_b = (_a = aiResponse.items[0]) === null || _a === void 0 ? void 0 : _a.content) !== null && _b !== void 0 ? _b : '';
3027
- if (completionRequest.metadata.promptType === 'agent:execution' || completionRequest.metadata.promptType === 'agent:autoErrorFixup') {
3028
- // Agent:Execution prompts return a CellUpdate object that we need to parse
3073
+ if (completionRequest.metadata.promptType === 'agent:execution' || completionRequest.metadata.promptType === 'agent:scratchpad-result' || completionRequest.metadata.promptType === 'agent:autoErrorFixup') {
3074
+ // Agent:Execution and Agent:ScratchpadResult prompts return a CellUpdate object that we need to parse
3029
3075
  const agentResponse = JSON.parse(content);
3030
3076
  newChatHistoryManager.addAIMessageFromAgentResponse(agentResponse);
3031
3077
  }
@@ -3087,6 +3133,7 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, str
3087
3133
  addAIMessageFromResponseAndUpdateState,
3088
3134
  getDuplicateChatHistoryManager,
3089
3135
  sendAgentExecutionMessage,
3136
+ sendScratchpadResultMessage,
3090
3137
  sendAgentSmartDebugMessage,
3091
3138
  agentReview,
3092
3139
  agentTargetNotebookPanelRef,
@@ -3339,7 +3386,7 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, str
3339
3386
  return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_AgentComponents_ErrorFixupToolUI__WEBPACK_IMPORTED_MODULE_36__["default"], { key: index, messages: displayOptimizedChat, renderMimeRegistry: renderMimeRegistry, notebookTracker: notebookTracker }));
3340
3387
  }
3341
3388
  else {
3342
- return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ChatMessage_ChatMessage__WEBPACK_IMPORTED_MODULE_37__["default"], { key: index, message: displayOptimizedChat.message, promptType: displayOptimizedChat.promptType, agentResponse: displayOptimizedChat.agentResponse, codeCellID: displayOptimizedChat.codeCellID, mitoAIConnectionError: displayOptimizedChat.type === 'connection error', mitoAIConnectionErrorType: displayOptimizedChat.mitoAIConnectionErrorType || null, messageIndex: index, notebookTracker: notebookTracker, renderMimeRegistry: renderMimeRegistry, app: app, isLastAiMessage: index === lastAIMessagesIndex, isLastMessage: index === displayOptimizedChatHistory.length - 1, operatingSystem: operatingSystem, previewAICode: previewAICodeToActiveCell, acceptAICode: acceptAICode, rejectAICode: rejectAICode, handleSubmitUserMessage: handleSubmitUserMessage, contextManager: contextManager, codeReviewStatus: codeReviewStatus, setNextSteps: setNextSteps, agentModeEnabled: agentModeEnabled, additionalContext: displayOptimizedChat.additionalContext }));
3389
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ChatMessage_ChatMessage__WEBPACK_IMPORTED_MODULE_37__["default"], { key: index, message: displayOptimizedChat.message, promptType: displayOptimizedChat.promptType, agentResponse: displayOptimizedChat.agentResponse, codeCellID: displayOptimizedChat.codeCellID, mitoAIConnectionError: displayOptimizedChat.type === 'connection error', mitoAIConnectionErrorType: displayOptimizedChat.mitoAIConnectionErrorType || null, messageIndex: index, notebookTracker: notebookTracker, renderMimeRegistry: renderMimeRegistry, app: app, isLastAiMessage: index === lastAIMessagesIndex, isLastMessage: index === displayOptimizedChatHistory.length - 1, operatingSystem: operatingSystem, previewAICode: previewAICodeToActiveCell, acceptAICode: acceptAICode, rejectAICode: rejectAICode, handleSubmitUserMessage: handleSubmitUserMessage, contextManager: contextManager, codeReviewStatus: codeReviewStatus, setNextSteps: setNextSteps, agentModeEnabled: agentModeEnabled, additionalContext: displayOptimizedChat.additionalContext, scratchpadResult: displayOptimizedChat.scratchpadResult }));
3343
3390
  }
3344
3391
  }).filter(message => message !== null),
3345
3392
  loadingStatus === 'thinking' &&
@@ -3958,6 +4005,7 @@ __webpack_require__.r(__webpack_exports__);
3958
4005
  /* harmony import */ var _utils_strings__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../utils/strings */ "./lib/utils/strings.js");
3959
4006
  /* harmony import */ var _utils_notebook__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../utils/notebook */ "./lib/utils/notebook.js");
3960
4007
  /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils */ "./lib/Extensions/AiChat/utils.js");
4008
+ /* harmony import */ var _utils_scratchpadExecution__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../../utils/scratchpadExecution */ "./lib/utils/scratchpadExecution.js");
3961
4009
  /*
3962
4010
  * Copyright (c) Saga Inc.
3963
4011
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -3971,8 +4019,9 @@ __webpack_require__.r(__webpack_exports__);
3971
4019
 
3972
4020
 
3973
4021
 
4022
+
3974
4023
  const AGENT_EXECUTION_DEPTH_LIMIT = 20;
3975
- const useAgentExecution = ({ notebookTracker, app, streamlitPreviewManager, websocketClient, documentManager, chatHistoryManagerRef, activeThreadIdRef, activeRequestControllerRef, setLoadingStatus, setAutoScrollFollowMode, setHasCheckpoint, addAIMessageFromResponseAndUpdateState, getDuplicateChatHistoryManager, sendAgentExecutionMessage, sendAgentSmartDebugMessage, agentReview, agentTargetNotebookPanelRef, audioContextRef, }) => {
4024
+ const useAgentExecution = ({ notebookTracker, app, streamlitPreviewManager, websocketClient, documentManager, chatHistoryManagerRef, activeThreadIdRef, activeRequestControllerRef, setLoadingStatus, setAutoScrollFollowMode, setHasCheckpoint, addAIMessageFromResponseAndUpdateState, getDuplicateChatHistoryManager, sendAgentExecutionMessage, sendScratchpadResultMessage, sendAgentSmartDebugMessage, agentReview, agentTargetNotebookPanelRef, audioContextRef, }) => {
3976
4025
  // Agent execution state
3977
4026
  const [agentExecutionStatus, setAgentExecutionStatus] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('idle');
3978
4027
  const shouldContinueAgentExecution = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(true);
@@ -4020,6 +4069,7 @@ const useAgentExecution = ({ notebookTracker, app, streamlitPreviewManager, webs
4020
4069
  let isAgentFinished = false;
4021
4070
  let agentExecutionDepth = 1;
4022
4071
  let sendCellIDOutput = undefined;
4072
+ let processedScratchpadResult = undefined;
4023
4073
  // Sometimes its useful to send extra information back to the agent. For example,
4024
4074
  // if the agent tries to create a streamlit app and it errors, we want to let the
4025
4075
  // orchestrator agent know about the issue.
@@ -4039,6 +4089,11 @@ const useAgentExecution = ({ notebookTracker, app, streamlitPreviewManager, webs
4039
4089
  if (agentExecutionDepth === 1) {
4040
4090
  await sendAgentExecutionMessage(input, messageIndex, undefined, additionalContext);
4041
4091
  }
4092
+ else if (processedScratchpadResult !== undefined) {
4093
+ // If we have scratchpad results, send them using the scratchpad result message type
4094
+ await sendScratchpadResultMessage(processedScratchpadResult);
4095
+ processedScratchpadResult = undefined;
4096
+ }
4042
4097
  else {
4043
4098
  await sendAgentExecutionMessage(messageToShareWithAgent || '', undefined, sendCellIDOutput);
4044
4099
  // Reset flag back to false until the agent requests the active cell output again
@@ -4056,7 +4111,7 @@ const useAgentExecution = ({ notebookTracker, app, streamlitPreviewManager, webs
4056
4111
  const securityCheck = (0,_utils_blacklistedWords__WEBPACK_IMPORTED_MODULE_7__.checkForBlacklistedWords)(aiGeneratedCode);
4057
4112
  if (!securityCheck.safe) {
4058
4113
  console.error('Security Warning:', securityCheck.reason);
4059
- addAIMessageFromResponseAndUpdateState(`I cannot execute this code without your approval because this code did not pass my security checks. ${securityCheck.reason}. For your safety, I am stopping execution of this plan.`, 'agent:execution', chatHistoryManagerRef.current);
4114
+ addAIMessageFromResponseAndUpdateState(`I cannot automatically execute this code because it did not pass my security checks. ${securityCheck.reason}. If you decide that this code is safe, you can manually run it.`, 'agent:execution', chatHistoryManagerRef.current);
4060
4115
  await markAgentForStopping();
4061
4116
  break;
4062
4117
  }
@@ -4144,6 +4199,13 @@ const useAgentExecution = ({ notebookTracker, app, streamlitPreviewManager, webs
4144
4199
  }
4145
4200
  }
4146
4201
  }
4202
+ if (agentResponse.type === 'ask_user_question') {
4203
+ // When the agent asks a question, we stop execution and wait for the user's response.
4204
+ // The agent will automatically resume when the user responds
4205
+ await markAgentForStopping();
4206
+ isAgentFinished = true;
4207
+ break;
4208
+ }
4147
4209
  if (agentResponse.type === 'create_streamlit_app') {
4148
4210
  // Create new preview using the service
4149
4211
  const createStreamlitAppPrompt = agentResponse.streamlit_app_prompt || '';
@@ -4165,6 +4227,27 @@ const useAgentExecution = ({ notebookTracker, app, streamlitPreviewManager, webs
4165
4227
  messageToShareWithAgent = streamlitPreviewResponse.message;
4166
4228
  }
4167
4229
  }
4230
+ if (agentResponse.type === 'scratchpad' && agentResponse.scratchpad_code) {
4231
+ // Check the scratchpad code for blacklisted words before executing it
4232
+ const securityCheck = (0,_utils_blacklistedWords__WEBPACK_IMPORTED_MODULE_7__.checkForBlacklistedWords)(agentResponse.scratchpad_code);
4233
+ if (!securityCheck.safe) {
4234
+ console.error('Security Warning:', securityCheck.reason);
4235
+ addAIMessageFromResponseAndUpdateState(`I cannot automatically execute this code because it did not pass my security checks. ${securityCheck.reason}. If you decide that this code is safe, you can manually run it.`, 'agent:execution', chatHistoryManagerRef.current);
4236
+ await markAgentForStopping();
4237
+ break;
4238
+ }
4239
+ // Execute scratchpad code silently
4240
+ setLoadingStatus('running-code');
4241
+ let scratchpadResult;
4242
+ try {
4243
+ scratchpadResult = await (0,_utils_scratchpadExecution__WEBPACK_IMPORTED_MODULE_9__.executeScratchpadCode)(agentTargetNotebookPanelRef.current, agentResponse.scratchpad_code);
4244
+ }
4245
+ finally {
4246
+ setLoadingStatus(undefined);
4247
+ }
4248
+ // Format the results for the agent
4249
+ processedScratchpadResult = (0,_utils_scratchpadExecution__WEBPACK_IMPORTED_MODULE_9__.formatScratchpadResult)(scratchpadResult);
4250
+ }
4168
4251
  }
4169
4252
  if (agentExecutionDepth > AGENT_EXECUTION_DEPTH_LIMIT) {
4170
4253
  addAIMessageFromResponseAndUpdateState("Since I've been working for a while now, give my work a review and then tell me how to continue.", 'agent:execution', chatHistoryManagerRef.current);
@@ -5337,7 +5420,16 @@ function validateAndCorrectAgentResponse(agentResponse) {
5337
5420
  // Create a copy to avoid mutating the original
5338
5421
  const correctedResponse = { ...agentResponse };
5339
5422
  // Ensure type is valid. Default to finished_task if not valid.
5340
- const validTypes = ['cell_update', 'get_cell_output', 'run_all_cells', 'finished_task', 'create_streamlit_app', 'edit_streamlit_app'];
5423
+ const validTypes = [
5424
+ 'cell_update',
5425
+ 'get_cell_output',
5426
+ 'run_all_cells',
5427
+ 'ask_user_question',
5428
+ 'finished_task',
5429
+ 'create_streamlit_app',
5430
+ 'edit_streamlit_app',
5431
+ 'scratchpad'
5432
+ ];
5341
5433
  correctedResponse.type = (correctedResponse.type && validTypes.includes(correctedResponse.type))
5342
5434
  ? correctedResponse.type
5343
5435
  : 'finished_task';
@@ -5352,6 +5444,13 @@ function validateAndCorrectAgentResponse(agentResponse) {
5352
5444
  if (correctedResponse.next_steps !== undefined && correctedResponse.next_steps !== null) {
5353
5445
  correctedResponse.next_steps = correctStringArray(correctedResponse.next_steps);
5354
5446
  }
5447
+ // Correct ask_user_question
5448
+ if (correctedResponse.answers !== undefined && correctedResponse.answers !== null) {
5449
+ correctedResponse.answers = correctStringArray(correctedResponse.answers);
5450
+ }
5451
+ if (correctedResponse.type === 'ask_user_question' && typeof correctedResponse.question !== 'string') {
5452
+ correctedResponse.question = "";
5453
+ }
5355
5454
  // Correct analysis_assumptions - handle string to array conversion
5356
5455
  if (correctedResponse.analysis_assumptions !== undefined && correctedResponse.analysis_assumptions !== null) {
5357
5456
  correctedResponse.analysis_assumptions = correctStringArray(correctedResponse.analysis_assumptions);
@@ -5361,6 +5460,13 @@ function validateAndCorrectAgentResponse(agentResponse) {
5361
5460
  // Correct streamlit_app_prompt - ensure it's a string when present
5362
5461
  const editStreamlitAppPromptType = typeof correctedResponse.streamlit_app_prompt;
5363
5462
  correctedResponse.streamlit_app_prompt = editStreamlitAppPromptType === 'string' ? correctedResponse.streamlit_app_prompt : undefined;
5463
+ // Correct scratchpad_code and scratchpad_summary - ensure they're strings when present
5464
+ if (correctedResponse.type === 'scratchpad') {
5465
+ const scratchpadCodeType = typeof correctedResponse.scratchpad_code;
5466
+ correctedResponse.scratchpad_code = scratchpadCodeType === 'string' ? correctedResponse.scratchpad_code : undefined;
5467
+ const scratchpadSummaryType = typeof correctedResponse.scratchpad_summary;
5468
+ correctedResponse.scratchpad_summary = scratchpadSummaryType === 'string' ? correctedResponse.scratchpad_summary : undefined;
5469
+ }
5364
5470
  // For now we don't validate the cell_update object itself, as this is more complex and has
5365
5471
  // not caused issues thus far.
5366
5472
  return correctedResponse;
@@ -7313,25 +7419,37 @@ const getAppNameFromNotebookID = (notebookID) => {
7313
7419
 
7314
7420
  /***/ }),
7315
7421
 
7316
- /***/ "./lib/Extensions/ContextManager/ContextManagerPlugin.js":
7317
- /*!***************************************************************!*\
7318
- !*** ./lib/Extensions/ContextManager/ContextManagerPlugin.js ***!
7319
- \***************************************************************/
7422
+ /***/ "./lib/Extensions/ChartWizard/ChartWizardPlugin.js":
7423
+ /*!*********************************************************!*\
7424
+ !*** ./lib/Extensions/ChartWizard/ChartWizardPlugin.js ***!
7425
+ \*********************************************************/
7320
7426
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
7321
7427
 
7322
7428
  __webpack_require__.r(__webpack_exports__);
7323
7429
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
7324
- /* harmony export */ ContextManager: () => (/* binding */ ContextManager),
7325
- /* harmony export */ ContextManagerPlugin: () => (/* binding */ ContextManagerPlugin),
7326
- /* harmony export */ IContextManager: () => (/* binding */ IContextManager),
7327
7430
  /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
7328
7431
  /* harmony export */ });
7329
- /* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/notebook */ "webpack/sharing/consume/default/@jupyterlab/notebook");
7330
- /* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__);
7331
- /* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @lumino/coreutils */ "webpack/sharing/consume/default/@lumino/coreutils");
7332
- /* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_lumino_coreutils__WEBPACK_IMPORTED_MODULE_1__);
7333
- /* harmony import */ var _VariableInspector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./VariableInspector */ "./lib/Extensions/ContextManager/VariableInspector.js");
7334
- /* harmony import */ var _FileInspector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./FileInspector */ "./lib/Extensions/ContextManager/FileInspector.js");
7432
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
7433
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
7434
+ /* harmony import */ var react_dom_client__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom/client */ "./node_modules/react-dom/client.js");
7435
+ /* harmony import */ var _jupyterlab_application__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @jupyterlab/application */ "webpack/sharing/consume/default/@jupyterlab/application");
7436
+ /* harmony import */ var _jupyterlab_application__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_application__WEBPACK_IMPORTED_MODULE_2__);
7437
+ /* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @jupyterlab/apputils */ "webpack/sharing/consume/default/@jupyterlab/apputils");
7438
+ /* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_3__);
7439
+ /* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @jupyterlab/notebook */ "webpack/sharing/consume/default/@jupyterlab/notebook");
7440
+ /* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_4__);
7441
+ /* harmony import */ var _jupyterlab_cells__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @jupyterlab/cells */ "webpack/sharing/consume/default/@jupyterlab/cells");
7442
+ /* harmony import */ var _jupyterlab_cells__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_cells__WEBPACK_IMPORTED_MODULE_5__);
7443
+ /* harmony import */ var _jupyterlab_rendermime__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @jupyterlab/rendermime */ "webpack/sharing/consume/default/@jupyterlab/rendermime");
7444
+ /* harmony import */ var _jupyterlab_rendermime__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_rendermime__WEBPACK_IMPORTED_MODULE_6__);
7445
+ /* harmony import */ var _lumino_widgets__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @lumino/widgets */ "webpack/sharing/consume/default/@lumino/widgets");
7446
+ /* harmony import */ var _lumino_widgets__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_lumino_widgets__WEBPACK_IMPORTED_MODULE_7__);
7447
+ /* harmony import */ var _ChartWizardWidget__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./ChartWizardWidget */ "./lib/Extensions/ChartWizard/ChartWizardWidget.js");
7448
+ /* harmony import */ var _commands__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../commands */ "./lib/commands.js");
7449
+ /* harmony import */ var _components_TextAndIconButton__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../components/TextAndIconButton */ "./lib/components/TextAndIconButton.js");
7450
+ /* harmony import */ var _icons_MagicWand__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../icons/MagicWand */ "./lib/icons/MagicWand.js");
7451
+ /* harmony import */ var _restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../restAPI/RestAPI */ "./lib/restAPI/RestAPI.js");
7452
+ /* harmony import */ var _style_ChartWizardPlugin_css__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../style/ChartWizardPlugin.css */ "./style/ChartWizardPlugin.css");
7335
7453
  /*
7336
7454
  * Copyright (c) Saga Inc.
7337
7455
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -7340,154 +7458,1127 @@ __webpack_require__.r(__webpack_exports__);
7340
7458
 
7341
7459
 
7342
7460
 
7343
- // The provides field in JupyterLab's JupyterFrontEndPlugin expects a token
7344
- // that can be used to look up the service in the dependency injection system,
7345
- // so we define a new token for the ContextManager
7346
- const IContextManager = new _lumino_coreutils__WEBPACK_IMPORTED_MODULE_1__.Token('mito-ai:IContextManager');
7347
- class ContextManager {
7348
- constructor(app, notebookTracker) {
7349
- this.notebookContexts = new Map();
7350
- this._startKernelListener = async (app, notebookPanel) => {
7351
- if (notebookPanel === null) {
7352
- return;
7461
+
7462
+
7463
+
7464
+
7465
+
7466
+
7467
+
7468
+
7469
+
7470
+
7471
+ const ChartWizardButton = ({ onButtonClick }) => {
7472
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
7473
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_TextAndIconButton__WEBPACK_IMPORTED_MODULE_9__["default"], { icon: _icons_MagicWand__WEBPACK_IMPORTED_MODULE_10__["default"], text: "Chart Wizard", title: "Chart Wizard", onClick: onButtonClick, variant: 'purple', width: 'fit-contents', iconPosition: 'left' })));
7474
+ };
7475
+ const ChartWizardPlugin = {
7476
+ id: 'mito-ai:chart-wizard',
7477
+ autoStart: true,
7478
+ requires: [_jupyterlab_rendermime__WEBPACK_IMPORTED_MODULE_6__.IRenderMimeRegistry, _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_3__.ICommandPalette, _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_4__.INotebookTracker],
7479
+ optional: [_jupyterlab_application__WEBPACK_IMPORTED_MODULE_2__.ILayoutRestorer],
7480
+ activate: (app, rendermime, palette, notebookTracker, restorer) => {
7481
+ // Create the Chart Wizard widget
7482
+ const widget = new _ChartWizardWidget__WEBPACK_IMPORTED_MODULE_11__.ChartWizardWidget();
7483
+ widget.id = 'mito-ai-chart-wizard';
7484
+ widget.title.label = 'Chart Wizard';
7485
+ widget.title.closable = true;
7486
+ // Track and restore the widget state
7487
+ const tracker = new _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_3__.WidgetTracker({
7488
+ namespace: widget.id
7489
+ });
7490
+ // Function to open/update the Chart Wizard panel
7491
+ const openChartWizard = (chartData) => {
7492
+ // Update widget with new data if provided
7493
+ if (chartData) {
7494
+ widget.updateChartData(chartData);
7353
7495
  }
7354
- // Initialize context for this notebook if it doesn't exist
7355
- if (!this.notebookContexts.has(notebookPanel.id)) {
7356
- this.notebookContexts.set(notebookPanel.id, { variables: [], files: [] });
7496
+ // Add the widget to the tracker if not already there
7497
+ if (!tracker.has(widget)) {
7498
+ void tracker.add(widget);
7357
7499
  }
7358
- // As soon as the notebook is opened, fetch the files since these are not related to the kernel,
7359
- // but to the notebook itself. This is useful so we can tell the agent which files are available
7360
- // or let the user select a file from the dropdown menu before the kernel is started.
7361
- // We use the notebookPanel.id to identify the notebook because we might need to access
7362
- // NotebookContext even before the kernel is started. For example, to figure out
7363
- // which files are available.
7364
- const updatedFiles = await (0,_FileInspector__WEBPACK_IMPORTED_MODULE_2__.getFiles)(app, notebookPanel);
7365
- this.updateNotebookFiles(notebookPanel.id, updatedFiles);
7366
- // Listen for kernel restart or shut down events and clear the variables for this notebook
7367
- notebookPanel.context.sessionContext.statusChanged.connect((sender, status) => {
7368
- if (status === 'restarting' || status === 'terminating' || status === 'unknown') {
7369
- // Clear the variables for this specific notebook, but don't clear the files
7370
- // as they have not changed.
7371
- this.updateNotebookVariables(notebookPanel.id, []); // Clear variables for this specific notebook
7500
+ // Get the current notebook panel for split-right mode
7501
+ const notebookPanel = notebookTracker.currentWidget;
7502
+ const refId = notebookPanel === null || notebookPanel === void 0 ? void 0 : notebookPanel.id;
7503
+ // Add the widget to main area with split-right mode (like StreamlitPreviewPlugin)
7504
+ if (!widget.isAttached) {
7505
+ if (refId) {
7506
+ app.shell.add(widget, 'main', {
7507
+ mode: 'split-right',
7508
+ ref: refId
7509
+ });
7372
7510
  }
7373
- });
7374
- // Listen to kernel messages
7375
- notebookPanel.context.sessionContext.iopubMessage.connect(async (sender, msg) => {
7376
- // Watch for execute_input messages, which indicate is a request to execute code.
7377
- // Previosuly, we watched for 'execute_result' messages, but these are only returned
7378
- // from the kernel when a code cell prints a value to the output cell, which is not what we want.
7379
- // TODO: Check if there is a race condition where we might end up fetching variables before the
7380
- // code is executed. I don't think this is the case because the kernel runs in one thread I believe.
7381
- // TODO: Eventually we should create a document manager listener so if the user uploads a new file
7382
- // to jupyter, we can update the available files even if they have not executed a kernel message.
7383
- if (msg.header.msg_type === 'execute_input') {
7384
- void (0,_VariableInspector__WEBPACK_IMPORTED_MODULE_3__.fetchVariablesAndUpdateState)(notebookPanel, this.updateNotebookVariables.bind(this, notebookPanel.id));
7385
- const updatedFiles = await (0,_FileInspector__WEBPACK_IMPORTED_MODULE_2__.getFiles)(app, notebookPanel);
7386
- this.updateNotebookFiles(notebookPanel.id, updatedFiles);
7511
+ else {
7512
+ // Fallback to right sidebar if no notebook is open
7513
+ app.shell.add(widget, 'right');
7387
7514
  }
7388
- });
7515
+ }
7516
+ // Activate the widget
7517
+ app.shell.activateById(widget.id);
7389
7518
  };
7390
- this.notebookTracker = notebookTracker;
7391
- // Setup the kernel listener to update context as kernel messages are received
7392
- this.setupKernelListener(app, notebookTracker);
7393
- }
7394
- getNotebookContext(notebookId) {
7395
- return this.notebookContexts.get(notebookId);
7519
+ app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_12__.COMMAND_MITO_AI_OPEN_CHART_WIZARD, {
7520
+ label: 'Open Chart Wizard',
7521
+ execute: () => {
7522
+ void (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_13__.logEvent)('clicked_chart_wizard_button', { source: 'command_palette' });
7523
+ openChartWizard();
7524
+ }
7525
+ });
7526
+ palette.addItem({
7527
+ command: _commands__WEBPACK_IMPORTED_MODULE_12__.COMMAND_MITO_AI_OPEN_CHART_WIZARD,
7528
+ category: 'Mito AI'
7529
+ });
7530
+ if (!tracker.has(widget)) {
7531
+ void tracker.add(widget);
7532
+ }
7533
+ if (restorer) {
7534
+ restorer.add(widget, 'mito-ai-chart-wizard');
7535
+ }
7536
+ const factory = rendermime.getFactory('image/png');
7537
+ if (factory) {
7538
+ rendermime.addFactory({
7539
+ safe: true,
7540
+ mimeTypes: ['image/png'],
7541
+ createRenderer: (options) => {
7542
+ const originalRenderer = factory.createRenderer(options);
7543
+ return new AugmentedImageRenderer(app, originalRenderer, notebookTracker, openChartWizard);
7544
+ }
7545
+ }, -1); // Giving this renderer a lower rank than the default renderer gives this default priority
7546
+ }
7547
+ console.log("mito-ai: ChartWizardPlugin activated");
7396
7548
  }
7397
- getActiveNotebookContext() {
7398
- const activeNotebook = this.notebookTracker.currentWidget;
7399
- if (!activeNotebook)
7400
- return undefined;
7401
- return this.getNotebookContext(activeNotebook.id);
7549
+ };
7550
+ /**
7551
+ * A widget that extends the default ImageRenderer for matplotlib charts.
7552
+ */
7553
+ class AugmentedImageRenderer extends _lumino_widgets__WEBPACK_IMPORTED_MODULE_7__.Widget {
7554
+ constructor(_app, originalRenderer, notebookTracker, openChartWizard) {
7555
+ super();
7556
+ this.reactRoot = null;
7557
+ this.originalRenderer = originalRenderer;
7558
+ this.notebookTracker = notebookTracker;
7559
+ this.openChartWizard = openChartWizard;
7402
7560
  }
7403
- updateNotebookVariables(notebookID, variables) {
7404
- const context = this.notebookContexts.get(notebookID) || { variables: [], files: [] };
7405
- context.variables = variables;
7406
- this.notebookContexts.set(notebookID, context);
7561
+ /**
7562
+ * Render the original image and append the Chart Wizard button.
7563
+ */
7564
+ async renderModel(model) {
7565
+ // Clean up any existing React root before creating a new one
7566
+ if (this.reactRoot) {
7567
+ this.reactRoot.unmount();
7568
+ this.reactRoot = null;
7569
+ }
7570
+ const chartWizardDiv = document.createElement('div');
7571
+ chartWizardDiv.className = 'chart-wizard-button-container';
7572
+ const originalNode = this.originalRenderer.node;
7573
+ // Store the root reference so we can unmount it later
7574
+ this.reactRoot = (0,react_dom_client__WEBPACK_IMPORTED_MODULE_1__.createRoot)(chartWizardDiv);
7575
+ this.reactRoot.render(react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ChartWizardButton, { onButtonClick: () => this.handleButtonClick(model) }));
7576
+ this.node.style.position = 'relative';
7577
+ this.node.classList.add('chart-wizard-output-container');
7578
+ this.node.appendChild(chartWizardDiv);
7579
+ await this.originalRenderer.renderModel(model);
7580
+ this.node.appendChild(originalNode);
7407
7581
  }
7408
- updateNotebookFiles(notebookID, files) {
7409
- const context = this.notebookContexts.get(notebookID) || { variables: [], files: [] };
7410
- context.files = files;
7411
- this.notebookContexts.set(notebookID, context);
7582
+ /**
7583
+ * Dispose of the widget and clean up the React root.
7584
+ */
7585
+ dispose() {
7586
+ if (this.reactRoot) {
7587
+ this.reactRoot.unmount();
7588
+ this.reactRoot = null;
7589
+ }
7590
+ super.dispose();
7412
7591
  }
7413
- // Setup kernel execution listener
7414
- setupKernelListener(app, notebookTracker) {
7415
- // Start the kernel listener for the currently active notebook
7416
- const notebookPanel = notebookTracker.currentWidget;
7417
- void this._startKernelListener(app, notebookPanel);
7418
- // Update the kernel listener whenever the active notebook changes
7419
- notebookTracker.currentChanged.connect(async (_, notebookPanel) => {
7420
- void this._startKernelListener(app, notebookPanel);
7592
+ /*
7593
+ Handle the Chart Wizard button click.
7594
+ Extracts chart data and source code, then opens the Chart Wizard panel.
7595
+ */
7596
+ handleButtonClick(_model) {
7597
+ void (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_13__.logEvent)('clicked_chart_wizard_button', { source: 'chart_output_button' });
7598
+ // Get the notebook panel
7599
+ const notebookPanel = this.notebookTracker.currentWidget;
7600
+ if (!notebookPanel) {
7601
+ console.error('No active notebook panel');
7602
+ return;
7603
+ }
7604
+ // Find the cell that contains this output by traversing up the DOM tree
7605
+ const cellElement = this.node.closest('.jp-Cell');
7606
+ if (!cellElement) {
7607
+ console.error('Could not find cell element');
7608
+ return;
7609
+ }
7610
+ // Find the cell widget by checking which cell's node contains our element
7611
+ const cellWidget = notebookPanel.content.widgets.find(cell => {
7612
+ if (cell instanceof _jupyterlab_cells__WEBPACK_IMPORTED_MODULE_5__.CodeCell) {
7613
+ return cell.node.contains(cellElement) || cellElement.contains(cell.node);
7614
+ }
7615
+ return false;
7421
7616
  });
7617
+ if (!(cellWidget instanceof _jupyterlab_cells__WEBPACK_IMPORTED_MODULE_5__.CodeCell)) {
7618
+ console.warn('Could not find CodeCell widget for this output');
7619
+ return;
7620
+ }
7621
+ const sourceCode = cellWidget.model.sharedModel.source;
7622
+ const cellId = cellWidget.model.id;
7623
+ // Open the Chart Wizard with the extracted data
7624
+ this.openChartWizard({ sourceCode, cellId, notebookTracker: this.notebookTracker });
7422
7625
  }
7423
7626
  }
7424
- const ContextManagerPlugin = {
7425
- id: 'mito-ai:context-manager',
7426
- autoStart: true,
7427
- requires: [_jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__.INotebookTracker],
7428
- provides: IContextManager,
7429
- activate: (app, notebookTracker) => {
7430
- console.log("mito-ai: ContextManagerPlugin activated");
7431
- return new ContextManager(app, notebookTracker);
7432
- }
7433
- };
7434
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ContextManagerPlugin);
7627
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ChartWizardPlugin);
7435
7628
 
7436
7629
 
7437
7630
  /***/ }),
7438
7631
 
7439
- /***/ "./lib/Extensions/ContextManager/FileInspector.js":
7440
- /*!********************************************************!*\
7441
- !*** ./lib/Extensions/ContextManager/FileInspector.js ***!
7442
- \********************************************************/
7632
+ /***/ "./lib/Extensions/ChartWizard/ChartWizardWidget.js":
7633
+ /*!*********************************************************!*\
7634
+ !*** ./lib/Extensions/ChartWizard/ChartWizardWidget.js ***!
7635
+ \*********************************************************/
7443
7636
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
7444
7637
 
7445
7638
  __webpack_require__.r(__webpack_exports__);
7446
7639
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
7447
- /* harmony export */ getFiles: () => (/* binding */ getFiles)
7640
+ /* harmony export */ ChartWizardWidget: () => (/* binding */ ChartWizardWidget)
7448
7641
  /* harmony export */ });
7449
- /* harmony import */ var _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/coreutils */ "webpack/sharing/consume/default/@jupyterlab/coreutils");
7450
- /* harmony import */ var _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_0__);
7642
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
7643
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
7644
+ /* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @jupyterlab/apputils */ "webpack/sharing/consume/default/@jupyterlab/apputils");
7645
+ /* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__);
7646
+ /* harmony import */ var _utils_parser__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils/parser */ "./lib/Extensions/ChartWizard/utils/parser.js");
7647
+ /* harmony import */ var _restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../restAPI/RestAPI */ "./lib/restAPI/RestAPI.js");
7648
+ /* harmony import */ var _utils_strings__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../utils/strings */ "./lib/utils/strings.js");
7649
+ /* harmony import */ var _components_LoadingDots__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../components/LoadingDots */ "./lib/components/LoadingDots.js");
7650
+ /* harmony import */ var _inputs__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./inputs */ "./lib/Extensions/ChartWizard/inputs/BooleanInputRow.js");
7651
+ /* harmony import */ var _inputs__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./inputs */ "./lib/Extensions/ChartWizard/inputs/TupleInputRow.js");
7652
+ /* harmony import */ var _inputs__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./inputs */ "./lib/Extensions/ChartWizard/inputs/NumberInputRow.js");
7653
+ /* harmony import */ var _inputs__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./inputs */ "./lib/Extensions/ChartWizard/inputs/utils.js");
7654
+ /* harmony import */ var _inputs__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./inputs */ "./lib/Extensions/ChartWizard/inputs/ColorInputRow.js");
7655
+ /* harmony import */ var _inputs__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./inputs */ "./lib/Extensions/ChartWizard/inputs/StringInputRow.js");
7656
+ /* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./hooks */ "./lib/Extensions/ChartWizard/hooks/useChartConfig.js");
7657
+ /* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./hooks */ "./lib/Extensions/ChartWizard/hooks/useDebouncedNotebookUpdate.js");
7658
+ /* harmony import */ var _style_ChartWizardWidget_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../style/ChartWizardWidget.css */ "./style/ChartWizardWidget.css");
7451
7659
  /*
7452
7660
  * Copyright (c) Saga Inc.
7453
7661
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
7454
7662
  */
7455
7663
 
7456
- /*
7457
- Fetches all files in the current directory and updates the state of the files.
7458
- */
7459
- const getFiles = async (app, notebookPanel) => {
7460
- const fileManager = app.serviceManager.contents;
7461
- const relativeNotebookPath = notebookPanel.context.path;
7462
- const relativeDirectoryPath = _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_0__.PathExt.dirname(relativeNotebookPath);
7463
- try {
7464
- const contents = await fileManager.get(relativeDirectoryPath);
7465
- if (contents.type === 'directory') {
7466
- // Filter for only csv and Excel files
7467
- const data_files = contents.content.filter((file) => {
7468
- var _a;
7469
- const extension = (_a = file.name.split('.').pop()) === null || _a === void 0 ? void 0 : _a.toLowerCase();
7470
- return extension === 'csv' ||
7471
- extension === 'xlsx' ||
7472
- extension === 'xls' ||
7473
- extension === 'xlsm';
7474
- });
7475
- // Map the files to the File type
7476
- const files = data_files.map((file) => ({
7477
- file_name: file.name
7478
- }));
7479
- // Update the state of the files
7480
- return files;
7481
- }
7482
- else {
7483
- // If the contents are not a directory, set the files to an empty array
7484
- return [];
7485
- }
7486
- }
7487
- catch (error) {
7488
- console.error('Error listing directory contents:', error);
7489
- return [];
7490
- }
7664
+
7665
+
7666
+
7667
+
7668
+
7669
+
7670
+
7671
+
7672
+ /**
7673
+ * Formats a variable name into a human-readable label.
7674
+ * Converts snake_case to Title Case (e.g., "figure_size" -> "Figure Size").
7675
+ */
7676
+ const formatVariableLabel = (variableName) => {
7677
+ return variableName
7678
+ .replace(/_/g, ' ')
7679
+ .toLowerCase()
7680
+ .replace(/\b\w/g, (l) => l.toUpperCase());
7681
+ };
7682
+ const ChartWizardContent = ({ chartData }) => {
7683
+ const [isConverting, setIsConverting] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
7684
+ const [currentSourceCode, setCurrentSourceCode] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);
7685
+ // Reset currentSourceCode when switching to a different chart
7686
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
7687
+ setCurrentSourceCode(null);
7688
+ }, [chartData === null || chartData === void 0 ? void 0 : chartData.sourceCode]);
7689
+ // Use custom hook for chart config management
7690
+ const { configVariables, setConfigVariables, hasConfig } = (0,_hooks__WEBPACK_IMPORTED_MODULE_3__.useChartConfig)({
7691
+ sourceCode: chartData === null || chartData === void 0 ? void 0 : chartData.sourceCode,
7692
+ currentSourceCode,
7693
+ });
7694
+ // Use custom hook for debounced notebook updates
7695
+ const { updateNotebookCell, scheduleUpdate, clearPendingUpdate } = (0,_hooks__WEBPACK_IMPORTED_MODULE_4__.useDebouncedNotebookUpdate)({
7696
+ chartData,
7697
+ debounceDelay: 500,
7698
+ });
7699
+ /**
7700
+ * Handles variable value changes with debounced notebook updates.
7701
+ */
7702
+ const handleVariableChange = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((variableName, newValue) => {
7703
+ const codeToUse = currentSourceCode || (chartData === null || chartData === void 0 ? void 0 : chartData.sourceCode);
7704
+ if (!codeToUse)
7705
+ return;
7706
+ // Update config variables state
7707
+ const updated = configVariables.map((v) => v.name === variableName ? { ...v, value: newValue } : v);
7708
+ setConfigVariables(updated);
7709
+ // Update the source code
7710
+ const updatedCode = (0,_utils_parser__WEBPACK_IMPORTED_MODULE_5__.updateChartConfig)(codeToUse, updated);
7711
+ setCurrentSourceCode(updatedCode);
7712
+ // Schedule debounced notebook update
7713
+ scheduleUpdate(updatedCode);
7714
+ }, [chartData === null || chartData === void 0 ? void 0 : chartData.sourceCode, currentSourceCode, configVariables, setConfigVariables, scheduleUpdate]);
7715
+ /**
7716
+ * Handles chart conversion from matplotlib to Chart Wizard format.
7717
+ */
7718
+ const handleConvertChart = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {
7719
+ void (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_6__.logEvent)('clicked_convert_chart_button');
7720
+ if (!(chartData === null || chartData === void 0 ? void 0 : chartData.sourceCode)) {
7721
+ console.error('No source code available');
7722
+ return;
7723
+ }
7724
+ // Clear any pending debounced updates to prevent race conditions
7725
+ clearPendingUpdate();
7726
+ setIsConverting(true);
7727
+ try {
7728
+ const response = await (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_6__.convertChartCode)(chartData.sourceCode);
7729
+ if (response.converted_code) {
7730
+ // Extract code from markdown code blocks if present
7731
+ const extractedCode = (0,_utils_strings__WEBPACK_IMPORTED_MODULE_7__.removeMarkdownCodeFormatting)(response.converted_code);
7732
+ // Validate that extracted code is not empty to prevent deleting user's code
7733
+ if (!extractedCode || extractedCode.trim().length === 0) {
7734
+ console.error('Error: Extracted code is empty. Cannot update notebook cell.');
7735
+ _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.Notification.emit('Chart conversion failed: The converted code is empty. Please try again or check your chart code.', 'error', {
7736
+ autoClose: 5000
7737
+ });
7738
+ return;
7739
+ }
7740
+ // Update current source code so the useEffect will parse it
7741
+ setCurrentSourceCode(extractedCode);
7742
+ // Update the cell with the converted code and re-execute
7743
+ updateNotebookCell(extractedCode);
7744
+ }
7745
+ }
7746
+ catch (error) {
7747
+ console.error('Error converting chart code:', error);
7748
+ const errorMessage = error instanceof Error ? error.message : 'An unknown error occurred';
7749
+ _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.Notification.emit(`Chart conversion failed: ${errorMessage}. Please try again.`, 'error', {
7750
+ autoClose: 5000
7751
+ });
7752
+ }
7753
+ finally {
7754
+ setIsConverting(false);
7755
+ }
7756
+ }, [chartData === null || chartData === void 0 ? void 0 : chartData.sourceCode, clearPendingUpdate, updateNotebookCell]);
7757
+ /**
7758
+ * Renders the appropriate input field component based on variable type.
7759
+ */
7760
+ const renderInputField = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((variable) => {
7761
+ const label = formatVariableLabel(variable.name);
7762
+ const commonProps = {
7763
+ variable,
7764
+ label,
7765
+ onVariableChange: handleVariableChange,
7766
+ };
7767
+ switch (variable.type) {
7768
+ case 'boolean':
7769
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_inputs__WEBPACK_IMPORTED_MODULE_8__.BooleanInputRow, { key: variable.name, ...commonProps });
7770
+ case 'tuple':
7771
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_inputs__WEBPACK_IMPORTED_MODULE_9__.TupleInputRow, { key: variable.name, ...commonProps });
7772
+ case 'number':
7773
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_inputs__WEBPACK_IMPORTED_MODULE_10__.NumberInputRow, { key: variable.name, ...commonProps });
7774
+ case 'string': {
7775
+ // String input - check if it's a hex color
7776
+ const stringValue = variable.value;
7777
+ const isColor = (0,_inputs__WEBPACK_IMPORTED_MODULE_11__.isHexColor)(stringValue);
7778
+ if (isColor) {
7779
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_inputs__WEBPACK_IMPORTED_MODULE_12__.ColorInputRow, { key: variable.name, ...commonProps });
7780
+ }
7781
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_inputs__WEBPACK_IMPORTED_MODULE_13__.StringInputRow, { key: variable.name, ...commonProps });
7782
+ }
7783
+ default:
7784
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_inputs__WEBPACK_IMPORTED_MODULE_13__.StringInputRow, { key: variable.name, ...commonProps });
7785
+ }
7786
+ }, [handleVariableChange]);
7787
+ // Memoize input fields to prevent unnecessary re-renders
7788
+ const inputFields = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => configVariables.map(renderInputField), [configVariables, renderInputField]);
7789
+ // Early return for empty state
7790
+ if (!chartData) {
7791
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "chart-wizard-empty-state" },
7792
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("h2", null, "Chart Wizard"),
7793
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", null, "Click the Chart Wizard button on a matplotlib chart to get started.")));
7794
+ }
7795
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "chart-wizard-widget" },
7796
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("h2", null, "Chart Wizard"),
7797
+ hasConfig ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "chart-wizard-config-container" },
7798
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", { className: "chart-wizard-config-description" }, "Edit values below to customize your chart. Changes will be reflected in the notebook."),
7799
+ inputFields)) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "chart-wizard-no-config" },
7800
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", null,
7801
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("strong", null, "This chart isn't ready for Chart Wizard yet."),
7802
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("br", null),
7803
+ "Run the converter below or let Mito AI handle it automatically."),
7804
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { className: "button-base button-purple", disabled: isConverting, onClick: handleConvertChart, type: "button" }, isConverting ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
7805
+ "Converting",
7806
+ ' ',
7807
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "chart-wizard-loading-dots" },
7808
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_LoadingDots__WEBPACK_IMPORTED_MODULE_14__["default"], null)))) : ('Convert'))))));
7809
+ };
7810
+ class ChartWizardWidget extends _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.ReactWidget {
7811
+ constructor() {
7812
+ super();
7813
+ this.chartData = null;
7814
+ this.addClass('chart-wizard-widget');
7815
+ }
7816
+ updateChartData(chartData) {
7817
+ this.chartData = chartData;
7818
+ this.update();
7819
+ }
7820
+ render() {
7821
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ChartWizardContent, { chartData: this.chartData });
7822
+ }
7823
+ }
7824
+
7825
+
7826
+ /***/ }),
7827
+
7828
+ /***/ "./lib/Extensions/ChartWizard/hooks/useChartConfig.js":
7829
+ /*!************************************************************!*\
7830
+ !*** ./lib/Extensions/ChartWizard/hooks/useChartConfig.js ***!
7831
+ \************************************************************/
7832
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
7833
+
7834
+ __webpack_require__.r(__webpack_exports__);
7835
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
7836
+ /* harmony export */ useChartConfig: () => (/* binding */ useChartConfig)
7837
+ /* harmony export */ });
7838
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
7839
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
7840
+ /* harmony import */ var _utils_parser__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/parser */ "./lib/Extensions/ChartWizard/utils/parser.js");
7841
+ /*
7842
+ * Copyright (c) Saga Inc.
7843
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
7844
+ */
7845
+
7846
+
7847
+ /**
7848
+ * Hook to manage chart configuration parsing and state.
7849
+ *
7850
+ * Parses chart configuration from source code and provides:
7851
+ * - configVariables: Array of parsed configuration variables
7852
+ * - hasConfig: Boolean indicating if configuration exists
7853
+ */
7854
+ const useChartConfig = ({ sourceCode, currentSourceCode }) => {
7855
+ const [configVariables, setConfigVariables] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);
7856
+ // Parse config when chart data or current source code changes
7857
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
7858
+ const codeToParse = currentSourceCode || sourceCode;
7859
+ if (!codeToParse) {
7860
+ setConfigVariables([]);
7861
+ return;
7862
+ }
7863
+ const parsed = (0,_utils_parser__WEBPACK_IMPORTED_MODULE_1__.parseChartConfig)(codeToParse);
7864
+ if (parsed) {
7865
+ setConfigVariables(parsed.variables);
7866
+ }
7867
+ else {
7868
+ setConfigVariables([]);
7869
+ }
7870
+ }, [sourceCode, currentSourceCode]);
7871
+ const hasConfig = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => configVariables.length > 0, [configVariables.length]);
7872
+ return {
7873
+ configVariables,
7874
+ setConfigVariables,
7875
+ hasConfig,
7876
+ };
7877
+ };
7878
+
7879
+
7880
+ /***/ }),
7881
+
7882
+ /***/ "./lib/Extensions/ChartWizard/hooks/useDebouncedNotebookUpdate.js":
7883
+ /*!************************************************************************!*\
7884
+ !*** ./lib/Extensions/ChartWizard/hooks/useDebouncedNotebookUpdate.js ***!
7885
+ \************************************************************************/
7886
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
7887
+
7888
+ __webpack_require__.r(__webpack_exports__);
7889
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
7890
+ /* harmony export */ useDebouncedNotebookUpdate: () => (/* binding */ useDebouncedNotebookUpdate)
7891
+ /* harmony export */ });
7892
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
7893
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
7894
+ /* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @jupyterlab/notebook */ "webpack/sharing/consume/default/@jupyterlab/notebook");
7895
+ /* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_1__);
7896
+ /* harmony import */ var _utils_notebook__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../utils/notebook */ "./lib/utils/notebook.js");
7897
+ /*
7898
+ * Copyright (c) Saga Inc.
7899
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
7900
+ */
7901
+
7902
+
7903
+
7904
+ /**
7905
+ * Hook to manage debounced notebook cell updates.
7906
+ *
7907
+ * Provides:
7908
+ * - updateNotebookCell: Function to update and re-execute notebook cell with debouncing
7909
+ * - clearPendingUpdate: Function to clear any pending debounced updates
7910
+ */
7911
+ const useDebouncedNotebookUpdate = ({ chartData, debounceDelay = 500, }) => {
7912
+ const executeTimeoutRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);
7913
+ // Cleanup timeout on unmount
7914
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
7915
+ return () => {
7916
+ if (executeTimeoutRef.current) {
7917
+ clearTimeout(executeTimeoutRef.current);
7918
+ }
7919
+ };
7920
+ }, []);
7921
+ const updateNotebookCell = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((updatedCode) => {
7922
+ var _a;
7923
+ if (!chartData)
7924
+ return;
7925
+ const notebookPanel = chartData.notebookTracker.currentWidget;
7926
+ if (!notebookPanel)
7927
+ return;
7928
+ // Update the cell code
7929
+ (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_2__.writeCodeToCellByIDInNotebookPanel)(notebookPanel, updatedCode, chartData.cellId);
7930
+ // Re-execute the cell to show updated chart
7931
+ const notebook = notebookPanel.content;
7932
+ const sessionContext = (_a = notebookPanel.context) === null || _a === void 0 ? void 0 : _a.sessionContext;
7933
+ void _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_1__.NotebookActions.run(notebook, sessionContext);
7934
+ }, [chartData]);
7935
+ const scheduleUpdate = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((updatedCode) => {
7936
+ // Clear previous timeout
7937
+ if (executeTimeoutRef.current) {
7938
+ clearTimeout(executeTimeoutRef.current);
7939
+ }
7940
+ // Debounce the cell update and execution
7941
+ executeTimeoutRef.current = setTimeout(() => {
7942
+ updateNotebookCell(updatedCode);
7943
+ }, debounceDelay);
7944
+ }, [updateNotebookCell, debounceDelay]);
7945
+ const clearPendingUpdate = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {
7946
+ if (executeTimeoutRef.current) {
7947
+ clearTimeout(executeTimeoutRef.current);
7948
+ executeTimeoutRef.current = null;
7949
+ }
7950
+ }, []);
7951
+ return {
7952
+ updateNotebookCell,
7953
+ scheduleUpdate,
7954
+ clearPendingUpdate,
7955
+ };
7956
+ };
7957
+
7958
+
7959
+ /***/ }),
7960
+
7961
+ /***/ "./lib/Extensions/ChartWizard/inputs/BooleanInputRow.js":
7962
+ /*!**************************************************************!*\
7963
+ !*** ./lib/Extensions/ChartWizard/inputs/BooleanInputRow.js ***!
7964
+ \**************************************************************/
7965
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
7966
+
7967
+ __webpack_require__.r(__webpack_exports__);
7968
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
7969
+ /* harmony export */ BooleanInputRow: () => (/* binding */ BooleanInputRow)
7970
+ /* harmony export */ });
7971
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
7972
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
7973
+ /*
7974
+ * Copyright (c) Saga Inc.
7975
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
7976
+ */
7977
+
7978
+ const BooleanInputRow = ({ variable, label, onVariableChange }) => {
7979
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { key: variable.name, className: "chart-wizard-input-row chart-wizard-boolean-row" },
7980
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", { className: "chart-wizard-input-label chart-wizard-boolean-label" }, label),
7981
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", { className: "chart-wizard-toggle-container" },
7982
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { type: "checkbox", checked: variable.value, onChange: (e) => onVariableChange(variable.name, e.target.checked), className: "chart-wizard-toggle-input" }),
7983
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "chart-wizard-toggle-slider" }))));
7984
+ };
7985
+
7986
+
7987
+ /***/ }),
7988
+
7989
+ /***/ "./lib/Extensions/ChartWizard/inputs/ColorInputRow.js":
7990
+ /*!************************************************************!*\
7991
+ !*** ./lib/Extensions/ChartWizard/inputs/ColorInputRow.js ***!
7992
+ \************************************************************/
7993
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
7994
+
7995
+ __webpack_require__.r(__webpack_exports__);
7996
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
7997
+ /* harmony export */ ColorInputRow: () => (/* binding */ ColorInputRow)
7998
+ /* harmony export */ });
7999
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
8000
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
8001
+ /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./lib/Extensions/ChartWizard/inputs/utils.js");
8002
+ /*
8003
+ * Copyright (c) Saga Inc.
8004
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
8005
+ */
8006
+
8007
+
8008
+ const ColorInputRow = ({ variable, label, onVariableChange }) => {
8009
+ const stringValue = variable.value;
8010
+ const normalizedColor = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.normalizeHexColor)(stringValue);
8011
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { key: variable.name, className: "chart-wizard-input-row" },
8012
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", { className: "chart-wizard-input-label" }, label),
8013
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "chart-wizard-color-container" },
8014
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { type: "color", value: normalizedColor, onChange: (e) => {
8015
+ // Color picker returns #RRGGBB, store with #
8016
+ onVariableChange(variable.name, e.target.value);
8017
+ }, className: "chart-wizard-color-picker" }),
8018
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { type: "text", value: normalizedColor, onChange: (e) => {
8019
+ let newValue = e.target.value.trim();
8020
+ // Normalize: ensure it has # for valid hex colors
8021
+ if (newValue && !newValue.startsWith('#')) {
8022
+ if ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.isHexColor)(newValue)) {
8023
+ newValue = `#${newValue}`;
8024
+ }
8025
+ }
8026
+ // Only update if it's a valid hex color
8027
+ if ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.isHexColor)(newValue) || newValue === '') {
8028
+ onVariableChange(variable.name, newValue);
8029
+ }
8030
+ }, placeholder: "#RRGGBB", className: "chart-wizard-color-input" }))));
8031
+ };
8032
+
8033
+
8034
+ /***/ }),
8035
+
8036
+ /***/ "./lib/Extensions/ChartWizard/inputs/NumberInputRow.js":
8037
+ /*!*************************************************************!*\
8038
+ !*** ./lib/Extensions/ChartWizard/inputs/NumberInputRow.js ***!
8039
+ \*************************************************************/
8040
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8041
+
8042
+ __webpack_require__.r(__webpack_exports__);
8043
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8044
+ /* harmony export */ NumberInputRow: () => (/* binding */ NumberInputRow)
8045
+ /* harmony export */ });
8046
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
8047
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
8048
+ /*
8049
+ * Copyright (c) Saga Inc.
8050
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
8051
+ */
8052
+
8053
+ const NumberInputRow = ({ variable, label, onVariableChange }) => {
8054
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { key: variable.name, className: "chart-wizard-input-row" },
8055
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", { className: "chart-wizard-input-label" }, label),
8056
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { type: "number", value: variable.value, onChange: (e) => onVariableChange(variable.name, parseFloat(e.target.value) || 0), className: "chart-wizard-number-input" })));
8057
+ };
8058
+
8059
+
8060
+ /***/ }),
8061
+
8062
+ /***/ "./lib/Extensions/ChartWizard/inputs/StringInputRow.js":
8063
+ /*!*************************************************************!*\
8064
+ !*** ./lib/Extensions/ChartWizard/inputs/StringInputRow.js ***!
8065
+ \*************************************************************/
8066
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8067
+
8068
+ __webpack_require__.r(__webpack_exports__);
8069
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8070
+ /* harmony export */ StringInputRow: () => (/* binding */ StringInputRow)
8071
+ /* harmony export */ });
8072
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
8073
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
8074
+ /*
8075
+ * Copyright (c) Saga Inc.
8076
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
8077
+ */
8078
+
8079
+ const StringInputRow = ({ variable, label, onVariableChange }) => {
8080
+ const stringValue = variable.value;
8081
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { key: variable.name, className: "chart-wizard-input-row" },
8082
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", { className: "chart-wizard-input-label" }, label),
8083
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { type: "text", value: stringValue, onChange: (e) => onVariableChange(variable.name, e.target.value), className: "chart-wizard-text-input" })));
8084
+ };
8085
+
8086
+
8087
+ /***/ }),
8088
+
8089
+ /***/ "./lib/Extensions/ChartWizard/inputs/TupleInputRow.js":
8090
+ /*!************************************************************!*\
8091
+ !*** ./lib/Extensions/ChartWizard/inputs/TupleInputRow.js ***!
8092
+ \************************************************************/
8093
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8094
+
8095
+ __webpack_require__.r(__webpack_exports__);
8096
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8097
+ /* harmony export */ TupleInputRow: () => (/* binding */ TupleInputRow)
8098
+ /* harmony export */ });
8099
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
8100
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
8101
+ /*
8102
+ * Copyright (c) Saga Inc.
8103
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
8104
+ */
8105
+
8106
+ const TupleInputRow = ({ variable, label, onVariableChange }) => {
8107
+ const tupleValue = variable.value;
8108
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { key: variable.name, className: "chart-wizard-input-row" },
8109
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", { className: "chart-wizard-input-label" }, label),
8110
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "chart-wizard-tuple-container" },
8111
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "("),
8112
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { type: "number", value: tupleValue[0], onChange: (e) => {
8113
+ const newValue = [parseFloat(e.target.value) || 0, tupleValue[1]];
8114
+ onVariableChange(variable.name, newValue);
8115
+ }, className: "chart-wizard-tuple-input" }),
8116
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, ","),
8117
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { type: "number", value: tupleValue[1], onChange: (e) => {
8118
+ const newValue = [tupleValue[0], parseFloat(e.target.value) || 0];
8119
+ onVariableChange(variable.name, newValue);
8120
+ }, className: "chart-wizard-tuple-input" }),
8121
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, ")"))));
8122
+ };
8123
+
8124
+
8125
+ /***/ }),
8126
+
8127
+ /***/ "./lib/Extensions/ChartWizard/inputs/utils.js":
8128
+ /*!****************************************************!*\
8129
+ !*** ./lib/Extensions/ChartWizard/inputs/utils.js ***!
8130
+ \****************************************************/
8131
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8132
+
8133
+ __webpack_require__.r(__webpack_exports__);
8134
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8135
+ /* harmony export */ isHexColor: () => (/* binding */ isHexColor),
8136
+ /* harmony export */ normalizeHexColor: () => (/* binding */ normalizeHexColor)
8137
+ /* harmony export */ });
8138
+ /*
8139
+ * Copyright (c) Saga Inc.
8140
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
8141
+ */
8142
+ /**
8143
+ * Checks if a string is a valid hex color code
8144
+ */
8145
+ const isHexColor = (value) => {
8146
+ const hexPattern = /^#?([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/;
8147
+ return hexPattern.test(value);
8148
+ };
8149
+ /**
8150
+ * Normalizes hex color to ensure it has a # prefix and is in 6-digit format
8151
+ * Expands 3-digit hex codes (e.g., #FFF) to 6-digit format (e.g., #FFFFFF)
8152
+ * HTML color inputs require exactly 7 characters in #RRGGBB format
8153
+ */
8154
+ const normalizeHexColor = (value) => {
8155
+ // Remove # if present to work with the hex digits only
8156
+ const hexDigits = value.startsWith('#') ? value.slice(1) : value;
8157
+ // If it's a 3-digit hex code, expand it to 6-digit format
8158
+ if (hexDigits.length === 3 && /^[0-9A-Fa-f]{3}$/.test(hexDigits)) {
8159
+ // Expand each digit: #FFF -> #FFFFFF, #abc -> #aabbcc
8160
+ const expanded = hexDigits
8161
+ .split('')
8162
+ .map(char => char + char)
8163
+ .join('');
8164
+ return `#${expanded}`;
8165
+ }
8166
+ // For 6-digit codes, just ensure it has the # prefix
8167
+ if (value.startsWith('#')) {
8168
+ return value;
8169
+ }
8170
+ return `#${value}`;
8171
+ };
8172
+
8173
+
8174
+ /***/ }),
8175
+
8176
+ /***/ "./lib/Extensions/ChartWizard/utils/parser.js":
8177
+ /*!****************************************************!*\
8178
+ !*** ./lib/Extensions/ChartWizard/utils/parser.js ***!
8179
+ \****************************************************/
8180
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8181
+
8182
+ __webpack_require__.r(__webpack_exports__);
8183
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8184
+ /* harmony export */ parseChartConfig: () => (/* binding */ parseChartConfig),
8185
+ /* harmony export */ updateChartConfig: () => (/* binding */ updateChartConfig)
8186
+ /* harmony export */ });
8187
+ /*
8188
+ * Copyright (c) Saga Inc.
8189
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
8190
+ */
8191
+ /**
8192
+ * Parses the chart configuration section from Python code.
8193
+ * Looks for variables between "# === CHART CONFIG ===" and "# === END CONFIG ===" markers.
8194
+ */
8195
+ function parseChartConfig(sourceCode) {
8196
+ const configStartMarker = '# === CHART CONFIG ===';
8197
+ const configEndMarker = '# === END CONFIG ===';
8198
+ const startIndex = sourceCode.indexOf(configStartMarker);
8199
+ const endIndex = sourceCode.indexOf(configEndMarker);
8200
+ if (startIndex === -1 || endIndex === -1 || startIndex >= endIndex) {
8201
+ return null;
8202
+ }
8203
+ const configSection = sourceCode.substring(startIndex + configStartMarker.length, endIndex).trim();
8204
+ const lines = configSection.split('\n').map(line => line.trim()).filter(line => line.length > 0);
8205
+ const variables = [];
8206
+ for (const line of lines) {
8207
+ // Skip comment lines
8208
+ if (line.startsWith('#')) {
8209
+ continue;
8210
+ }
8211
+ // Parse single variable assignments (one variable per line)
8212
+ const match = line.match(/^([A-Z_][A-Z0-9_]*)\s*=\s*(.+)$/);
8213
+ if (match && match[1] && match[2]) {
8214
+ const varName = match[1];
8215
+ const valueStr = match[2];
8216
+ const parsed = parseValue(valueStr.trim());
8217
+ if (parsed) {
8218
+ variables.push({
8219
+ name: varName,
8220
+ value: parsed.value,
8221
+ type: parsed.type
8222
+ });
8223
+ }
8224
+ }
8225
+ }
8226
+ return {
8227
+ variables,
8228
+ configStartIndex: startIndex,
8229
+ configEndIndex: endIndex + configEndMarker.length
8230
+ };
8231
+ }
8232
+ /**
8233
+ * Parses a Python value string into its appropriate type.
8234
+ */
8235
+ function parseValue(valueStr) {
8236
+ // Remove surrounding whitespace
8237
+ valueStr = valueStr.trim();
8238
+ // Boolean values
8239
+ if (valueStr === 'True') {
8240
+ return { value: true, type: 'boolean' };
8241
+ }
8242
+ if (valueStr === 'False') {
8243
+ return { value: false, type: 'boolean' };
8244
+ }
8245
+ // Tuple (e.g., (12, 6) or (-10, 6))
8246
+ const tupleMatch = valueStr.match(/^\((-?\d+(?:\.\d+)?)\s*,\s*(-?\d+(?:\.\d+)?)\)$/);
8247
+ if (tupleMatch) {
8248
+ return {
8249
+ value: [parseFloat(tupleMatch[1] || '0'), parseFloat(tupleMatch[2] || '0')],
8250
+ type: 'tuple'
8251
+ };
8252
+ }
8253
+ // Number
8254
+ if (/^-?\d+(?:\.\d+)?$/.test(valueStr)) {
8255
+ return { value: parseFloat(valueStr), type: 'number' };
8256
+ }
8257
+ // String (remove quotes and unescape)
8258
+ const stringMatch = valueStr.match(/^(['"])(.*)\1$/);
8259
+ if (stringMatch && stringMatch[1]) {
8260
+ const quoteChar = stringMatch[1];
8261
+ const stringContent = stringMatch[2] || '';
8262
+ // Unescape the string content (convert \' to ', \\ to \, etc.)
8263
+ const unescaped = unescapePythonString(stringContent, quoteChar);
8264
+ return { value: unescaped, type: 'string' };
8265
+ }
8266
+ // Check if it's a Python expression (contains function calls, operators, etc.)
8267
+ // This includes things like pd.to_datetime('2012-04-09'), list comprehensions, etc.
8268
+ if (isPythonExpression(valueStr)) {
8269
+ return { value: valueStr, type: 'expression' };
8270
+ }
8271
+ // If it doesn't match any pattern, treat as string literal
8272
+ return { value: valueStr, type: 'string' };
8273
+ }
8274
+ /**
8275
+ * Unescapes a Python string content, converting escape sequences to their actual characters.
8276
+ */
8277
+ function unescapePythonString(content, quoteChar) {
8278
+ let result = '';
8279
+ let i = 0;
8280
+ while (i < content.length) {
8281
+ if (content[i] === '\\' && i + 1 < content.length) {
8282
+ const next = content[i + 1];
8283
+ if (next !== undefined) {
8284
+ switch (next) {
8285
+ case '\\':
8286
+ result += '\\';
8287
+ i += 2;
8288
+ break;
8289
+ case quoteChar:
8290
+ result += quoteChar;
8291
+ i += 2;
8292
+ break;
8293
+ case 'n':
8294
+ result += '\n';
8295
+ i += 2;
8296
+ break;
8297
+ case 't':
8298
+ result += '\t';
8299
+ i += 2;
8300
+ break;
8301
+ case 'r':
8302
+ result += '\r';
8303
+ i += 2;
8304
+ break;
8305
+ default:
8306
+ // Unknown escape sequence, keep as-is
8307
+ result += content[i] + next;
8308
+ i += 2;
8309
+ break;
8310
+ }
8311
+ }
8312
+ else {
8313
+ result += content[i];
8314
+ i += 1;
8315
+ }
8316
+ }
8317
+ else {
8318
+ result += content[i];
8319
+ i += 1;
8320
+ }
8321
+ }
8322
+ return result;
8323
+ }
8324
+ /**
8325
+ * Escapes a string for use in a Python single-quoted string literal.
8326
+ */
8327
+ function escapePythonString(content) {
8328
+ return content
8329
+ .replace(/\\/g, '\\\\') // Escape backslashes first
8330
+ .replace(/'/g, "\\'"); // Then escape single quotes
8331
+ }
8332
+ /**
8333
+ * Determines if a string is a Python expression (function call, operator, etc.)
8334
+ * rather than a simple string literal.
8335
+ */
8336
+ function isPythonExpression(valueStr) {
8337
+ // Check for function calls (e.g., pd.to_datetime(...), datetime(...))
8338
+ if (/[a-zA-Z_][a-zA-Z0-9_]*\s*\(/.test(valueStr)) {
8339
+ return true;
8340
+ }
8341
+ // Check for operators (arithmetic, comparison, etc.)
8342
+ if (/[+\-*/%<>=!&|]/.test(valueStr)) {
8343
+ return true;
8344
+ }
8345
+ // Check for list/dict comprehensions, slices, etc.
8346
+ if (/\[.*\]|{.*}/.test(valueStr) && !/^['"]/.test(valueStr)) {
8347
+ return true;
8348
+ }
8349
+ // Check for attribute access (e.g., obj.attr)
8350
+ if (/\.[a-zA-Z_][a-zA-Z0-9_]*/.test(valueStr)) {
8351
+ return true;
8352
+ }
8353
+ return false;
8354
+ }
8355
+ /**
8356
+ * Updates the chart configuration section with new variable values.
8357
+ * Regenerates the config section in a simple, consistent format.
8358
+ */
8359
+ function updateChartConfig(sourceCode, variables) {
8360
+ const parsed = parseChartConfig(sourceCode);
8361
+ if (!parsed) {
8362
+ return sourceCode;
8363
+ }
8364
+ // Create a map of variable names to their new values
8365
+ const varMap = new Map();
8366
+ variables.forEach(v => varMap.set(v.name, v));
8367
+ // Build new config section - simple one variable per line format
8368
+ const configStartMarker = '# === CHART CONFIG ===';
8369
+ const configEndMarker = '# === END CONFIG ===';
8370
+ let newConfigSection = configStartMarker + '\n\n';
8371
+ // Use updated variables if available, otherwise keep original
8372
+ const variablesToWrite = parsed.variables.map(v => varMap.get(v.name) || v);
8373
+ for (const variable of variablesToWrite) {
8374
+ const formattedValue = formatValue(variable.value, variable.type);
8375
+ newConfigSection += `${variable.name} = ${formattedValue}\n`;
8376
+ }
8377
+ newConfigSection += '\n' + configEndMarker;
8378
+ // Replace the old config section with the new one
8379
+ const beforeConfig = sourceCode.substring(0, parsed.configStartIndex);
8380
+ const afterConfig = sourceCode.substring(parsed.configEndIndex);
8381
+ return beforeConfig + newConfigSection + afterConfig;
8382
+ }
8383
+ /**
8384
+ * Formats a value back to its Python string representation.
8385
+ */
8386
+ function formatValue(value, type) {
8387
+ if (type === 'boolean') {
8388
+ return value ? 'True' : 'False';
8389
+ }
8390
+ if (type === 'tuple' && Array.isArray(value)) {
8391
+ return `(${value[0]}, ${value[1]})`;
8392
+ }
8393
+ if (type === 'number') {
8394
+ return String(value);
8395
+ }
8396
+ if (type === 'expression') {
8397
+ // Python expressions should be preserved as-is without quotes
8398
+ return String(value);
8399
+ }
8400
+ // String - escape properly and wrap in single quotes
8401
+ return `'${escapePythonString(String(value))}'`;
8402
+ }
8403
+
8404
+
8405
+ /***/ }),
8406
+
8407
+ /***/ "./lib/Extensions/ContextManager/ContextManagerPlugin.js":
8408
+ /*!***************************************************************!*\
8409
+ !*** ./lib/Extensions/ContextManager/ContextManagerPlugin.js ***!
8410
+ \***************************************************************/
8411
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8412
+
8413
+ __webpack_require__.r(__webpack_exports__);
8414
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8415
+ /* harmony export */ ContextManager: () => (/* binding */ ContextManager),
8416
+ /* harmony export */ ContextManagerPlugin: () => (/* binding */ ContextManagerPlugin),
8417
+ /* harmony export */ IContextManager: () => (/* binding */ IContextManager),
8418
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
8419
+ /* harmony export */ });
8420
+ /* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/notebook */ "webpack/sharing/consume/default/@jupyterlab/notebook");
8421
+ /* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__);
8422
+ /* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @lumino/coreutils */ "webpack/sharing/consume/default/@lumino/coreutils");
8423
+ /* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_lumino_coreutils__WEBPACK_IMPORTED_MODULE_1__);
8424
+ /* harmony import */ var _VariableInspector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./VariableInspector */ "./lib/Extensions/ContextManager/VariableInspector.js");
8425
+ /* harmony import */ var _FileInspector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./FileInspector */ "./lib/Extensions/ContextManager/FileInspector.js");
8426
+ /*
8427
+ * Copyright (c) Saga Inc.
8428
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
8429
+ */
8430
+
8431
+
8432
+
8433
+
8434
+ // The provides field in JupyterLab's JupyterFrontEndPlugin expects a token
8435
+ // that can be used to look up the service in the dependency injection system,
8436
+ // so we define a new token for the ContextManager
8437
+ const IContextManager = new _lumino_coreutils__WEBPACK_IMPORTED_MODULE_1__.Token('mito-ai:IContextManager');
8438
+ class ContextManager {
8439
+ constructor(app, notebookTracker) {
8440
+ this.notebookContexts = new Map();
8441
+ this._startKernelListener = async (app, notebookPanel) => {
8442
+ if (notebookPanel === null) {
8443
+ return;
8444
+ }
8445
+ // Initialize context for this notebook if it doesn't exist
8446
+ if (!this.notebookContexts.has(notebookPanel.id)) {
8447
+ this.notebookContexts.set(notebookPanel.id, { variables: [], files: [] });
8448
+ }
8449
+ // As soon as the notebook is opened, fetch the files since these are not related to the kernel,
8450
+ // but to the notebook itself. This is useful so we can tell the agent which files are available
8451
+ // or let the user select a file from the dropdown menu before the kernel is started.
8452
+ // We use the notebookPanel.id to identify the notebook because we might need to access
8453
+ // NotebookContext even before the kernel is started. For example, to figure out
8454
+ // which files are available.
8455
+ const updatedFiles = await (0,_FileInspector__WEBPACK_IMPORTED_MODULE_2__.getFiles)(app, notebookPanel);
8456
+ this.updateNotebookFiles(notebookPanel.id, updatedFiles);
8457
+ // Listen for kernel restart or shut down events and clear the variables for this notebook
8458
+ notebookPanel.context.sessionContext.statusChanged.connect((sender, status) => {
8459
+ if (status === 'restarting' || status === 'terminating' || status === 'unknown') {
8460
+ // Clear the variables for this specific notebook, but don't clear the files
8461
+ // as they have not changed.
8462
+ this.updateNotebookVariables(notebookPanel.id, []); // Clear variables for this specific notebook
8463
+ }
8464
+ });
8465
+ // Listen to kernel messages
8466
+ notebookPanel.context.sessionContext.iopubMessage.connect(async (sender, msg) => {
8467
+ // Watch for execute_input messages, which indicate is a request to execute code.
8468
+ // Previosuly, we watched for 'execute_result' messages, but these are only returned
8469
+ // from the kernel when a code cell prints a value to the output cell, which is not what we want.
8470
+ // TODO: Check if there is a race condition where we might end up fetching variables before the
8471
+ // code is executed. I don't think this is the case because the kernel runs in one thread I believe.
8472
+ // TODO: Eventually we should create a document manager listener so if the user uploads a new file
8473
+ // to jupyter, we can update the available files even if they have not executed a kernel message.
8474
+ if (msg.header.msg_type === 'execute_input') {
8475
+ void (0,_VariableInspector__WEBPACK_IMPORTED_MODULE_3__.fetchVariablesAndUpdateState)(notebookPanel, this.updateNotebookVariables.bind(this, notebookPanel.id));
8476
+ const updatedFiles = await (0,_FileInspector__WEBPACK_IMPORTED_MODULE_2__.getFiles)(app, notebookPanel);
8477
+ this.updateNotebookFiles(notebookPanel.id, updatedFiles);
8478
+ }
8479
+ });
8480
+ };
8481
+ this.notebookTracker = notebookTracker;
8482
+ // Setup the kernel listener to update context as kernel messages are received
8483
+ this.setupKernelListener(app, notebookTracker);
8484
+ }
8485
+ getNotebookContext(notebookId) {
8486
+ return this.notebookContexts.get(notebookId);
8487
+ }
8488
+ getActiveNotebookContext() {
8489
+ const activeNotebook = this.notebookTracker.currentWidget;
8490
+ if (!activeNotebook)
8491
+ return undefined;
8492
+ return this.getNotebookContext(activeNotebook.id);
8493
+ }
8494
+ updateNotebookVariables(notebookID, variables) {
8495
+ const context = this.notebookContexts.get(notebookID) || { variables: [], files: [] };
8496
+ context.variables = variables;
8497
+ this.notebookContexts.set(notebookID, context);
8498
+ }
8499
+ updateNotebookFiles(notebookID, files) {
8500
+ const context = this.notebookContexts.get(notebookID) || { variables: [], files: [] };
8501
+ context.files = files;
8502
+ this.notebookContexts.set(notebookID, context);
8503
+ }
8504
+ // Setup kernel execution listener
8505
+ setupKernelListener(app, notebookTracker) {
8506
+ // Start the kernel listener for the currently active notebook
8507
+ const notebookPanel = notebookTracker.currentWidget;
8508
+ void this._startKernelListener(app, notebookPanel);
8509
+ // Update the kernel listener whenever the active notebook changes
8510
+ notebookTracker.currentChanged.connect(async (_, notebookPanel) => {
8511
+ void this._startKernelListener(app, notebookPanel);
8512
+ });
8513
+ }
8514
+ }
8515
+ const ContextManagerPlugin = {
8516
+ id: 'mito-ai:context-manager',
8517
+ autoStart: true,
8518
+ requires: [_jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__.INotebookTracker],
8519
+ provides: IContextManager,
8520
+ activate: (app, notebookTracker) => {
8521
+ console.log("mito-ai: ContextManagerPlugin activated");
8522
+ return new ContextManager(app, notebookTracker);
8523
+ }
8524
+ };
8525
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ContextManagerPlugin);
8526
+
8527
+
8528
+ /***/ }),
8529
+
8530
+ /***/ "./lib/Extensions/ContextManager/FileInspector.js":
8531
+ /*!********************************************************!*\
8532
+ !*** ./lib/Extensions/ContextManager/FileInspector.js ***!
8533
+ \********************************************************/
8534
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8535
+
8536
+ __webpack_require__.r(__webpack_exports__);
8537
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8538
+ /* harmony export */ getFiles: () => (/* binding */ getFiles)
8539
+ /* harmony export */ });
8540
+ /* harmony import */ var _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/coreutils */ "webpack/sharing/consume/default/@jupyterlab/coreutils");
8541
+ /* harmony import */ var _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_0__);
8542
+ /*
8543
+ * Copyright (c) Saga Inc.
8544
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
8545
+ */
8546
+
8547
+ /*
8548
+ Fetches all files in the current directory and updates the state of the files.
8549
+ */
8550
+ const getFiles = async (app, notebookPanel) => {
8551
+ const fileManager = app.serviceManager.contents;
8552
+ const relativeNotebookPath = notebookPanel.context.path;
8553
+ const relativeDirectoryPath = _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_0__.PathExt.dirname(relativeNotebookPath);
8554
+ try {
8555
+ const contents = await fileManager.get(relativeDirectoryPath);
8556
+ if (contents.type === 'directory') {
8557
+ // Filter for only csv and Excel files
8558
+ const data_files = contents.content.filter((file) => {
8559
+ var _a;
8560
+ const extension = (_a = file.name.split('.').pop()) === null || _a === void 0 ? void 0 : _a.toLowerCase();
8561
+ return extension === 'csv' ||
8562
+ extension === 'xlsx' ||
8563
+ extension === 'xls' ||
8564
+ extension === 'xlsm';
8565
+ });
8566
+ // Map the files to the File type
8567
+ const files = data_files.map((file) => ({
8568
+ file_name: file.name
8569
+ }));
8570
+ // Update the state of the files
8571
+ return files;
8572
+ }
8573
+ else {
8574
+ // If the contents are not a directory, set the files to an empty array
8575
+ return [];
8576
+ }
8577
+ }
8578
+ catch (error) {
8579
+ console.error('Error listing directory contents:', error);
8580
+ return [];
8581
+ }
7491
8582
  };
7492
8583
 
7493
8584
 
@@ -7574,6 +8665,10 @@ def structured_globals():
7574
8665
  if is_from_mitosheet(v):
7575
8666
  continue
7576
8667
 
8668
+ if k.startswith("scratch_"):
8669
+ # Skip scratchpad variables the agent creates
8670
+ continue
8671
+
7577
8672
  if not k.startswith("_") and k not in ("In", "Out", "json") and not callable(v):
7578
8673
 
7579
8674
  if _is_pandas_imported and isinstance(v, pd.DataFrame):
@@ -10405,6 +11500,7 @@ __webpack_require__.r(__webpack_exports__);
10405
11500
  /* harmony export */ COMMAND_MITO_AI_BETA_MODE_ENABLED: () => (/* binding */ COMMAND_MITO_AI_BETA_MODE_ENABLED),
10406
11501
  /* harmony export */ COMMAND_MITO_AI_CELL_TOOLBAR_ACCEPT_CODE: () => (/* binding */ COMMAND_MITO_AI_CELL_TOOLBAR_ACCEPT_CODE),
10407
11502
  /* harmony export */ COMMAND_MITO_AI_CELL_TOOLBAR_REJECT_CODE: () => (/* binding */ COMMAND_MITO_AI_CELL_TOOLBAR_REJECT_CODE),
11503
+ /* harmony export */ COMMAND_MITO_AI_OPEN_CHART_WIZARD: () => (/* binding */ COMMAND_MITO_AI_OPEN_CHART_WIZARD),
10408
11504
  /* harmony export */ COMMAND_MITO_AI_OPEN_CHAT: () => (/* binding */ COMMAND_MITO_AI_OPEN_CHAT),
10409
11505
  /* harmony export */ COMMAND_MITO_AI_PREVIEW_AS_STREAMLIT: () => (/* binding */ COMMAND_MITO_AI_PREVIEW_AS_STREAMLIT),
10410
11506
  /* harmony export */ COMMAND_MITO_AI_PREVIEW_LATEST_CODE: () => (/* binding */ COMMAND_MITO_AI_PREVIEW_LATEST_CODE),
@@ -10437,6 +11533,8 @@ const COMMAND_MITO_AI_CELL_TOOLBAR_REJECT_CODE = `toolbar-button:reject-code`;
10437
11533
  const COMMAND_MITO_AI_BETA_MODE_ENABLED = `${MITO_AI}:beta-mode-enabled`;
10438
11534
  // Streamlit commands
10439
11535
  const COMMAND_MITO_AI_PREVIEW_AS_STREAMLIT = 'mito-ai:preview-as-streamlit';
11536
+ // Chart Wizard commands
11537
+ const COMMAND_MITO_AI_OPEN_CHART_WIZARD = 'mito-ai:open-chart-wizard';
10440
11538
 
10441
11539
 
10442
11540
  /***/ }),
@@ -10478,6 +11576,70 @@ const AgentComponentHeader = ({ icon, text, onClick, isExpanded, displayBorder =
10478
11576
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AgentComponentHeader);
10479
11577
 
10480
11578
 
11579
+ /***/ }),
11580
+
11581
+ /***/ "./lib/components/AgentComponents/AskUserQuestionToolUI.js":
11582
+ /*!*****************************************************************!*\
11583
+ !*** ./lib/components/AgentComponents/AskUserQuestionToolUI.js ***!
11584
+ \*****************************************************************/
11585
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
11586
+
11587
+ __webpack_require__.r(__webpack_exports__);
11588
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
11589
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
11590
+ /* harmony export */ });
11591
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
11592
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
11593
+ /* harmony import */ var _utils_classNames__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/classNames */ "./lib/utils/classNames.js");
11594
+ /* harmony import */ var _style_AgentToolUIComponent_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../style/AgentToolUIComponent.css */ "./style/AgentToolUIComponent.css");
11595
+ /* harmony import */ var _style_AskUserQuestionToolUI_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../style/AskUserQuestionToolUI.css */ "./style/AskUserQuestionToolUI.css");
11596
+ /* harmony import */ var _icons_QuestionIcon__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../icons/QuestionIcon */ "./lib/icons/QuestionIcon.js");
11597
+ /* harmony import */ var _AgentComponentHeader__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./AgentComponentHeader */ "./lib/components/AgentComponents/AgentComponentHeader.js");
11598
+ /*
11599
+ * Copyright (c) Saga Inc.
11600
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
11601
+ */
11602
+
11603
+
11604
+
11605
+
11606
+
11607
+
11608
+ const AskUserQuestionToolUI = ({ question, answers, onAnswerSelected, isLastMessage = false, }) => {
11609
+ const [isExpanded, setIsExpanded] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
11610
+ const cleanedAnswers = answers === null || answers === void 0 ? void 0 : answers.filter(answer => answer.trim() !== '');
11611
+ const handleAnswerClick = (answer) => {
11612
+ if (onAnswerSelected) {
11613
+ onAnswerSelected(answer);
11614
+ }
11615
+ };
11616
+ if (question.trim() === '') {
11617
+ return null;
11618
+ }
11619
+ // Collapsed mode: show as expandable item like Cell Updates
11620
+ if (!isLastMessage) {
11621
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: (0,_utils_classNames__WEBPACK_IMPORTED_MODULE_3__.classNames)('ask-user-question-collapsed', { expanded: isExpanded }) },
11622
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_AgentComponentHeader__WEBPACK_IMPORTED_MODULE_4__["default"], { icon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_QuestionIcon__WEBPACK_IMPORTED_MODULE_5__["default"], null), text: question, onClick: () => setIsExpanded(!isExpanded), isExpanded: isExpanded, displayBorder: true }),
11623
+ isExpanded && cleanedAnswers && cleanedAnswers.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "ask-user-question-expanded-content" },
11624
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("ul", { className: "ask-user-question-collapsed-answers" }, cleanedAnswers.map((answer, index) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("li", { key: index }, answer))))))));
11625
+ }
11626
+ // Active mode: show interactive UI with clickable buttons and purple glow
11627
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: (0,_utils_classNames__WEBPACK_IMPORTED_MODULE_3__.classNames)('agent-tool-ui-container', 'ask-user-question-container', 'ask-user-question-active') },
11628
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "agent-tool-ui-content" },
11629
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "ask-user-question-pill" },
11630
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_QuestionIcon__WEBPACK_IMPORTED_MODULE_5__["default"], null),
11631
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "ask-user-question-pill-text" }, "User Question")),
11632
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "ask-user-question-content" },
11633
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "ask-user-question-question" }, question),
11634
+ cleanedAnswers && cleanedAnswers.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "ask-user-question-answers" }, cleanedAnswers.map((answer, index) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { key: index, className: "ask-user-question-answer-button", onClick: () => handleAnswerClick(answer), title: answer },
11635
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("svg", { className: "ask-user-question-radio-icon", width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
11636
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("circle", { cx: "8", cy: "8", r: "7", stroke: "currentColor", strokeWidth: "1.5", fill: "none" })),
11637
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "ask-user-question-answer-text" }, answer)))))),
11638
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "ask-user-question-subtext" }, cleanedAnswers && cleanedAnswers.length > 0 ? 'Or respond in the Chat Input below' : 'Respond in the Chat Input below')))));
11639
+ };
11640
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AskUserQuestionToolUI);
11641
+
11642
+
10481
11643
  /***/ }),
10482
11644
 
10483
11645
  /***/ "./lib/components/AgentComponents/AssumptionToolUI.js":
@@ -10734,6 +11896,55 @@ const RunAllCellsToolUI = ({ inErrorFixup }) => {
10734
11896
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (RunAllCellsToolUI);
10735
11897
 
10736
11898
 
11899
+ /***/ }),
11900
+
11901
+ /***/ "./lib/components/AgentComponents/ScratchpadToolUI.js":
11902
+ /*!************************************************************!*\
11903
+ !*** ./lib/components/AgentComponents/ScratchpadToolUI.js ***!
11904
+ \************************************************************/
11905
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
11906
+
11907
+ __webpack_require__.r(__webpack_exports__);
11908
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
11909
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
11910
+ /* harmony export */ });
11911
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
11912
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
11913
+ /* harmony import */ var _utils_classNames__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../utils/classNames */ "./lib/utils/classNames.js");
11914
+ /* harmony import */ var _style_AgentToolUIComponent_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../style/AgentToolUIComponent.css */ "./style/AgentToolUIComponent.css");
11915
+ /* harmony import */ var _style_AgentComponentHeader_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../style/AgentComponentHeader.css */ "./style/AgentComponentHeader.css");
11916
+ /* harmony import */ var _style_CodeBlock_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../style/CodeBlock.css */ "./style/CodeBlock.css");
11917
+ /* harmony import */ var _AgentComponentHeader__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./AgentComponentHeader */ "./lib/components/AgentComponents/AgentComponentHeader.js");
11918
+ /* harmony import */ var _icons_NotepadIcon__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../icons/NotepadIcon */ "./lib/icons/NotepadIcon.js");
11919
+ /* harmony import */ var _Extensions_AiChat_ChatMessage_PythonCode__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../Extensions/AiChat/ChatMessage/PythonCode */ "./lib/Extensions/AiChat/ChatMessage/PythonCode.js");
11920
+ /*
11921
+ * Copyright (c) Saga Inc.
11922
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
11923
+ */
11924
+
11925
+
11926
+
11927
+
11928
+
11929
+
11930
+
11931
+
11932
+ const ScratchpadToolUI = ({ scratchpadCode, scratchpadSummary, scratchpadResult, renderMimeRegistry, }) => {
11933
+ const [isExpanded, setIsExpanded] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
11934
+ if (!scratchpadCode || scratchpadCode.trim() === '') {
11935
+ return null;
11936
+ }
11937
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: (0,_utils_classNames__WEBPACK_IMPORTED_MODULE_4__.classNames)('code-block-container', 'agent-mode', {
11938
+ 'agent-mode-collapsed': !isExpanded,
11939
+ }) },
11940
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_AgentComponentHeader__WEBPACK_IMPORTED_MODULE_5__["default"], { icon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_NotepadIcon__WEBPACK_IMPORTED_MODULE_6__["default"], null), text: scratchpadSummary || "Exploration code", onClick: () => setIsExpanded(!isExpanded), isExpanded: isExpanded, displayBorder: true }),
11941
+ isExpanded && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
11942
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Extensions_AiChat_ChatMessage_PythonCode__WEBPACK_IMPORTED_MODULE_7__["default"], { code: scratchpadCode, renderMimeRegistry: renderMimeRegistry }),
11943
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "scratchpad-result" }, scratchpadResult ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("pre", null, scratchpadResult)) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("pre", { className: "scratchpad-result-warning" }, "Scratchpad results not available for display")))))));
11944
+ };
11945
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ScratchpadToolUI);
11946
+
11947
+
10737
11948
  /***/ }),
10738
11949
 
10739
11950
  /***/ "./lib/components/AgentComponents/ShimmerWrapper.js":
@@ -12652,6 +13863,34 @@ const TextIcon = () => (react__WEBPACK_IMPORTED_MODULE_0___default().createEleme
12652
13863
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TextIcon);
12653
13864
 
12654
13865
 
13866
+ /***/ }),
13867
+
13868
+ /***/ "./lib/icons/NotepadIcon.js":
13869
+ /*!**********************************!*\
13870
+ !*** ./lib/icons/NotepadIcon.js ***!
13871
+ \**********************************/
13872
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
13873
+
13874
+ __webpack_require__.r(__webpack_exports__);
13875
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
13876
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
13877
+ /* harmony export */ });
13878
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
13879
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
13880
+ /*
13881
+ * Copyright (c) Saga Inc.
13882
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
13883
+ */
13884
+
13885
+ const NotepadIcon = () => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("svg", { width: "14", height: "14", viewBox: "0 0 100 100", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
13886
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("rect", { x: "18", y: "18", width: "64", height: "72", rx: "8", ry: "8", fill: "none", stroke: "currentColor", strokeWidth: "4", strokeLinecap: "round", strokeLinejoin: "round", opacity: "0.3" }),
13887
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("rect", { x: "10", y: "10", width: "64", height: "72", rx: "8", ry: "8", fill: "none", stroke: "currentColor", strokeWidth: "4", strokeLinecap: "round", strokeLinejoin: "round" }),
13888
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("line", { x1: "24", y1: "35", x2: "60", y2: "35", stroke: "currentColor", strokeWidth: "4", strokeLinecap: "round" }),
13889
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("line", { x1: "24", y1: "48", x2: "60", y2: "48", stroke: "currentColor", strokeWidth: "4", strokeLinecap: "round" }),
13890
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("line", { x1: "24", y1: "61", x2: "60", y2: "61", stroke: "currentColor", strokeWidth: "4", strokeLinecap: "round" })));
13891
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (NotepadIcon);
13892
+
13893
+
12655
13894
  /***/ }),
12656
13895
 
12657
13896
  /***/ "./lib/icons/NucleausIcon.js":
@@ -12780,6 +14019,32 @@ const PlayButtonIcon = () => (react__WEBPACK_IMPORTED_MODULE_0___default().creat
12780
14019
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (PlayButtonIcon);
12781
14020
 
12782
14021
 
14022
+ /***/ }),
14023
+
14024
+ /***/ "./lib/icons/QuestionIcon.js":
14025
+ /*!***********************************!*\
14026
+ !*** ./lib/icons/QuestionIcon.js ***!
14027
+ \***********************************/
14028
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
14029
+
14030
+ __webpack_require__.r(__webpack_exports__);
14031
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
14032
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
14033
+ /* harmony export */ });
14034
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
14035
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
14036
+ /*
14037
+ * Copyright (c) Saga Inc.
14038
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
14039
+ */
14040
+
14041
+ const QuestionIcon = () => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("svg", { width: "14", height: "14", viewBox: "0 0 15 15", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
14042
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("path", { d: "M7.50018 11.5909C7.87674 11.5909 8.182 11.2856 8.182 10.9091C8.182 10.5325 7.87674 10.2273 7.50018 10.2273C7.12362 10.2273 6.81836 10.5325 6.81836 10.9091C6.81836 11.2856 7.12362 11.5909 7.50018 11.5909Z", fill: "currentColor" }),
14043
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M7.74299 5.15462C7.41191 5.16915 7.23537 5.30235 7.17425 5.4322C7.0139 5.77291 6.60771 5.91912 6.267 5.75877C5.92629 5.59841 5.78008 5.19222 5.94044 4.85151C6.29647 4.09503 7.06347 3.81949 7.6832 3.79229C8.27933 3.76613 9.02119 3.95601 9.43162 4.49121C9.74745 4.90306 9.92489 5.42514 9.85323 5.97406C9.78058 6.53067 9.46309 7.02995 8.94794 7.40893C8.26004 7.91501 8.26125 8.17321 8.26143 8.21081C8.26143 8.21136 8.26144 8.21186 8.26144 8.21232C8.26144 8.58887 7.95618 8.89413 7.57962 8.89413C7.20306 8.89413 6.8978 8.58887 6.8978 8.21232C6.8978 7.56001 7.27722 6.94514 8.13987 6.31051C8.40503 6.11545 8.48394 5.92881 8.50107 5.79756C8.5192 5.65864 8.47982 5.49093 8.34953 5.32102C8.34036 5.30907 8.29056 5.25933 8.16587 5.21452C8.04681 5.17174 7.8971 5.14785 7.74299 5.15462Z", fill: "currentColor" }),
14044
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("path", { d: "M7.5 15C3.34091 15 0 11.6591 0 7.5C0 3.34091 3.34091 0 7.5 0C11.6591 0 15 3.34091 15 7.5C15 11.6591 11.6591 15 7.5 15ZM7.5 1.36364C4.09091 1.36364 1.36364 4.09091 1.36364 7.5C1.36364 10.9091 4.09091 13.6364 7.5 13.6364C10.9091 13.6364 13.6364 10.9091 13.6364 7.5C13.6364 4.09091 10.9091 1.36364 7.5 1.36364Z", fill: "currentColor" })));
14045
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (QuestionIcon);
14046
+
14047
+
12783
14048
  /***/ }),
12784
14049
 
12785
14050
  /***/ "./lib/icons/RejectIcon.js":
@@ -13056,6 +14321,7 @@ __webpack_require__.r(__webpack_exports__);
13056
14321
  /* harmony import */ var _Extensions_NotebookFooter__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Extensions/NotebookFooter */ "./lib/Extensions/NotebookFooter/index.js");
13057
14322
  /* harmony import */ var _Extensions_MitoThemeLight__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Extensions/MitoThemeLight */ "./lib/Extensions/MitoThemeLight/index.js");
13058
14323
  /* harmony import */ var _Extensions_AppManager_ManageAppsPlugin__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Extensions/AppManager/ManageAppsPlugin */ "./lib/Extensions/AppManager/ManageAppsPlugin.js");
14324
+ /* harmony import */ var _Extensions_ChartWizard_ChartWizardPlugin__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Extensions/ChartWizard/ChartWizardPlugin */ "./lib/Extensions/ChartWizard/ChartWizardPlugin.js");
13059
14325
  /*
13060
14326
  * Copyright (c) Saga Inc.
13061
14327
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -13073,6 +14339,7 @@ __webpack_require__.r(__webpack_exports__);
13073
14339
 
13074
14340
 
13075
14341
 
14342
+
13076
14343
  // This is the main entry point to the mito-ai extension. It must export all of the top level
13077
14344
  // extensions that we want to load.
13078
14345
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ([
@@ -13088,7 +14355,8 @@ __webpack_require__.r(__webpack_exports__);
13088
14355
  _Extensions_VersionCheck__WEBPACK_IMPORTED_MODULE_9__.versionCheckPlugin,
13089
14356
  _Extensions_NotebookFooter__WEBPACK_IMPORTED_MODULE_10__["default"],
13090
14357
  _Extensions_AppManager_ManageAppsPlugin__WEBPACK_IMPORTED_MODULE_11__["default"],
13091
- _Extensions_MitoThemeLight__WEBPACK_IMPORTED_MODULE_12__["default"]
14358
+ _Extensions_MitoThemeLight__WEBPACK_IMPORTED_MODULE_12__["default"],
14359
+ _Extensions_ChartWizard_ChartWizardPlugin__WEBPACK_IMPORTED_MODULE_13__["default"]
13092
14360
  ]);
13093
14361
 
13094
14362
 
@@ -13102,6 +14370,7 @@ __webpack_require__.r(__webpack_exports__);
13102
14370
 
13103
14371
  __webpack_require__.r(__webpack_exports__);
13104
14372
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
14373
+ /* harmony export */ convertChartCode: () => (/* binding */ convertChartCode),
13105
14374
  /* harmony export */ getChatHistoryThread: () => (/* binding */ getChatHistoryThread),
13106
14375
  /* harmony export */ getChatHistoryThreads: () => (/* binding */ getChatHistoryThreads),
13107
14376
  /* harmony export */ getDatabaseConnections: () => (/* binding */ getDatabaseConnections),
@@ -13259,6 +14528,21 @@ const setUserKey = async (key, value) => {
13259
14528
  }
13260
14529
  return resp.data || '';
13261
14530
  };
14531
+ /************************************
14532
+
14533
+ CHART WIZARD ENDPOINTS
14534
+
14535
+ ************************************/
14536
+ const convertChartCode = async (code) => {
14537
+ const resp = await (0,_utils__WEBPACK_IMPORTED_MODULE_0__.requestAPI)('chart-wizard', {
14538
+ method: 'POST',
14539
+ body: JSON.stringify({ code }),
14540
+ });
14541
+ if (resp.error) {
14542
+ throw new Error(resp.error.message);
14543
+ }
14544
+ return resp.data;
14545
+ };
13262
14546
  const getChatHistoryThreads = async () => {
13263
14547
  var _a;
13264
14548
  const resp = await (0,_utils__WEBPACK_IMPORTED_MODULE_0__.requestAPI)('chat-history/threads');
@@ -13507,6 +14791,12 @@ const retryIfExecutionError = async (notebookPanel, app, sendAgentSmartDebugMess
13507
14791
  console.log('Error after running all cells:', result.errorMessage);
13508
14792
  }
13509
14793
  }
14794
+ else if (agentResponse.type === 'ask_user_question' || agentResponse.type === 'finished_task') {
14795
+ // When the agent asks a question during error retry, we should stop the agent execution
14796
+ // and wait for the user's response, just like in the main execution loop
14797
+ await markAgentForStopping();
14798
+ return 'interupted';
14799
+ }
13510
14800
  else {
13511
14801
  // Agent responded with an unexpected type for error fixing
13512
14802
  return 'failure';
@@ -13977,24 +15267,62 @@ const processChatHistoryForErrorGrouping = (displayOptimizedChatHistory) => {
13977
15267
  const processedDisplayOptimizedChatHistory = [];
13978
15268
  let groupedErrorMessages = [];
13979
15269
  for (let i = 0; i < displayOptimizedChatHistory.length; i++) {
13980
- const displayOptimizedChatItem = displayOptimizedChatHistory[i];
15270
+ let displayOptimizedChatItem = displayOptimizedChatHistory[i];
13981
15271
  if (!displayOptimizedChatItem) {
13982
15272
  continue;
13983
15273
  }
15274
+ // Associate scratchpad results with their corresponding scratchpad tool calls
15275
+ // The scratchpad result is stored in the next message (the user message that follows the AI's scratchpad response)
15276
+ if (((_a = displayOptimizedChatItem.agentResponse) === null || _a === void 0 ? void 0 : _a.type) === 'scratchpad') {
15277
+ const nextIndex = i + 1;
15278
+ if (nextIndex < displayOptimizedChatHistory.length) {
15279
+ const nextItem = displayOptimizedChatHistory[nextIndex];
15280
+ if (nextItem === null || nextItem === void 0 ? void 0 : nextItem.scratchpadResult) {
15281
+ displayOptimizedChatItem = {
15282
+ ...displayOptimizedChatItem,
15283
+ scratchpadResult: nextItem.scratchpadResult
15284
+ };
15285
+ }
15286
+ }
15287
+ }
13984
15288
  const messageContent = (0,_strings__WEBPACK_IMPORTED_MODULE_0__.getContentStringFromMessage)(displayOptimizedChatItem.message);
13985
15289
  const _isErrorFixupMessage = (0,_errors__WEBPACK_IMPORTED_MODULE_1__.isErrorFixupMessage)(displayOptimizedChatItem.promptType, displayOptimizedChatItem.message, messageContent);
13986
15290
  if (_isErrorFixupMessage) {
13987
- // If the current message is an error fixup message, we need to group it with the next message
13988
- // which is the ai response to the error fixup message.
15291
+ // If the current message is an error fixup message, we add it to the current group.
15292
+ // This allows consecutive error/cell_update cycles to be grouped together, which
15293
+ // results in a collapsed UI that keeps the error-fixing flow out of the way for users.
15294
+ // For example: [error1, cellUpdate1, error2, askUserQuestion] →
15295
+ // [[error1, cellUpdate1, error2], askUserQuestion]
15296
+ // All the error-fixing is grouped together, and askUserQuestion displays separately with its UI.
13989
15297
  groupedErrorMessages.push(displayOptimizedChatItem);
13990
15298
  // Note: We check that the next message is an ai response to the error fixup message.
13991
15299
  // If the user has stopped the agent, it might not be an ai response to the error fixup message.
13992
15300
  const next_index = i + 1;
15301
+ const nextItem = displayOptimizedChatHistory[next_index];
13993
15302
  if (next_index < displayOptimizedChatHistory.length &&
13994
- ((_a = displayOptimizedChatHistory[next_index]) === null || _a === void 0 ? void 0 : _a.type) === 'openai message' &&
13995
- ((_b = displayOptimizedChatHistory[next_index]) === null || _b === void 0 ? void 0 : _b.message.role) === 'assistant') {
13996
- groupedErrorMessages.push(displayOptimizedChatHistory[next_index]);
13997
- i = next_index;
15303
+ (nextItem === null || nextItem === void 0 ? void 0 : nextItem.type) === 'openai message' &&
15304
+ (nextItem === null || nextItem === void 0 ? void 0 : nextItem.message.role) === 'assistant') {
15305
+ // Only group if the agent response is cell_update or run_all_cells.
15306
+ // Other types (finished_task, ask_user_question) should be displayed normally
15307
+ // with their UI components, not grouped with the error message.
15308
+ const agentResponseType = (_b = nextItem.agentResponse) === null || _b === void 0 ? void 0 : _b.type;
15309
+ if (agentResponseType === 'cell_update' || agentResponseType === 'run_all_cells') {
15310
+ groupedErrorMessages.push(nextItem);
15311
+ i = next_index;
15312
+ }
15313
+ else {
15314
+ // Don't group - push the error message as a standalone item and let the next message
15315
+ // be displayed normally with its UI component (finished_task, ask_user_question, etc.)
15316
+ processedDisplayOptimizedChatHistory.push(groupedErrorMessages);
15317
+ groupedErrorMessages = new Array();
15318
+ // Continue to next iteration - don't skip the next item, let it be processed normally
15319
+ }
15320
+ }
15321
+ else {
15322
+ // No next message or next message is not an assistant message
15323
+ // Push the error message as a standalone item
15324
+ processedDisplayOptimizedChatHistory.push(groupedErrorMessages);
15325
+ groupedErrorMessages = new Array();
13998
15326
  }
13999
15327
  }
14000
15328
  else {
@@ -15208,6 +16536,143 @@ const getNotebookIDAndSetIfNonexistant = (notebookPanel) => {
15208
16536
  };
15209
16537
 
15210
16538
 
16539
+ /***/ }),
16540
+
16541
+ /***/ "./lib/utils/scratchpadExecution.js":
16542
+ /*!******************************************!*\
16543
+ !*** ./lib/utils/scratchpadExecution.js ***!
16544
+ \******************************************/
16545
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
16546
+
16547
+ __webpack_require__.r(__webpack_exports__);
16548
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
16549
+ /* harmony export */ executeScratchpadCode: () => (/* binding */ executeScratchpadCode),
16550
+ /* harmony export */ formatScratchpadResult: () => (/* binding */ formatScratchpadResult)
16551
+ /* harmony export */ });
16552
+ /* harmony import */ var _jupyterlab_services__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/services */ "webpack/sharing/consume/default/@jupyterlab/services");
16553
+ /* harmony import */ var _jupyterlab_services__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_services__WEBPACK_IMPORTED_MODULE_0__);
16554
+ /* harmony import */ var _Extensions_ErrorMimeRenderer_errorUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Extensions/ErrorMimeRenderer/errorUtils */ "./lib/Extensions/ErrorMimeRenderer/errorUtils.js");
16555
+ /*
16556
+ * Copyright (c) Saga Inc.
16557
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
16558
+ */
16559
+
16560
+
16561
+ /**
16562
+ * Executes Python code silently in the kernel and captures the output.
16563
+ * This is used for scratchpad exploration work that shouldn't leave code in the notebook.
16564
+ *
16565
+ * @param notebookPanel - The notebook panel containing the kernel
16566
+ * @param code - The Python code to execute
16567
+ * @returns Promise resolving to the execution result with stdout, stderr, and any errors
16568
+ */
16569
+ async function executeScratchpadCode(notebookPanel, code) {
16570
+ var _a;
16571
+ const kernel = (_a = notebookPanel.context.sessionContext.session) === null || _a === void 0 ? void 0 : _a.kernel;
16572
+ if (!kernel) {
16573
+ return {
16574
+ success: false,
16575
+ stdout: '',
16576
+ stderr: '',
16577
+ error: 'No kernel available'
16578
+ };
16579
+ }
16580
+ return new Promise((resolve) => {
16581
+ let stdout = '';
16582
+ let stderr = '';
16583
+ let errorMessage = undefined;
16584
+ let traceback = undefined;
16585
+ let hasError = false;
16586
+ // Request the kernel to execute the code silently
16587
+ const future = kernel.requestExecute({
16588
+ code: code,
16589
+ // Adding silent: true prevents an execute_input message from being sent
16590
+ silent: true
16591
+ });
16592
+ // Listen for output from the kernel
16593
+ future.onIOPub = (msg) => {
16594
+ // Handle stream messages (stdout/stderr)
16595
+ if (_jupyterlab_services__WEBPACK_IMPORTED_MODULE_0__.KernelMessage.isStreamMsg(msg)) {
16596
+ if (msg.content.name === 'stdout') {
16597
+ // Accumulate stdout output (may come in chunks)
16598
+ stdout += msg.content.text;
16599
+ }
16600
+ else if (msg.content.name === 'stderr') {
16601
+ // Accumulate stderr output (may come in chunks)
16602
+ stderr += msg.content.text;
16603
+ }
16604
+ }
16605
+ // Handle error messages
16606
+ else if (msg.header.msg_type === 'error') {
16607
+ hasError = true;
16608
+ const errorContent = msg.content;
16609
+ errorMessage = errorContent.ename + ': ' + errorContent.evalue;
16610
+ // Extract traceback if available
16611
+ if (errorContent.traceback && Array.isArray(errorContent.traceback)) {
16612
+ traceback = (0,_Extensions_ErrorMimeRenderer_errorUtils__WEBPACK_IMPORTED_MODULE_1__.getFullErrorMessageFromTraceback)(errorContent.traceback);
16613
+ }
16614
+ else if (errorContent.traceback) {
16615
+ traceback = String(errorContent.traceback);
16616
+ }
16617
+ }
16618
+ };
16619
+ // Handle execution completion
16620
+ future.done.then(() => {
16621
+ resolve({
16622
+ success: !hasError,
16623
+ stdout: stdout.trim(),
16624
+ stderr: stderr.trim(),
16625
+ error: errorMessage,
16626
+ traceback: traceback
16627
+ });
16628
+ }).catch((error) => {
16629
+ // Handle execution failure
16630
+ resolve({
16631
+ success: false,
16632
+ stdout: stdout.trim(),
16633
+ stderr: stderr.trim(),
16634
+ error: error.message || 'Execution failed',
16635
+ traceback: error.stack
16636
+ });
16637
+ });
16638
+ });
16639
+ }
16640
+ /**
16641
+ * Formats a scratchpad execution result into a string message for the agent.
16642
+ * Handles both success and error cases, formatting stdout, stderr, errors, and tracebacks.
16643
+ *
16644
+ * @param scratchpadResult - The result from executing scratchpad code
16645
+ * @returns Formatted string message containing the execution results
16646
+ */
16647
+ function formatScratchpadResult(scratchpadResult) {
16648
+ let resultMessage = '';
16649
+ if (scratchpadResult.success) {
16650
+ if (scratchpadResult.stdout) {
16651
+ resultMessage += scratchpadResult.stdout;
16652
+ }
16653
+ if (scratchpadResult.stderr) {
16654
+ resultMessage += (resultMessage ? '\n' : '') + `[stderr]\n${scratchpadResult.stderr}`;
16655
+ }
16656
+ }
16657
+ else {
16658
+ resultMessage += '[Execution Error]\n';
16659
+ if (scratchpadResult.error) {
16660
+ resultMessage += `${scratchpadResult.error}\n`;
16661
+ }
16662
+ if (scratchpadResult.traceback) {
16663
+ resultMessage += `\n${scratchpadResult.traceback}`;
16664
+ }
16665
+ if (scratchpadResult.stdout) {
16666
+ resultMessage += `\n[stdout before error]\n${scratchpadResult.stdout}`;
16667
+ }
16668
+ if (scratchpadResult.stderr) {
16669
+ resultMessage += `\n[stderr]\n${scratchpadResult.stderr}`;
16670
+ }
16671
+ }
16672
+ return resultMessage;
16673
+ }
16674
+
16675
+
15211
16676
  /***/ }),
15212
16677
 
15213
16678
  /***/ "./lib/utils/scroll.js":
@@ -16640,6 +18105,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
16640
18105
 
16641
18106
  .agent-component-header:hover {
16642
18107
  background-color: var(--jp-layout-color3);
18108
+ opacity: 0.75;
16643
18109
  }
16644
18110
 
16645
18111
  .agent-component-header.no-border {
@@ -16650,6 +18116,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
16650
18116
  border: none;
16651
18117
  border-radius: 5px 5px 0 0;
16652
18118
  background-color: var(--jp-layout-color2);
18119
+ opacity: 0.85;
16653
18120
  }
16654
18121
 
16655
18122
  .agent-component-header.error-fixup {
@@ -16706,7 +18173,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
16706
18173
 
16707
18174
  .agent-component-header-expand-icon.expanded {
16708
18175
  transform: rotate(90deg);
16709
- } `, "",{"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,aAAa;IACb,mBAAmB;IACnB,QAAQ;IACR,cAAc;AAClB;;AAEA;IACI,aAAa;IACb,mBAAmB;IACnB,uBAAuB;IACvB,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,uBAAuB;IACvB,eAAe;IACf,kBAAkB;IAClB,+BAA+B;IAC/B,yDAAyD;IACzD,UAAU;AACd;;AAEA;IACI,yCAAyC;IACzC,+BAA+B;AACnC;;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-actions {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-shrink: 0;\n}\n\n.agent-component-header-action-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border: none;\n background: transparent;\n cursor: pointer;\n border-radius: 4px;\n color: var(--jp-ui-font-color2);\n transition: background-color 0.15s ease, color 0.15s ease;\n padding: 0;\n}\n\n.agent-component-header-action-button:hover {\n background-color: var(--jp-layout-color3);\n color: var(--jp-ui-font-color1);\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":""}]);
18176
+ } `, "",{"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;IACzC,aAAa;AACjB;;AAEA;IACI,YAAY;AAChB;;AAEA;IACI,YAAY;IACZ,0BAA0B;IAC1B,yCAAyC;IACzC,aAAa;AACjB;;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,aAAa;IACb,mBAAmB;IACnB,QAAQ;IACR,cAAc;AAClB;;AAEA;IACI,aAAa;IACb,mBAAmB;IACnB,uBAAuB;IACvB,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,uBAAuB;IACvB,eAAe;IACf,kBAAkB;IAClB,+BAA+B;IAC/B,yDAAyD;IACzD,UAAU;AACd;;AAEA;IACI,yCAAyC;IACzC,+BAA+B;AACnC;;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 opacity: 0.75;\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 opacity: 0.85;\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-actions {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-shrink: 0;\n}\n\n.agent-component-header-action-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border: none;\n background: transparent;\n cursor: pointer;\n border-radius: 4px;\n color: var(--jp-ui-font-color2);\n transition: background-color 0.15s ease, color 0.15s ease;\n padding: 0;\n}\n\n.agent-component-header-action-button:hover {\n background-color: var(--jp-layout-color3);\n color: var(--jp-ui-font-color1);\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":""}]);
16710
18177
  // Exports
16711
18178
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
16712
18179
 
@@ -17146,51 +18613,279 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
17146
18613
  margin-right: 6px;
17147
18614
  }
17148
18615
 
17149
- .app-item-status-text {
17150
- color: var(--jp-ui-font-color2);
17151
- font-size: 12px;
18616
+ .app-item-status-text {
18617
+ color: var(--jp-ui-font-color2);
18618
+ font-size: 12px;
18619
+ }
18620
+
18621
+ .app-item-last-deployed {
18622
+ color: var(--jp-ui-font-color2);
18623
+ font-size: 11px;
18624
+ }
18625
+
18626
+ .app-item-url-container {
18627
+ display: flex;
18628
+ align-items: center;
18629
+ background-color: var(--jp-layout-color1);
18630
+ border: 1px solid var(--jp-border-color2);
18631
+ border-radius: 3px;
18632
+ padding: 6px 8px;
18633
+ }
18634
+
18635
+ .app-item-url {
18636
+ flex: 1;
18637
+ color: var(--jp-ui-font-color1);
18638
+ font-size: 11px;
18639
+ overflow: hidden;
18640
+ text-overflow: ellipsis;
18641
+ white-space: nowrap;
18642
+ font-family: var(--jp-code-font-family);
18643
+ }
18644
+
18645
+ .app-item-copy-button {
18646
+ border: none;
18647
+ background: transparent;
18648
+ cursor: pointer;
18649
+ padding: 2px;
18650
+ display: flex;
18651
+ align-items: center;
18652
+ justify-content: center;
18653
+ margin-left: 8px;
18654
+ border-radius: 2px;
18655
+ }
18656
+
18657
+ .app-item-copy-button:hover {
18658
+ background-color: var(--jp-layout-color2);
18659
+ }
18660
+ `, "",{"version":3,"sources":["webpack://./style/AppsList.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF,kBAAkB;AAClB;EACE,aAAa;EACb,sBAAsB;EACtB,YAAY;EACZ,eAAe;EACf,qCAAqC;EACrC,gBAAgB;AAClB;;AAEA;EACE,aAAa;EACb,8BAA8B;EAC9B,mBAAmB;EACnB,aAAa;EACb,cAAc;EACd,gDAAgD;AAClD;;AAEA;EACE,OAAO;EACP,gBAAgB;EAChB,aAAa;EACb,aAAa;AACf;;AAEA;EACE,SAAS;EACT,eAAe;EACf,iBAAiB;EACjB,+BAA+B;AACjC;;AAEA;EACE,aAAa;EACb,QAAQ;AACV;;AAEA;EACE,gBAAgB;EAChB,eAAe;EACf,6BAA6B;EAC7B,+BAA+B;EAC/B,yCAAyC;EACzC,kBAAkB;EAClB,eAAe;EACf,mBAAmB;EACnB,sCAAsC;AACxC;;AAEA;EACE,yCAAyC;AAC3C;;AAEA;EACE,mBAAmB;AACrB;;AAEA;EACE,wCAAwC;EACxC,YAAY;EACZ,YAAY;AACd;;AAEA;EACE,+BAA+B;EAC/B,kBAAkB;EAClB,eAAe;AACjB;;AAEA;EACE,cAAc;EACd,kBAAkB;EAClB,eAAe;EACf,yCAAyC;EACzC,yBAAyB;EACzB,kBAAkB;AACpB;;AAEA;EACE,eAAe;AACjB;;AAEA;EACE,+BAA+B;EAC/B,yCAAyC;EACzC,yCAAyC;EACzC,kBAAkB;EAClB,kBAAkB;EAClB,kBAAkB;EAClB,aAAa;EACb,sBAAsB;EACtB,mBAAmB;EACnB,SAAS;AACX;;AAEA;EACE,eAAe;EACf,iBAAiB;EACjB,qCAAqC;AACvC;;AAEA;EACE,eAAe;EACf,eAAe;AACjB;;AAEA;EACE,+BAA+B;EAC/B,kBAAkB;EAClB,eAAe;AACjB;;AAEA;EACE,yCAAyC;EACzC,kBAAkB;EAClB,aAAa;EACb,kBAAkB;EAClB,yCAAyC;AAC3C;;AAEA;EACE,aAAa;EACb,8BAA8B;EAC9B,uBAAuB;EACvB,kBAAkB;AACpB;;AAEA;EACE,OAAO;AACT;;AAEA;EACE,iBAAiB;EACjB,+BAA+B;EAC/B,kBAAkB;AACpB;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,kBAAkB;AACpB;;AAEA;EACE,qBAAqB;EACrB,UAAU;EACV,WAAW;EACX,kBAAkB;EAClB,iBAAiB;AACnB;;AAEA;EACE,+BAA+B;EAC/B,eAAe;AACjB;;AAEA;EACE,+BAA+B;EAC/B,eAAe;AACjB;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,yCAAyC;EACzC,yCAAyC;EACzC,kBAAkB;EAClB,gBAAgB;AAClB;;AAEA;EACE,OAAO;EACP,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,uBAAuB;EACvB,mBAAmB;EACnB,uCAAuC;AACzC;;AAEA;EACE,YAAY;EACZ,uBAAuB;EACvB,eAAe;EACf,YAAY;EACZ,aAAa;EACb,mBAAmB;EACnB,uBAAuB;EACvB,gBAAgB;EAChB,kBAAkB;AACpB;;AAEA;EACE,yCAAyC;AAC3C","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n/* apps-list.css */\n.apps-list-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n font-size: 13px;\n font-family: var(--jp-ui-font-family);\n overflow: hidden;\n}\n\n.apps-list-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px;\n flex-shrink: 0;\n border-bottom: 1px solid var(--jp-border-color2);\n}\n\n.apps-list-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n min-height: 0;\n}\n\n.apps-list-title {\n margin: 0;\n font-size: 14px;\n font-weight: bold;\n color: var(--jp-ui-font-color1);\n}\n\n.apps-list-actions {\n display: flex;\n gap: 8px;\n}\n\n.apps-list-button {\n padding: 4px 8px;\n font-size: 11px;\n background-color: transparent;\n color: var(--jp-ui-font-color2);\n border: 1px solid var(--jp-border-color2);\n border-radius: 3px;\n cursor: pointer;\n font-weight: normal;\n transition: background-color 0.2s ease;\n}\n\n.apps-list-button:hover {\n background-color: var(--jp-layout-color2);\n}\n\n.apps-list-button:disabled {\n cursor: not-allowed;\n}\n\n.apps-list-button.primary {\n background-color: var(--jp-brand-color1);\n color: white;\n border: none;\n}\n\n.apps-list-loading {\n color: var(--jp-ui-font-color2);\n text-align: center;\n padding: 20px 0;\n}\n\n.apps-list-error {\n color: #f44336;\n text-align: center;\n padding: 20px 0;\n background-color: var(--jp-layout-color1);\n border: 1px solid #f44336;\n border-radius: 4px;\n}\n\n.apps-list-error-actions {\n margin-top: 8px;\n}\n\n.apps-list-auth-message {\n color: var(--jp-ui-font-color1);\n background-color: var(--jp-layout-color0);\n border: 1px solid var(--jp-border-color2);\n border-radius: 4px;\n padding: 24px 16px;\n text-align: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n}\n\n.apps-list-auth-text {\n font-size: 14px;\n font-weight: bold;\n font-family: var(--jp-ui-font-family);\n}\n\n.apps-list-auth-login-button {\n font-size: 13px;\n min-width: 96px;\n}\n\n.apps-list-empty {\n color: var(--jp-ui-font-color2);\n text-align: center;\n padding: 20px 0;\n}\n\n.app-item {\n border: 1px solid var(--jp-border-color1);\n border-radius: 4px;\n padding: 12px;\n margin-bottom: 8px;\n background-color: var(--jp-layout-color0);\n}\n\n.app-item-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 8px;\n}\n\n.app-item-content {\n flex: 1;\n}\n\n.app-item-name {\n font-weight: bold;\n color: var(--jp-ui-font-color1);\n margin-bottom: 4px;\n}\n\n.app-item-status-container {\n display: flex;\n align-items: center;\n margin-bottom: 4px;\n}\n\n.app-item-status-indicator {\n display: inline-block;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n margin-right: 6px;\n}\n\n.app-item-status-text {\n color: var(--jp-ui-font-color2);\n font-size: 12px;\n}\n\n.app-item-last-deployed {\n color: var(--jp-ui-font-color2);\n font-size: 11px;\n}\n\n.app-item-url-container {\n display: flex;\n align-items: center;\n background-color: var(--jp-layout-color1);\n border: 1px solid var(--jp-border-color2);\n border-radius: 3px;\n padding: 6px 8px;\n}\n\n.app-item-url {\n flex: 1;\n color: var(--jp-ui-font-color1);\n font-size: 11px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: var(--jp-code-font-family);\n}\n\n.app-item-copy-button {\n border: none;\n background: transparent;\n cursor: pointer;\n padding: 2px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-left: 8px;\n border-radius: 2px;\n}\n\n.app-item-copy-button:hover {\n background-color: var(--jp-layout-color2);\n}\n"],"sourceRoot":""}]);
18661
+ // Exports
18662
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
18663
+
18664
+
18665
+ /***/ }),
18666
+
18667
+ /***/ "./node_modules/css-loader/dist/cjs.js!./style/AskUserQuestionToolUI.css":
18668
+ /*!*******************************************************************************!*\
18669
+ !*** ./node_modules/css-loader/dist/cjs.js!./style/AskUserQuestionToolUI.css ***!
18670
+ \*******************************************************************************/
18671
+ /***/ ((module, __webpack_exports__, __webpack_require__) => {
18672
+
18673
+ __webpack_require__.r(__webpack_exports__);
18674
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
18675
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
18676
+ /* harmony export */ });
18677
+ /* 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");
18678
+ /* 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__);
18679
+ /* 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");
18680
+ /* 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__);
18681
+ // Imports
18682
+
18683
+
18684
+ 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()));
18685
+ // Module
18686
+ ___CSS_LOADER_EXPORT___.push([module.id, `/*
18687
+ * Copyright (c) Saga Inc.
18688
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
18689
+ */
18690
+
18691
+ /* Active mode: purple border with glow effect */
18692
+ .ask-user-question-active {
18693
+ border: 2px solid var(--jp-brand-color1) !important;
18694
+ border-radius: 5px !important;
18695
+ box-shadow: 0 0 8px rgba(76, 29, 149, 0.2), 0 0 16px rgba(76, 29, 149, 0.1), 0 0 2px rgba(76, 29, 149, 0.15) inset;
18696
+ background-color: var(--jp-layout-color1);
18697
+ }
18698
+
18699
+ .ask-user-question-container {
18700
+ flex-direction: column;
18701
+ align-items: flex-start;
18702
+ padding: 12px;
18703
+ }
18704
+
18705
+ .ask-user-question-container .agent-tool-ui-content {
18706
+ width: 100%;
18707
+ flex-direction: column;
18708
+ align-items: flex-start;
18709
+ gap: 12px;
18710
+ }
18711
+
18712
+ /* Purple pill badge for active mode */
18713
+ .ask-user-question-pill {
18714
+ display: inline-flex;
18715
+ align-items: center;
18716
+ gap: 6px;
18717
+ padding: 4px 10px;
18718
+ background-color: var(--purple-300);
18719
+ border-radius: 12px;
18720
+ color: var(--purple-700);
18721
+ font-size: 11px;
18722
+ font-weight: 500;
18723
+ line-height: 1;
18724
+ }
18725
+
18726
+ .ask-user-question-pill svg {
18727
+ width: 12px;
18728
+ height: 12px;
18729
+ flex-shrink: 0;
18730
+ }
18731
+
18732
+ .ask-user-question-pill-text {
18733
+ white-space: nowrap;
18734
+ }
18735
+
18736
+ .ask-user-question-content {
18737
+ display: flex;
18738
+ flex-direction: column;
18739
+ gap: 10px;
18740
+ width: 100%;
18741
+ margin-left: 0;
18742
+ }
18743
+
18744
+ .ask-user-question-message {
18745
+ color: var(--jp-ui-font-color1);
18746
+ font-size: var(--jp-ui-font-size1);
18747
+ line-height: 1.5;
18748
+ }
18749
+
18750
+ .ask-user-question-question {
18751
+ color: var(--jp-ui-font-color0);
18752
+ font-size: var(--jp-ui-font-size1);
18753
+ font-weight: 500;
18754
+ line-height: 1.5;
18755
+ }
18756
+
18757
+ .ask-user-question-answers {
18758
+ display: flex;
18759
+ flex-direction: column;
18760
+ gap: 0;
18761
+ width: 100%;
18762
+ margin-top: 4px;
18763
+ border-radius: 4px;
18764
+ overflow: hidden;
18765
+ }
18766
+
18767
+ .ask-user-question-answer-button {
18768
+ display: flex;
18769
+ align-items: center;
18770
+ gap: 10px;
18771
+ padding: 10px 14px;
18772
+ background-color: var(--jp-layout-color1);
18773
+ border: none;
18774
+ border-bottom: 1px solid var(--jp-border-color2);
18775
+ border-radius: 0;
18776
+ color: var(--jp-ui-font-color1);
18777
+ font-size: var(--jp-ui-font-size1);
18778
+ cursor: pointer;
18779
+ transition: background-color 0.2s ease;
18780
+ text-align: left;
18781
+ width: 100%;
18782
+ }
18783
+
18784
+ .ask-user-question-answer-button:last-child {
18785
+ border-bottom: none;
18786
+ }
18787
+
18788
+ .ask-user-question-answer-button:hover:not(:disabled) {
18789
+ background-color: var(--jp-layout-color2);
18790
+ color: var(--jp-ui-font-color0);
18791
+ }
18792
+
18793
+ .ask-user-question-answer-button:active:not(:disabled) {
18794
+ background-color: var(--jp-layout-color3);
18795
+ }
18796
+
18797
+ .ask-user-question-answer-button:disabled {
18798
+ opacity: 0.6;
18799
+ cursor: not-allowed;
18800
+ }
18801
+
18802
+ .ask-user-question-radio-icon {
18803
+ flex-shrink: 0;
18804
+ color: var(--jp-ui-font-color2);
18805
+ width: 16px;
18806
+ height: 16px;
18807
+ }
18808
+
18809
+ .ask-user-question-answer-button:hover:not(:disabled) .ask-user-question-radio-icon {
18810
+ color: var(--jp-brand-color1);
18811
+ }
18812
+
18813
+ .ask-user-question-answer-text {
18814
+ flex: 1;
18815
+ text-align: left;
18816
+ }
18817
+
18818
+ .ask-user-question-subtext {
18819
+ color: var(--jp-ui-font-color2);
18820
+ font-size: 11px;
18821
+ line-height: 1.4;
18822
+ margin-top: 8px;
18823
+ font-style: italic;
18824
+ opacity: 0.7;
18825
+ }
18826
+
18827
+ /* Align subtext with radio button circles when options are present */
18828
+ .ask-user-question-answers + .ask-user-question-subtext {
18829
+ padding-left: 14px; /* Matches button left padding to align with radio button circles */
18830
+ }
18831
+
18832
+ /* Collapsed mode styles */
18833
+ .ask-user-question-collapsed {
18834
+ display: flex;
18835
+ flex-direction: column;
18836
+ align-items: stretch;
18837
+ justify-content: start;
18838
+ background-color: transparent;
18839
+ margin: 0 0;
18840
+ color: var(--jp-ui-font-color2);
18841
+ overflow: hidden;
18842
+ }
18843
+
18844
+ .ask-user-question-collapsed.expanded {
18845
+ border: 1px solid var(--jp-cell-editor-border-color);
18846
+ border-radius: 5px;
18847
+ background-color: var(--chat-background-color);
18848
+ margin-bottom: 5px;
17152
18849
  }
17153
18850
 
17154
- .app-item-last-deployed {
17155
- color: var(--jp-ui-font-color2);
17156
- font-size: 11px;
18851
+ .ask-user-question-collapsed-content {
18852
+ display: flex;
18853
+ flex-direction: column;
18854
+ gap: 6px;
18855
+ flex: 1;
17157
18856
  }
17158
18857
 
17159
- .app-item-url-container {
17160
- display: flex;
17161
- align-items: center;
17162
- background-color: var(--jp-layout-color1);
17163
- border: 1px solid var(--jp-border-color2);
17164
- border-radius: 3px;
17165
- padding: 6px 8px;
18858
+ .ask-user-question-collapsed .ask-user-question-question {
18859
+ color: var(--jp-ui-font-color1);
18860
+ font-size: var(--jp-ui-font-size1);
18861
+ font-weight: 500;
18862
+ line-height: 1.5;
17166
18863
  }
17167
18864
 
17168
- .app-item-url {
17169
- flex: 1;
17170
- color: var(--jp-ui-font-color1);
17171
- font-size: 11px;
17172
- overflow: hidden;
17173
- text-overflow: ellipsis;
17174
- white-space: nowrap;
17175
- font-family: var(--jp-code-font-family);
18865
+ .ask-user-question-collapsed-answers {
18866
+ margin: 0;
18867
+ padding-left: 20px;
18868
+ color: var(--jp-ui-font-color1);
18869
+ font-size: var(--jp-ui-font-size1);
18870
+ line-height: 1.5;
18871
+ list-style-type: disc;
17176
18872
  }
17177
18873
 
17178
- .app-item-copy-button {
17179
- border: none;
17180
- background: transparent;
17181
- cursor: pointer;
17182
- padding: 2px;
17183
- display: flex;
17184
- align-items: center;
17185
- justify-content: center;
17186
- margin-left: 8px;
17187
- border-radius: 2px;
18874
+ .ask-user-question-collapsed-answers li {
18875
+ margin: 4px 0;
17188
18876
  }
17189
18877
 
17190
- .app-item-copy-button:hover {
17191
- background-color: var(--jp-layout-color2);
18878
+ /* Expanded content for collapsed mode */
18879
+ .ask-user-question-expanded-content {
18880
+ padding: 10px var(--chat-taskpane-tool-call-horizontal-padding);
18881
+ background-color: transparent;
18882
+ color: var(--jp-ui-font-color1);
18883
+ white-space: pre-wrap;
18884
+ word-break: break-word;
18885
+ border: none;
18886
+ border-radius: 0;
17192
18887
  }
17193
- `, "",{"version":3,"sources":["webpack://./style/AppsList.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF,kBAAkB;AAClB;EACE,aAAa;EACb,sBAAsB;EACtB,YAAY;EACZ,eAAe;EACf,qCAAqC;EACrC,gBAAgB;AAClB;;AAEA;EACE,aAAa;EACb,8BAA8B;EAC9B,mBAAmB;EACnB,aAAa;EACb,cAAc;EACd,gDAAgD;AAClD;;AAEA;EACE,OAAO;EACP,gBAAgB;EAChB,aAAa;EACb,aAAa;AACf;;AAEA;EACE,SAAS;EACT,eAAe;EACf,iBAAiB;EACjB,+BAA+B;AACjC;;AAEA;EACE,aAAa;EACb,QAAQ;AACV;;AAEA;EACE,gBAAgB;EAChB,eAAe;EACf,6BAA6B;EAC7B,+BAA+B;EAC/B,yCAAyC;EACzC,kBAAkB;EAClB,eAAe;EACf,mBAAmB;EACnB,sCAAsC;AACxC;;AAEA;EACE,yCAAyC;AAC3C;;AAEA;EACE,mBAAmB;AACrB;;AAEA;EACE,wCAAwC;EACxC,YAAY;EACZ,YAAY;AACd;;AAEA;EACE,+BAA+B;EAC/B,kBAAkB;EAClB,eAAe;AACjB;;AAEA;EACE,cAAc;EACd,kBAAkB;EAClB,eAAe;EACf,yCAAyC;EACzC,yBAAyB;EACzB,kBAAkB;AACpB;;AAEA;EACE,eAAe;AACjB;;AAEA;EACE,+BAA+B;EAC/B,yCAAyC;EACzC,yCAAyC;EACzC,kBAAkB;EAClB,kBAAkB;EAClB,kBAAkB;EAClB,aAAa;EACb,sBAAsB;EACtB,mBAAmB;EACnB,SAAS;AACX;;AAEA;EACE,eAAe;EACf,iBAAiB;EACjB,qCAAqC;AACvC;;AAEA;EACE,eAAe;EACf,eAAe;AACjB;;AAEA;EACE,+BAA+B;EAC/B,kBAAkB;EAClB,eAAe;AACjB;;AAEA;EACE,yCAAyC;EACzC,kBAAkB;EAClB,aAAa;EACb,kBAAkB;EAClB,yCAAyC;AAC3C;;AAEA;EACE,aAAa;EACb,8BAA8B;EAC9B,uBAAuB;EACvB,kBAAkB;AACpB;;AAEA;EACE,OAAO;AACT;;AAEA;EACE,iBAAiB;EACjB,+BAA+B;EAC/B,kBAAkB;AACpB;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,kBAAkB;AACpB;;AAEA;EACE,qBAAqB;EACrB,UAAU;EACV,WAAW;EACX,kBAAkB;EAClB,iBAAiB;AACnB;;AAEA;EACE,+BAA+B;EAC/B,eAAe;AACjB;;AAEA;EACE,+BAA+B;EAC/B,eAAe;AACjB;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,yCAAyC;EACzC,yCAAyC;EACzC,kBAAkB;EAClB,gBAAgB;AAClB;;AAEA;EACE,OAAO;EACP,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,uBAAuB;EACvB,mBAAmB;EACnB,uCAAuC;AACzC;;AAEA;EACE,YAAY;EACZ,uBAAuB;EACvB,eAAe;EACf,YAAY;EACZ,aAAa;EACb,mBAAmB;EACnB,uBAAuB;EACvB,gBAAgB;EAChB,kBAAkB;AACpB;;AAEA;EACE,yCAAyC;AAC3C","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n/* apps-list.css */\n.apps-list-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n font-size: 13px;\n font-family: var(--jp-ui-font-family);\n overflow: hidden;\n}\n\n.apps-list-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px;\n flex-shrink: 0;\n border-bottom: 1px solid var(--jp-border-color2);\n}\n\n.apps-list-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n min-height: 0;\n}\n\n.apps-list-title {\n margin: 0;\n font-size: 14px;\n font-weight: bold;\n color: var(--jp-ui-font-color1);\n}\n\n.apps-list-actions {\n display: flex;\n gap: 8px;\n}\n\n.apps-list-button {\n padding: 4px 8px;\n font-size: 11px;\n background-color: transparent;\n color: var(--jp-ui-font-color2);\n border: 1px solid var(--jp-border-color2);\n border-radius: 3px;\n cursor: pointer;\n font-weight: normal;\n transition: background-color 0.2s ease;\n}\n\n.apps-list-button:hover {\n background-color: var(--jp-layout-color2);\n}\n\n.apps-list-button:disabled {\n cursor: not-allowed;\n}\n\n.apps-list-button.primary {\n background-color: var(--jp-brand-color1);\n color: white;\n border: none;\n}\n\n.apps-list-loading {\n color: var(--jp-ui-font-color2);\n text-align: center;\n padding: 20px 0;\n}\n\n.apps-list-error {\n color: #f44336;\n text-align: center;\n padding: 20px 0;\n background-color: var(--jp-layout-color1);\n border: 1px solid #f44336;\n border-radius: 4px;\n}\n\n.apps-list-error-actions {\n margin-top: 8px;\n}\n\n.apps-list-auth-message {\n color: var(--jp-ui-font-color1);\n background-color: var(--jp-layout-color0);\n border: 1px solid var(--jp-border-color2);\n border-radius: 4px;\n padding: 24px 16px;\n text-align: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n}\n\n.apps-list-auth-text {\n font-size: 14px;\n font-weight: bold;\n font-family: var(--jp-ui-font-family);\n}\n\n.apps-list-auth-login-button {\n font-size: 13px;\n min-width: 96px;\n}\n\n.apps-list-empty {\n color: var(--jp-ui-font-color2);\n text-align: center;\n padding: 20px 0;\n}\n\n.app-item {\n border: 1px solid var(--jp-border-color1);\n border-radius: 4px;\n padding: 12px;\n margin-bottom: 8px;\n background-color: var(--jp-layout-color0);\n}\n\n.app-item-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 8px;\n}\n\n.app-item-content {\n flex: 1;\n}\n\n.app-item-name {\n font-weight: bold;\n color: var(--jp-ui-font-color1);\n margin-bottom: 4px;\n}\n\n.app-item-status-container {\n display: flex;\n align-items: center;\n margin-bottom: 4px;\n}\n\n.app-item-status-indicator {\n display: inline-block;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n margin-right: 6px;\n}\n\n.app-item-status-text {\n color: var(--jp-ui-font-color2);\n font-size: 12px;\n}\n\n.app-item-last-deployed {\n color: var(--jp-ui-font-color2);\n font-size: 11px;\n}\n\n.app-item-url-container {\n display: flex;\n align-items: center;\n background-color: var(--jp-layout-color1);\n border: 1px solid var(--jp-border-color2);\n border-radius: 3px;\n padding: 6px 8px;\n}\n\n.app-item-url {\n flex: 1;\n color: var(--jp-ui-font-color1);\n font-size: 11px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: var(--jp-code-font-family);\n}\n\n.app-item-copy-button {\n border: none;\n background: transparent;\n cursor: pointer;\n padding: 2px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-left: 8px;\n border-radius: 2px;\n}\n\n.app-item-copy-button:hover {\n background-color: var(--jp-layout-color2);\n}\n"],"sourceRoot":""}]);
18888
+ `, "",{"version":3,"sources":["webpack://./style/AskUserQuestionToolUI.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF,gDAAgD;AAChD;IACI,mDAAmD;IACnD,6BAA6B;IAC7B,kHAAkH;IAClH,yCAAyC;AAC7C;;AAEA;IACI,sBAAsB;IACtB,uBAAuB;IACvB,aAAa;AACjB;;AAEA;IACI,WAAW;IACX,sBAAsB;IACtB,uBAAuB;IACvB,SAAS;AACb;;AAEA,sCAAsC;AACtC;IACI,oBAAoB;IACpB,mBAAmB;IACnB,QAAQ;IACR,iBAAiB;IACjB,mCAAmC;IACnC,mBAAmB;IACnB,wBAAwB;IACxB,eAAe;IACf,gBAAgB;IAChB,cAAc;AAClB;;AAEA;IACI,WAAW;IACX,YAAY;IACZ,cAAc;AAClB;;AAEA;IACI,mBAAmB;AACvB;;AAEA;IACI,aAAa;IACb,sBAAsB;IACtB,SAAS;IACT,WAAW;IACX,cAAc;AAClB;;AAEA;IACI,+BAA+B;IAC/B,kCAAkC;IAClC,gBAAgB;AACpB;;AAEA;IACI,+BAA+B;IAC/B,kCAAkC;IAClC,gBAAgB;IAChB,gBAAgB;AACpB;;AAEA;IACI,aAAa;IACb,sBAAsB;IACtB,MAAM;IACN,WAAW;IACX,eAAe;IACf,kBAAkB;IAClB,gBAAgB;AACpB;;AAEA;IACI,aAAa;IACb,mBAAmB;IACnB,SAAS;IACT,kBAAkB;IAClB,yCAAyC;IACzC,YAAY;IACZ,gDAAgD;IAChD,gBAAgB;IAChB,+BAA+B;IAC/B,kCAAkC;IAClC,eAAe;IACf,sCAAsC;IACtC,gBAAgB;IAChB,WAAW;AACf;;AAEA;IACI,mBAAmB;AACvB;;AAEA;IACI,yCAAyC;IACzC,+BAA+B;AACnC;;AAEA;IACI,yCAAyC;AAC7C;;AAEA;IACI,YAAY;IACZ,mBAAmB;AACvB;;AAEA;IACI,cAAc;IACd,+BAA+B;IAC/B,WAAW;IACX,YAAY;AAChB;;AAEA;IACI,6BAA6B;AACjC;;AAEA;IACI,OAAO;IACP,gBAAgB;AACpB;;AAEA;IACI,+BAA+B;IAC/B,eAAe;IACf,gBAAgB;IAChB,eAAe;IACf,kBAAkB;IAClB,YAAY;AAChB;;AAEA,qEAAqE;AACrE;IACI,kBAAkB,EAAE,mEAAmE;AAC3F;;AAEA,0BAA0B;AAC1B;IACI,aAAa;IACb,sBAAsB;IACtB,oBAAoB;IACpB,sBAAsB;IACtB,6BAA6B;IAC7B,WAAW;IACX,+BAA+B;IAC/B,gBAAgB;AACpB;;AAEA;IACI,oDAAoD;IACpD,kBAAkB;IAClB,8CAA8C;IAC9C,kBAAkB;AACtB;;AAEA;IACI,aAAa;IACb,sBAAsB;IACtB,QAAQ;IACR,OAAO;AACX;;AAEA;IACI,+BAA+B;IAC/B,kCAAkC;IAClC,gBAAgB;IAChB,gBAAgB;AACpB;;AAEA;IACI,SAAS;IACT,kBAAkB;IAClB,+BAA+B;IAC/B,kCAAkC;IAClC,gBAAgB;IAChB,qBAAqB;AACzB;;AAEA;IACI,aAAa;AACjB;;AAEA,wCAAwC;AACxC;IACI,+DAA+D;IAC/D,6BAA6B;IAC7B,+BAA+B;IAC/B,qBAAqB;IACrB,sBAAsB;IACtB,YAAY;IACZ,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/* Active mode: purple border with glow effect */\n.ask-user-question-active {\n border: 2px solid var(--jp-brand-color1) !important;\n border-radius: 5px !important;\n box-shadow: 0 0 8px rgba(76, 29, 149, 0.2), 0 0 16px rgba(76, 29, 149, 0.1), 0 0 2px rgba(76, 29, 149, 0.15) inset;\n background-color: var(--jp-layout-color1);\n}\n\n.ask-user-question-container {\n flex-direction: column;\n align-items: flex-start;\n padding: 12px;\n}\n\n.ask-user-question-container .agent-tool-ui-content {\n width: 100%;\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n}\n\n/* Purple pill badge for active mode */\n.ask-user-question-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background-color: var(--purple-300);\n border-radius: 12px;\n color: var(--purple-700);\n font-size: 11px;\n font-weight: 500;\n line-height: 1;\n}\n\n.ask-user-question-pill svg {\n width: 12px;\n height: 12px;\n flex-shrink: 0;\n}\n\n.ask-user-question-pill-text {\n white-space: nowrap;\n}\n\n.ask-user-question-content {\n display: flex;\n flex-direction: column;\n gap: 10px;\n width: 100%;\n margin-left: 0;\n}\n\n.ask-user-question-message {\n color: var(--jp-ui-font-color1);\n font-size: var(--jp-ui-font-size1);\n line-height: 1.5;\n}\n\n.ask-user-question-question {\n color: var(--jp-ui-font-color0);\n font-size: var(--jp-ui-font-size1);\n font-weight: 500;\n line-height: 1.5;\n}\n\n.ask-user-question-answers {\n display: flex;\n flex-direction: column;\n gap: 0;\n width: 100%;\n margin-top: 4px;\n border-radius: 4px;\n overflow: hidden;\n}\n\n.ask-user-question-answer-button {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n background-color: var(--jp-layout-color1);\n border: none;\n border-bottom: 1px solid var(--jp-border-color2);\n border-radius: 0;\n color: var(--jp-ui-font-color1);\n font-size: var(--jp-ui-font-size1);\n cursor: pointer;\n transition: background-color 0.2s ease;\n text-align: left;\n width: 100%;\n}\n\n.ask-user-question-answer-button:last-child {\n border-bottom: none;\n}\n\n.ask-user-question-answer-button:hover:not(:disabled) {\n background-color: var(--jp-layout-color2);\n color: var(--jp-ui-font-color0);\n}\n\n.ask-user-question-answer-button:active:not(:disabled) {\n background-color: var(--jp-layout-color3);\n}\n\n.ask-user-question-answer-button:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.ask-user-question-radio-icon {\n flex-shrink: 0;\n color: var(--jp-ui-font-color2);\n width: 16px;\n height: 16px;\n}\n\n.ask-user-question-answer-button:hover:not(:disabled) .ask-user-question-radio-icon {\n color: var(--jp-brand-color1);\n}\n\n.ask-user-question-answer-text {\n flex: 1;\n text-align: left;\n}\n\n.ask-user-question-subtext {\n color: var(--jp-ui-font-color2);\n font-size: 11px;\n line-height: 1.4;\n margin-top: 8px;\n font-style: italic;\n opacity: 0.7;\n}\n\n/* Align subtext with radio button circles when options are present */\n.ask-user-question-answers + .ask-user-question-subtext {\n padding-left: 14px; /* Matches button left padding to align with radio button circles */\n}\n\n/* Collapsed mode styles */\n.ask-user-question-collapsed {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n justify-content: start;\n background-color: transparent;\n margin: 0 0;\n color: var(--jp-ui-font-color2);\n overflow: hidden;\n}\n\n.ask-user-question-collapsed.expanded {\n border: 1px solid var(--jp-cell-editor-border-color);\n border-radius: 5px;\n background-color: var(--chat-background-color);\n margin-bottom: 5px;\n}\n\n.ask-user-question-collapsed-content {\n display: flex;\n flex-direction: column;\n gap: 6px;\n flex: 1;\n}\n\n.ask-user-question-collapsed .ask-user-question-question {\n color: var(--jp-ui-font-color1);\n font-size: var(--jp-ui-font-size1);\n font-weight: 500;\n line-height: 1.5;\n}\n\n.ask-user-question-collapsed-answers {\n margin: 0;\n padding-left: 20px;\n color: var(--jp-ui-font-color1);\n font-size: var(--jp-ui-font-size1);\n line-height: 1.5;\n list-style-type: disc;\n}\n\n.ask-user-question-collapsed-answers li {\n margin: 4px 0;\n}\n\n/* Expanded content for collapsed mode */\n.ask-user-question-expanded-content {\n padding: 10px var(--chat-taskpane-tool-call-horizontal-padding);\n background-color: transparent;\n color: var(--jp-ui-font-color1);\n white-space: pre-wrap;\n word-break: break-word;\n border: none;\n border-radius: 0;\n}\n"],"sourceRoot":""}]);
17194
18889
  // Exports
17195
18890
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
17196
18891
 
@@ -17799,87 +19494,313 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
17799
19494
  box-sizing: border-box;
17800
19495
  }
17801
19496
 
17802
- .cta-carousel-dot.active {
17803
- background-color: var(--purple-500);
19497
+ .cta-carousel-dot.active {
19498
+ background-color: var(--purple-500);
19499
+ }
19500
+
19501
+ .cta-carousel-button {
19502
+ margin-top: 8px;
19503
+ }
19504
+
19505
+ .cta-logo-container {
19506
+ margin: 0 auto 8px;
19507
+ display: block;
19508
+ text-align: center;
19509
+ }
19510
+
19511
+ .cta-title {
19512
+ display: block;
19513
+ text-align: center;
19514
+ font-weight: bold;
19515
+ font-size: 20px;
19516
+ margin-bottom: 15px;
19517
+ }`, "",{"version":3,"sources":["webpack://./style/CTACarousel.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;IACI,WAAW;AACf;;AAEA;IACI,aAAa;IACb,mBAAmB;IACnB,uBAAuB;IACvB,iBAAiB;AACrB;;AAEA;IACI,cAAc;IACd,kBAAkB;IAClB,eAAe;IACf,+BAA+B;IAC/B,mBAAmB;IACnB,OAAO;IACP,gBAAgB;IAChB,iBAAiB;IACjB,cAAc;IACd,UAAU;IACV,oCAAoC;AACxC;;AAEA;IACI,aAAa;IACb,uBAAuB;IACvB,QAAQ;IACR,eAAe;AACnB;;AAEA;IACI,WAAW;IACX,YAAY;IACZ,kBAAkB;IAClB,yCAAyC;IACzC,eAAe;IACf,sCAAsC;IACtC,sBAAsB;AAC1B;;AAEA;IACI,mCAAmC;AACvC;;AAEA;IACI,eAAe;AACnB;;AAEA;IACI,kBAAkB;IAClB,cAAc;IACd,kBAAkB;AACtB;;AAEA;IACI,cAAc;IACd,kBAAkB;IAClB,iBAAiB;IACjB,eAAe;IACf,mBAAmB;AACvB","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n.cta-carousel {\n width: 100%;\n}\n\n.cta-carousel-container {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100px;\n}\n\n.cta-message {\n display: block;\n text-align: center;\n font-size: 14px;\n color: var(--jp-ui-font-color3);\n margin-bottom: 15px;\n flex: 1;\n line-height: 1.3;\n min-height: 2.5em;\n padding: 0 8px;\n opacity: 1;\n transition: opacity 0.5s ease-in-out;\n}\n\n.cta-carousel-dots {\n display: flex;\n justify-content: center;\n gap: 8px;\n margin-top: 4px;\n}\n\n.cta-carousel-dot {\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: var(--jp-layout-color3);\n cursor: pointer;\n transition: background-color 0.3s ease;\n box-sizing: border-box;\n}\n\n.cta-carousel-dot.active {\n background-color: var(--purple-500);\n}\n\n.cta-carousel-button {\n margin-top: 8px;\n}\n\n.cta-logo-container {\n margin: 0 auto 8px;\n display: block;\n text-align: center;\n}\n\n.cta-title {\n display: block;\n text-align: center;\n font-weight: bold;\n font-size: 20px;\n margin-bottom: 15px;\n}"],"sourceRoot":""}]);
19518
+ // Exports
19519
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
19520
+
19521
+
19522
+ /***/ }),
19523
+
19524
+ /***/ "./node_modules/css-loader/dist/cjs.js!./style/CellReference.css":
19525
+ /*!***********************************************************************!*\
19526
+ !*** ./node_modules/css-loader/dist/cjs.js!./style/CellReference.css ***!
19527
+ \***********************************************************************/
19528
+ /***/ ((module, __webpack_exports__, __webpack_require__) => {
19529
+
19530
+ __webpack_require__.r(__webpack_exports__);
19531
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
19532
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
19533
+ /* harmony export */ });
19534
+ /* 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");
19535
+ /* 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__);
19536
+ /* 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");
19537
+ /* 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__);
19538
+ // Imports
19539
+
19540
+
19541
+ 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()));
19542
+ // Module
19543
+ ___CSS_LOADER_EXPORT___.push([module.id, `/*
19544
+ * Copyright (c) Saga Inc.
19545
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
19546
+ */
19547
+
19548
+ /* Cell reference links in chat messages - styled as standard links */
19549
+ .cell-reference {
19550
+ color: var(--purple-600);
19551
+ text-decoration: underline;
19552
+ cursor: pointer;
19553
+ font-weight: 500;
19554
+ padding: 1px 5px;
19555
+ border-radius: 3px;
19556
+ position: relative;
19557
+ vertical-align: baseline;
19558
+ }
19559
+
19560
+ .cell-reference:hover {
19561
+ background-color: var(--purple-300);
19562
+ color: var(--purple-700);
19563
+ }
19564
+
19565
+ /* Greyed out style for missing/unresolved cell references (deleted or in different notebook) */
19566
+ .cell-reference.cell-reference-missing {
19567
+ color: var(--jp-ui-font-color2);
19568
+ text-decoration: none;
19569
+ cursor: default;
19570
+ opacity: 0.6;
19571
+ }
19572
+
19573
+ .cell-reference.cell-reference-missing:hover {
19574
+ background-color: var(--jp-layout-color3);
19575
+ color: var(--jp-ui-font-color2);
19576
+ }
19577
+ `, "",{"version":3,"sources":["webpack://./style/CellReference.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF,qEAAqE;AACrE;IACI,wBAAwB;IACxB,0BAA0B;IAC1B,eAAe;IACf,gBAAgB;IAChB,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;IAClB,wBAAwB;AAC5B;;AAEA;IACI,mCAAmC;IACnC,wBAAwB;AAC5B;;AAEA,+FAA+F;AAC/F;IACI,+BAA+B;IAC/B,qBAAqB;IACrB,eAAe;IACf,YAAY;AAChB;;AAEA;IACI,yCAAyC;IACzC,+BAA+B;AACnC","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n/* Cell reference links in chat messages - styled as standard links */\n.cell-reference {\n color: var(--purple-600);\n text-decoration: underline;\n cursor: pointer;\n font-weight: 500;\n padding: 1px 5px;\n border-radius: 3px;\n position: relative;\n vertical-align: baseline;\n}\n\n.cell-reference:hover {\n background-color: var(--purple-300);\n color: var(--purple-700);\n}\n\n/* Greyed out style for missing/unresolved cell references (deleted or in different notebook) */\n.cell-reference.cell-reference-missing {\n color: var(--jp-ui-font-color2);\n text-decoration: none;\n cursor: default;\n opacity: 0.6;\n}\n\n.cell-reference.cell-reference-missing:hover {\n background-color: var(--jp-layout-color3);\n color: var(--jp-ui-font-color2);\n}\n"],"sourceRoot":""}]);
19578
+ // Exports
19579
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
19580
+
19581
+
19582
+ /***/ }),
19583
+
19584
+ /***/ "./node_modules/css-loader/dist/cjs.js!./style/ChartWizardPlugin.css":
19585
+ /*!***************************************************************************!*\
19586
+ !*** ./node_modules/css-loader/dist/cjs.js!./style/ChartWizardPlugin.css ***!
19587
+ \***************************************************************************/
19588
+ /***/ ((module, __webpack_exports__, __webpack_require__) => {
19589
+
19590
+ __webpack_require__.r(__webpack_exports__);
19591
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
19592
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
19593
+ /* harmony export */ });
19594
+ /* 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");
19595
+ /* 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__);
19596
+ /* 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");
19597
+ /* 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__);
19598
+ // Imports
19599
+
19600
+
19601
+ 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()));
19602
+ // Module
19603
+ ___CSS_LOADER_EXPORT___.push([module.id, `/*
19604
+ * Copyright (c) Saga Inc.
19605
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
19606
+ */
19607
+
19608
+ /* Position the button container in the upper right */
19609
+ .chart-wizard-button-container {
19610
+ position: absolute;
19611
+ top: 8px;
19612
+ right: 8px;
19613
+ z-index: 10;
19614
+ opacity: 0;
19615
+ transition: opacity 0.2s ease-in-out;
19616
+ }
19617
+
19618
+ .chart-wizard-output-container:hover .chart-wizard-button-container {
19619
+ opacity: 1;
19620
+ }`, "",{"version":3,"sources":["webpack://./style/ChartWizardPlugin.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF,qDAAqD;AACrD;IACI,kBAAkB;IAClB,QAAQ;IACR,UAAU;IACV,WAAW;IACX,UAAU;IACV,oCAAoC;AACxC;;AAEA;IACI,UAAU;AACd","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n/* Position the button container in the upper right */\n.chart-wizard-button-container {\n position: absolute;\n top: 8px;\n right: 8px;\n z-index: 10;\n opacity: 0;\n transition: opacity 0.2s ease-in-out;\n}\n\n.chart-wizard-output-container:hover .chart-wizard-button-container {\n opacity: 1;\n}"],"sourceRoot":""}]);
19621
+ // Exports
19622
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
19623
+
19624
+
19625
+ /***/ }),
19626
+
19627
+ /***/ "./node_modules/css-loader/dist/cjs.js!./style/ChartWizardWidget.css":
19628
+ /*!***************************************************************************!*\
19629
+ !*** ./node_modules/css-loader/dist/cjs.js!./style/ChartWizardWidget.css ***!
19630
+ \***************************************************************************/
19631
+ /***/ ((module, __webpack_exports__, __webpack_require__) => {
19632
+
19633
+ __webpack_require__.r(__webpack_exports__);
19634
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
19635
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
19636
+ /* harmony export */ });
19637
+ /* 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");
19638
+ /* 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__);
19639
+ /* 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");
19640
+ /* 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__);
19641
+ // Imports
19642
+
19643
+
19644
+ 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()));
19645
+ // Module
19646
+ ___CSS_LOADER_EXPORT___.push([module.id, `/*
19647
+ * Copyright (c) Saga Inc.
19648
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
19649
+ */
19650
+
19651
+ .chart-wizard-widget {
19652
+ padding: 10px;
19653
+ height: 100%;
19654
+ overflow-y: auto;
19655
+ display: flex;
19656
+ flex-direction: column;
19657
+ box-sizing: border-box;
19658
+ }
19659
+
19660
+ .chart-wizard-input-row {
19661
+ display: flex;
19662
+ flex-direction: column;
19663
+ margin-bottom: 15px;
19664
+ gap: 5px;
19665
+ }
19666
+
19667
+ .chart-wizard-boolean-row {
19668
+ flex-direction: row;
19669
+ align-items: center;
19670
+ justify-content: space-between;
19671
+ margin-bottom: 12px;
19672
+ gap: 12px;
19673
+ }
19674
+
19675
+ .chart-wizard-input-label {
19676
+ color: var(--jp-content-font-color2);
19677
+ font-size: 12px;
19678
+ font-weight: 500;
19679
+ text-transform: none;
19680
+ }
19681
+
19682
+ .chart-wizard-boolean-label {
19683
+ flex: 1;
19684
+ margin: 0;
19685
+ cursor: pointer;
19686
+ }
19687
+
19688
+ .chart-wizard-toggle-container {
19689
+ position: relative;
19690
+ display: inline-flex;
19691
+ align-items: center;
19692
+ cursor: pointer;
19693
+ flex-shrink: 0;
19694
+ }
19695
+
19696
+ .chart-wizard-toggle-input {
19697
+ position: absolute;
19698
+ opacity: 0;
19699
+ cursor: pointer;
19700
+ width: 0;
19701
+ height: 0;
19702
+ margin: 0;
19703
+ }
19704
+
19705
+ .chart-wizard-toggle-slider {
19706
+ position: relative;
19707
+ display: inline-block;
19708
+ width: 44px;
19709
+ height: 24px;
19710
+ background-color: var(--jp-border-color2);
19711
+ border-radius: 12px;
19712
+ transition: background-color 0.3s ease;
19713
+ box-sizing: border-box;
19714
+ }
19715
+
19716
+ .chart-wizard-toggle-slider::before {
19717
+ content: '';
19718
+ position: absolute;
19719
+ width: 20px;
19720
+ height: 20px;
19721
+ left: 2px;
19722
+ top: 2px;
19723
+ background-color: white;
19724
+ border-radius: 50%;
19725
+ transition: transform 0.3s ease;
19726
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
19727
+ }
19728
+
19729
+ .chart-wizard-toggle-input:checked + .chart-wizard-toggle-slider {
19730
+ background-color: var(--jp-brand-color1);
17804
19731
  }
17805
19732
 
17806
- .cta-carousel-button {
17807
- margin-top: 8px;
19733
+ .chart-wizard-toggle-input:checked + .chart-wizard-toggle-slider::before {
19734
+ transform: translateX(20px);
17808
19735
  }
17809
19736
 
17810
- .cta-logo-container {
17811
- margin: 0 auto 8px;
17812
- display: block;
17813
- text-align: center;
19737
+ .chart-wizard-toggle-input:focus + .chart-wizard-toggle-slider {
19738
+ box-shadow: 0 0 0 3px rgba(33, 150, 243, 0.2);
17814
19739
  }
17815
19740
 
17816
- .cta-title {
17817
- display: block;
17818
- text-align: center;
17819
- font-weight: bold;
17820
- font-size: 20px;
17821
- margin-bottom: 15px;
17822
- }`, "",{"version":3,"sources":["webpack://./style/CTACarousel.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;IACI,WAAW;AACf;;AAEA;IACI,aAAa;IACb,mBAAmB;IACnB,uBAAuB;IACvB,iBAAiB;AACrB;;AAEA;IACI,cAAc;IACd,kBAAkB;IAClB,eAAe;IACf,+BAA+B;IAC/B,mBAAmB;IACnB,OAAO;IACP,gBAAgB;IAChB,iBAAiB;IACjB,cAAc;IACd,UAAU;IACV,oCAAoC;AACxC;;AAEA;IACI,aAAa;IACb,uBAAuB;IACvB,QAAQ;IACR,eAAe;AACnB;;AAEA;IACI,WAAW;IACX,YAAY;IACZ,kBAAkB;IAClB,yCAAyC;IACzC,eAAe;IACf,sCAAsC;IACtC,sBAAsB;AAC1B;;AAEA;IACI,mCAAmC;AACvC;;AAEA;IACI,eAAe;AACnB;;AAEA;IACI,kBAAkB;IAClB,cAAc;IACd,kBAAkB;AACtB;;AAEA;IACI,cAAc;IACd,kBAAkB;IAClB,iBAAiB;IACjB,eAAe;IACf,mBAAmB;AACvB","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n.cta-carousel {\n width: 100%;\n}\n\n.cta-carousel-container {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100px;\n}\n\n.cta-message {\n display: block;\n text-align: center;\n font-size: 14px;\n color: var(--jp-ui-font-color3);\n margin-bottom: 15px;\n flex: 1;\n line-height: 1.3;\n min-height: 2.5em;\n padding: 0 8px;\n opacity: 1;\n transition: opacity 0.5s ease-in-out;\n}\n\n.cta-carousel-dots {\n display: flex;\n justify-content: center;\n gap: 8px;\n margin-top: 4px;\n}\n\n.cta-carousel-dot {\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: var(--jp-layout-color3);\n cursor: pointer;\n transition: background-color 0.3s ease;\n box-sizing: border-box;\n}\n\n.cta-carousel-dot.active {\n background-color: var(--purple-500);\n}\n\n.cta-carousel-button {\n margin-top: 8px;\n}\n\n.cta-logo-container {\n margin: 0 auto 8px;\n display: block;\n text-align: center;\n}\n\n.cta-title {\n display: block;\n text-align: center;\n font-weight: bold;\n font-size: 20px;\n margin-bottom: 15px;\n}"],"sourceRoot":""}]);
17823
- // Exports
17824
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
19741
+ .chart-wizard-toggle-input:hover + .chart-wizard-toggle-slider {
19742
+ background-color: var(--jp-border-color1);
19743
+ }
17825
19744
 
19745
+ .chart-wizard-toggle-input:checked:hover + .chart-wizard-toggle-slider {
19746
+ background-color: var(--jp-brand-color0);
19747
+ }
17826
19748
 
17827
- /***/ }),
19749
+ .chart-wizard-number-input,
19750
+ .chart-wizard-text-input,
19751
+ .chart-wizard-color-input,
19752
+ .chart-wizard-tuple-input {
19753
+ width: 100%;
19754
+ box-sizing: border-box;
19755
+ }
17828
19756
 
17829
- /***/ "./node_modules/css-loader/dist/cjs.js!./style/CellReference.css":
17830
- /*!***********************************************************************!*\
17831
- !*** ./node_modules/css-loader/dist/cjs.js!./style/CellReference.css ***!
17832
- \***********************************************************************/
17833
- /***/ ((module, __webpack_exports__, __webpack_require__) => {
19757
+ .chart-wizard-color-container {
19758
+ display: flex;
19759
+ gap: 8px;
19760
+ width: 100%;
19761
+ }
17834
19762
 
17835
- __webpack_require__.r(__webpack_exports__);
17836
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
17837
- /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
17838
- /* harmony export */ });
17839
- /* 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");
17840
- /* 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__);
17841
- /* 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");
17842
- /* 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__);
17843
- // Imports
19763
+ .chart-wizard-color-picker {
19764
+ flex-shrink: 0;
19765
+ }
17844
19766
 
19767
+ .chart-wizard-color-input {
19768
+ flex: 1;
19769
+ }
17845
19770
 
17846
- 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()));
17847
- // Module
17848
- ___CSS_LOADER_EXPORT___.push([module.id, `/*
17849
- * Copyright (c) Saga Inc.
17850
- * Distributed under the terms of the GNU Affero General Public License v3.0 License.
17851
- */
19771
+ .chart-wizard-tuple-container {
19772
+ display: flex;
19773
+ align-items: center;
19774
+ gap: 5px;
19775
+ width: 100%;
19776
+ }
17852
19777
 
17853
- /* Cell reference links in chat messages - styled as standard links */
17854
- .cell-reference {
17855
- color: var(--purple-600);
17856
- text-decoration: underline;
17857
- cursor: pointer;
17858
- font-weight: 500;
17859
- padding: 1px 5px;
17860
- border-radius: 3px;
17861
- position: relative;
17862
- vertical-align: baseline;
19778
+ .chart-wizard-tuple-input {
19779
+ flex: 1;
17863
19780
  }
17864
19781
 
17865
- .cell-reference:hover {
17866
- background-color: var(--purple-300);
17867
- color: var(--purple-700);
19782
+ .chart-wizard-config-container {
19783
+ flex: 1;
19784
+ min-height: 0;
17868
19785
  }
17869
19786
 
17870
- /* Greyed out style for missing/unresolved cell references (deleted or in different notebook) */
17871
- .cell-reference.cell-reference-missing {
17872
- color: var(--jp-ui-font-color2);
17873
- text-decoration: none;
17874
- cursor: default;
17875
- opacity: 0.6;
19787
+ .chart-wizard-empty-state,
19788
+ .chart-wizard-no-config {
19789
+ flex: 1;
19790
+ display: flex;
19791
+ flex-direction: column;
19792
+ justify-content: center;
17876
19793
  }
17877
19794
 
17878
- .cell-reference.cell-reference-missing:hover {
17879
- background-color: var(--jp-layout-color3);
17880
- color: var(--jp-ui-font-color2);
19795
+ .chart-wizard-no-config p {
19796
+ text-align: center;
17881
19797
  }
17882
- `, "",{"version":3,"sources":["webpack://./style/CellReference.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF,qEAAqE;AACrE;IACI,wBAAwB;IACxB,0BAA0B;IAC1B,eAAe;IACf,gBAAgB;IAChB,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;IAClB,wBAAwB;AAC5B;;AAEA;IACI,mCAAmC;IACnC,wBAAwB;AAC5B;;AAEA,+FAA+F;AAC/F;IACI,+BAA+B;IAC/B,qBAAqB;IACrB,eAAe;IACf,YAAY;AAChB;;AAEA;IACI,yCAAyC;IACzC,+BAA+B;AACnC","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n/* Cell reference links in chat messages - styled as standard links */\n.cell-reference {\n color: var(--purple-600);\n text-decoration: underline;\n cursor: pointer;\n font-weight: 500;\n padding: 1px 5px;\n border-radius: 3px;\n position: relative;\n vertical-align: baseline;\n}\n\n.cell-reference:hover {\n background-color: var(--purple-300);\n color: var(--purple-700);\n}\n\n/* Greyed out style for missing/unresolved cell references (deleted or in different notebook) */\n.cell-reference.cell-reference-missing {\n color: var(--jp-ui-font-color2);\n text-decoration: none;\n cursor: default;\n opacity: 0.6;\n}\n\n.cell-reference.cell-reference-missing:hover {\n background-color: var(--jp-layout-color3);\n color: var(--jp-ui-font-color2);\n}\n"],"sourceRoot":""}]);
19798
+
19799
+ .chart-wizard-loading-dots {
19800
+ display: inline-block;
19801
+ min-width: 1.5em;
19802
+ text-align: left;
19803
+ }`, "",{"version":3,"sources":["webpack://./style/ChartWizardWidget.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;IACI,aAAa;IACb,YAAY;IACZ,gBAAgB;IAChB,aAAa;IACb,sBAAsB;IACtB,sBAAsB;AAC1B;;AAEA;IACI,aAAa;IACb,sBAAsB;IACtB,mBAAmB;IACnB,QAAQ;AACZ;;AAEA;IACI,mBAAmB;IACnB,mBAAmB;IACnB,8BAA8B;IAC9B,mBAAmB;IACnB,SAAS;AACb;;AAEA;IACI,oCAAoC;IACpC,eAAe;IACf,gBAAgB;IAChB,oBAAoB;AACxB;;AAEA;IACI,OAAO;IACP,SAAS;IACT,eAAe;AACnB;;AAEA;IACI,kBAAkB;IAClB,oBAAoB;IACpB,mBAAmB;IACnB,eAAe;IACf,cAAc;AAClB;;AAEA;IACI,kBAAkB;IAClB,UAAU;IACV,eAAe;IACf,QAAQ;IACR,SAAS;IACT,SAAS;AACb;;AAEA;IACI,kBAAkB;IAClB,qBAAqB;IACrB,WAAW;IACX,YAAY;IACZ,yCAAyC;IACzC,mBAAmB;IACnB,sCAAsC;IACtC,sBAAsB;AAC1B;;AAEA;IACI,WAAW;IACX,kBAAkB;IAClB,WAAW;IACX,YAAY;IACZ,SAAS;IACT,QAAQ;IACR,uBAAuB;IACvB,kBAAkB;IAClB,+BAA+B;IAC/B,wCAAwC;AAC5C;;AAEA;IACI,wCAAwC;AAC5C;;AAEA;IACI,2BAA2B;AAC/B;;AAEA;IACI,6CAA6C;AACjD;;AAEA;IACI,yCAAyC;AAC7C;;AAEA;IACI,wCAAwC;AAC5C;;AAEA;;;;IAII,WAAW;IACX,sBAAsB;AAC1B;;AAEA;IACI,aAAa;IACb,QAAQ;IACR,WAAW;AACf;;AAEA;IACI,cAAc;AAClB;;AAEA;IACI,OAAO;AACX;;AAEA;IACI,aAAa;IACb,mBAAmB;IACnB,QAAQ;IACR,WAAW;AACf;;AAEA;IACI,OAAO;AACX;;AAEA;IACI,OAAO;IACP,aAAa;AACjB;;AAEA;;IAEI,OAAO;IACP,aAAa;IACb,sBAAsB;IACtB,uBAAuB;AAC3B;;AAEA;IACI,kBAAkB;AACtB;;AAEA;IACI,qBAAqB;IACrB,gBAAgB;IAChB,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.chart-wizard-widget {\n padding: 10px;\n height: 100%;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n}\n\n.chart-wizard-input-row {\n display: flex;\n flex-direction: column;\n margin-bottom: 15px;\n gap: 5px;\n}\n\n.chart-wizard-boolean-row {\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 12px;\n gap: 12px;\n}\n\n.chart-wizard-input-label {\n color: var(--jp-content-font-color2);\n font-size: 12px;\n font-weight: 500;\n text-transform: none;\n}\n\n.chart-wizard-boolean-label {\n flex: 1;\n margin: 0;\n cursor: pointer;\n}\n\n.chart-wizard-toggle-container {\n position: relative;\n display: inline-flex;\n align-items: center;\n cursor: pointer;\n flex-shrink: 0;\n}\n\n.chart-wizard-toggle-input {\n position: absolute;\n opacity: 0;\n cursor: pointer;\n width: 0;\n height: 0;\n margin: 0;\n}\n\n.chart-wizard-toggle-slider {\n position: relative;\n display: inline-block;\n width: 44px;\n height: 24px;\n background-color: var(--jp-border-color2);\n border-radius: 12px;\n transition: background-color 0.3s ease;\n box-sizing: border-box;\n}\n\n.chart-wizard-toggle-slider::before {\n content: '';\n position: absolute;\n width: 20px;\n height: 20px;\n left: 2px;\n top: 2px;\n background-color: white;\n border-radius: 50%;\n transition: transform 0.3s ease;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n}\n\n.chart-wizard-toggle-input:checked + .chart-wizard-toggle-slider {\n background-color: var(--jp-brand-color1);\n}\n\n.chart-wizard-toggle-input:checked + .chart-wizard-toggle-slider::before {\n transform: translateX(20px);\n}\n\n.chart-wizard-toggle-input:focus + .chart-wizard-toggle-slider {\n box-shadow: 0 0 0 3px rgba(33, 150, 243, 0.2);\n}\n\n.chart-wizard-toggle-input:hover + .chart-wizard-toggle-slider {\n background-color: var(--jp-border-color1);\n}\n\n.chart-wizard-toggle-input:checked:hover + .chart-wizard-toggle-slider {\n background-color: var(--jp-brand-color0);\n}\n\n.chart-wizard-number-input,\n.chart-wizard-text-input,\n.chart-wizard-color-input,\n.chart-wizard-tuple-input {\n width: 100%;\n box-sizing: border-box;\n}\n\n.chart-wizard-color-container {\n display: flex;\n gap: 8px;\n width: 100%;\n}\n\n.chart-wizard-color-picker {\n flex-shrink: 0;\n}\n\n.chart-wizard-color-input {\n flex: 1;\n}\n\n.chart-wizard-tuple-container {\n display: flex;\n align-items: center;\n gap: 5px;\n width: 100%;\n}\n\n.chart-wizard-tuple-input {\n flex: 1;\n}\n\n.chart-wizard-config-container {\n flex: 1;\n min-height: 0;\n}\n\n.chart-wizard-empty-state,\n.chart-wizard-no-config {\n flex: 1;\n display: flex;\n flex-direction: column;\n justify-content: center;\n}\n\n.chart-wizard-no-config p {\n text-align: center;\n}\n\n.chart-wizard-loading-dots {\n display: inline-block;\n min-width: 1.5em;\n text-align: left;\n}"],"sourceRoot":""}]);
17883
19804
  // Exports
17884
19805
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
17885
19806
 
@@ -18195,6 +20116,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
18195
20116
  font-size: 14px;
18196
20117
  border-radius: var(--chat-taskpane-item-border-radius);
18197
20118
  padding: 0 var(--chat-taskpane-item-indent);
20119
+ margin-bottom: 10px;
18198
20120
  }
18199
20121
 
18200
20122
  .message:hover .message-start-editing-button {
@@ -18318,7 +20240,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
18318
20240
 
18319
20241
  .message-edit-buttons button:hover {
18320
20242
  background-color: var(--jp-layout-color2);
18321
- }`, "",{"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,qBAAqB;AACvB;;AAEA;EACE,2DAA2D;EAC3D,0CAA0C;EAC1C,aAAa;EACb,kBAAkB;AACpB;;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: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 margin-bottom: 5px;\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":""}]);
20243
+ }`, "",{"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;EAC3C,mBAAmB;AACrB;;AAEA;EACE,qBAAqB;AACvB;;AAEA;EACE,2DAA2D;EAC3D,0CAA0C;EAC1C,aAAa;EACb,kBAAkB;AACpB;;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 margin-bottom: 10px;\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 margin-bottom: 5px;\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":""}]);
18322
20244
  // Exports
18323
20245
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
18324
20246
 
@@ -18805,9 +20727,29 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
18805
20727
  margin: 0 0;
18806
20728
  }
18807
20729
 
20730
+ .scratchpad-result {
20731
+ padding: 8px 12px;
20732
+ border-top: 1px solid var(--jp-cell-editor-border-color);
20733
+ background-color: var(--jp-layout-color1);
20734
+ }
20735
+
20736
+ .scratchpad-result pre {
20737
+ margin: 0;
20738
+ font-family: var(--jp-code-font-family);
20739
+ font-size: var(--jp-code-font-size);
20740
+ color: var(--jp-ui-font-color2);
20741
+ white-space: pre-wrap;
20742
+ word-wrap: break-word;
20743
+ max-height: 200px;
20744
+ overflow-y: auto;
20745
+ }
18808
20746
 
20747
+ .scratchpad-result-warning {
20748
+ color: var(--jp-warn-color1, #f0a000);
20749
+ font-style: italic;
20750
+ }
18809
20751
 
18810
- `, "",{"version":3,"sources":["webpack://./style/CodeBlock.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;EACE,aAAa;EACb,sBAAsB;EACtB,kBAAkB;EAClB,cAAc;;EAEd,8CAA8C;EAC9C,kBAAkB;EAClB,oDAAoD;EACpD,gBAAgB;AAClB;;AAEA;EACE,WAAW;EACX,gBAAgB;AAClB;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,mBAAmB;EACnB,oBAAoB;;EAEpB,WAAW;EACX,2DAA2D;EAC3D,2DAA2D;EAC3D,gBAAgB;AAClB;;AAEA;EACE,YAAY;EACZ,gBAAgB;EAChB,0CAA0C;AAC5C;;AAEA;EACE,2DAA2D;EAC3D,YAAY;EACZ,yDAAyD;EACzD,kBAAkB;;EAElB,gBAAgB;EAChB,0CAA0C;AAC5C;;AAEA;EACE,8CAA8C;EAC9C,+CAA+C;AACjD;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,UAAU;EACV,gBAAgB;AAClB;;AAEA;EACE,aAAa;EACb,uBAAuB;EACvB,mBAAmB;EACnB,cAAc;EACd,WAAW;EACX,8CAA8C;EAC9C,iCAAiC;EACjC,eAAe;AACjB;;AAEA;EACE,qCAAqC;AACvC;;AAEA;EACE,cAAc;EACd,SAAS;AACX;;AAEA;EACE,6BAA6B;AAC/B;;AAEA;EACE,eAAe;EACf,aAAa;EACb,+BAA+B;EAC/B,aAAa;EACb,8BAA8B;EAC9B,mBAAmB;EACnB,oDAAoD;EACpD,kBAAkB;EAClB,8DAA8D;AAChE;;AAEA;EACE,yCAAyC;AAC3C;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,yCAAyC;AAC3C;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,SAAS;EACT,OAAO;EACP,YAAY;AACd;;AAEA;EACE,cAAc;AAChB;;AAEA;EACE,cAAc;AAChB;;AAEA;EACE,YAAY;EACZ,0BAA0B;EAC1B,yCAAyC;AAC3C;;AAEA;EACE,YAAY;EACZ,WAAW;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.code-block-container {\n display: flex;\n flex-direction: column;\n position: relative;\n margin: 10px 0;\n\n background-color: var(--chat-background-color);\n border-radius: 4px;\n border: 1px solid var(--jp-cell-editor-border-color);\n overflow: hidden;\n}\n\n.code-content {\n width: 100%;\n overflow-x: auto;\n}\n\n.code-block-toolbar {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: end;\n\n width: 100%;\n background-color: var(--chat-user-message-background-color);\n border-bottom: 1px solid var(--jp-cell-editor-border-color);\n font-size: 0.8em;\n}\n\n.code-location {\n flex-grow: 1;\n margin-left: 5px;\n color: var(--chat-user-message-font-color);\n}\n\n.code-block-toolbar button {\n background-color: var(--chat-user-message-background-color);\n border: none;\n border-left: 1px solid var(--jp-cell-editor-border-color);\n border-radius: 0px;\n\n font-size: 0.8em;\n color: var(--chat-user-message-font-color);\n}\n\n.code-block-toolbar button:hover {\n background-color: var(--chat-background-color);\n color: var(--chat-assistant-message-font-color);\n}\n\n.active-cell-code-block {\n opacity: 0.7;\n}\n\n.active-cell-code-block:hover {\n opacity: 1;\n transition: 0.3s;\n}\n\n.code-block-expand-button {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 4px 0;\n width: 100%;\n background-color: var(--chat-background-color);\n transition: background-color 0.2s;\n cursor: pointer;\n}\n\n.code-block-expand-button:hover {\n background-color: rgba(0, 0, 0, 0.05);\n}\n\n.code-block-expand-button svg {\n display: block;\n margin: 0;\n}\n\n.code-block-expand-button .icon-button {\n background-color: transparent;\n}\n\n.agent-mode-toggle {\n cursor: pointer;\n padding: 10px;\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: 5px;\n transition: background-color 0.2s ease, border-color 0.2s ease;\n}\n\n.agent-mode-toggle:hover {\n background-color: var(--jp-layout-color3);\n}\n\n.agent-mode-toggle.error-fixup {\n border: none;\n}\n\n.agent-mode-toggle.error-fixup.expanded {\n background-color: var(--jp-layout-color2);\n}\n\n.agent-mode-toggle-content {\n display: flex;\n align-items: center;\n gap: 10px;\n flex: 1;\n min-width: 0;\n}\n\n.agent-mode-toggle-content svg {\n flex-shrink: 0;\n}\n\n.agent-mode-toggle svg:last-child {\n flex-shrink: 0;\n}\n\n.agent-mode-toggle.expanded {\n border: none;\n border-radius: 5px 5px 0 0;\n background-color: var(--jp-layout-color2);\n}\n\n.agent-mode-collapsed {\n border: none;\n margin: 0 0;\n}\n\n\n\n"],"sourceRoot":""}]);
20752
+ `, "",{"version":3,"sources":["webpack://./style/CodeBlock.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;EACE,aAAa;EACb,sBAAsB;EACtB,kBAAkB;EAClB,cAAc;;EAEd,8CAA8C;EAC9C,kBAAkB;EAClB,oDAAoD;EACpD,gBAAgB;AAClB;;AAEA;EACE,WAAW;EACX,gBAAgB;AAClB;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,mBAAmB;EACnB,oBAAoB;;EAEpB,WAAW;EACX,2DAA2D;EAC3D,2DAA2D;EAC3D,gBAAgB;AAClB;;AAEA;EACE,YAAY;EACZ,gBAAgB;EAChB,0CAA0C;AAC5C;;AAEA;EACE,2DAA2D;EAC3D,YAAY;EACZ,yDAAyD;EACzD,kBAAkB;;EAElB,gBAAgB;EAChB,0CAA0C;AAC5C;;AAEA;EACE,8CAA8C;EAC9C,+CAA+C;AACjD;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,UAAU;EACV,gBAAgB;AAClB;;AAEA;EACE,aAAa;EACb,uBAAuB;EACvB,mBAAmB;EACnB,cAAc;EACd,WAAW;EACX,8CAA8C;EAC9C,iCAAiC;EACjC,eAAe;AACjB;;AAEA;EACE,qCAAqC;AACvC;;AAEA;EACE,cAAc;EACd,SAAS;AACX;;AAEA;EACE,6BAA6B;AAC/B;;AAEA;EACE,eAAe;EACf,aAAa;EACb,+BAA+B;EAC/B,aAAa;EACb,8BAA8B;EAC9B,mBAAmB;EACnB,oDAAoD;EACpD,kBAAkB;EAClB,8DAA8D;AAChE;;AAEA;EACE,yCAAyC;AAC3C;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,yCAAyC;AAC3C;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,SAAS;EACT,OAAO;EACP,YAAY;AACd;;AAEA;EACE,cAAc;AAChB;;AAEA;EACE,cAAc;AAChB;;AAEA;EACE,YAAY;EACZ,0BAA0B;EAC1B,yCAAyC;AAC3C;;AAEA;EACE,YAAY;EACZ,WAAW;AACb;;AAEA;EACE,iBAAiB;EACjB,wDAAwD;EACxD,yCAAyC;AAC3C;;AAEA;EACE,SAAS;EACT,uCAAuC;EACvC,mCAAmC;EACnC,+BAA+B;EAC/B,qBAAqB;EACrB,qBAAqB;EACrB,iBAAiB;EACjB,gBAAgB;AAClB;;AAEA;EACE,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.code-block-container {\n display: flex;\n flex-direction: column;\n position: relative;\n margin: 10px 0;\n\n background-color: var(--chat-background-color);\n border-radius: 4px;\n border: 1px solid var(--jp-cell-editor-border-color);\n overflow: hidden;\n}\n\n.code-content {\n width: 100%;\n overflow-x: auto;\n}\n\n.code-block-toolbar {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: end;\n\n width: 100%;\n background-color: var(--chat-user-message-background-color);\n border-bottom: 1px solid var(--jp-cell-editor-border-color);\n font-size: 0.8em;\n}\n\n.code-location {\n flex-grow: 1;\n margin-left: 5px;\n color: var(--chat-user-message-font-color);\n}\n\n.code-block-toolbar button {\n background-color: var(--chat-user-message-background-color);\n border: none;\n border-left: 1px solid var(--jp-cell-editor-border-color);\n border-radius: 0px;\n\n font-size: 0.8em;\n color: var(--chat-user-message-font-color);\n}\n\n.code-block-toolbar button:hover {\n background-color: var(--chat-background-color);\n color: var(--chat-assistant-message-font-color);\n}\n\n.active-cell-code-block {\n opacity: 0.7;\n}\n\n.active-cell-code-block:hover {\n opacity: 1;\n transition: 0.3s;\n}\n\n.code-block-expand-button {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 4px 0;\n width: 100%;\n background-color: var(--chat-background-color);\n transition: background-color 0.2s;\n cursor: pointer;\n}\n\n.code-block-expand-button:hover {\n background-color: rgba(0, 0, 0, 0.05);\n}\n\n.code-block-expand-button svg {\n display: block;\n margin: 0;\n}\n\n.code-block-expand-button .icon-button {\n background-color: transparent;\n}\n\n.agent-mode-toggle {\n cursor: pointer;\n padding: 10px;\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: 5px;\n transition: background-color 0.2s ease, border-color 0.2s ease;\n}\n\n.agent-mode-toggle:hover {\n background-color: var(--jp-layout-color3);\n}\n\n.agent-mode-toggle.error-fixup {\n border: none;\n}\n\n.agent-mode-toggle.error-fixup.expanded {\n background-color: var(--jp-layout-color2);\n}\n\n.agent-mode-toggle-content {\n display: flex;\n align-items: center;\n gap: 10px;\n flex: 1;\n min-width: 0;\n}\n\n.agent-mode-toggle-content svg {\n flex-shrink: 0;\n}\n\n.agent-mode-toggle svg:last-child {\n flex-shrink: 0;\n}\n\n.agent-mode-toggle.expanded {\n border: none;\n border-radius: 5px 5px 0 0;\n background-color: var(--jp-layout-color2);\n}\n\n.agent-mode-collapsed {\n border: none;\n margin: 0 0;\n}\n\n.scratchpad-result {\n padding: 8px 12px;\n border-top: 1px solid var(--jp-cell-editor-border-color);\n background-color: var(--jp-layout-color1);\n}\n\n.scratchpad-result pre {\n margin: 0;\n font-family: var(--jp-code-font-family);\n font-size: var(--jp-code-font-size);\n color: var(--jp-ui-font-color2);\n white-space: pre-wrap;\n word-wrap: break-word;\n max-height: 200px;\n overflow-y: auto;\n}\n\n.scratchpad-result-warning {\n color: var(--jp-warn-color1, #f0a000);\n font-style: italic;\n}\n\n"],"sourceRoot":""}]);
18811
20753
  // Exports
18812
20754
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
18813
20755
 
@@ -22091,6 +24033,12 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
22091
24033
  padding: 5px 10px;
22092
24034
  }
22093
24035
 
24036
+ .button-base:disabled {
24037
+ opacity: 0.6;
24038
+ cursor: not-allowed;
24039
+ pointer-events: none;
24040
+ }
24041
+
22094
24042
  .button-green {
22095
24043
  background-color: var(--green-400);
22096
24044
  color: var(--green-900) !important;
@@ -22127,6 +24075,10 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
22127
24075
  background-color: var(--purple-400);
22128
24076
  }
22129
24077
 
24078
+ .button-purple:disabled:hover {
24079
+ background-color: var(--purple-300);
24080
+ }
24081
+
22130
24082
  .button-blue {
22131
24083
  background-color: var(--blue-300);
22132
24084
  color: var(--blue-900) !important;
@@ -22160,7 +24112,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
22160
24112
  font-size: 12px;
22161
24113
  padding: 2px 5px;
22162
24114
  }
22163
- `, "",{"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,iCAAiC;EACjC,iCAAiC;EACjC,mCAAmC;EACnC,kBAAkB;AACpB;;AAEA;EACE,iCAAiC;AACnC;;AAEA;EACE,mCAAmC;EACnC,8BAA8B;AAChC;;AAEA;EACE,mCAAmC;AACrC;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,oCAAoC;EACpC,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-blue {\n background-color: var(--blue-300);\n color: var(--blue-900) !important;\n border: 0.5px solid var(--blue-900);\n border-radius: 4px;\n}\n\n.button-blue:hover {\n background-color: var(--blue-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: var(--toolbar-button-height);\n font-size: 12px;\n padding: 2px 5px;\n}\n"],"sourceRoot":""}]);
24115
+ `, "",{"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,YAAY;EACZ,mBAAmB;EACnB,oBAAoB;AACtB;;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;AACrC;;AAEA;EACE,iCAAiC;EACjC,iCAAiC;EACjC,mCAAmC;EACnC,kBAAkB;AACpB;;AAEA;EACE,iCAAiC;AACnC;;AAEA;EACE,mCAAmC;EACnC,8BAA8B;AAChC;;AAEA;EACE,mCAAmC;AACrC;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,oCAAoC;EACpC,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-base:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n pointer-events: none;\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-purple:disabled:hover {\n background-color: var(--purple-300);\n}\n\n.button-blue {\n background-color: var(--blue-300);\n color: var(--blue-900) !important;\n border: 0.5px solid var(--blue-900);\n border-radius: 4px;\n}\n\n.button-blue:hover {\n background-color: var(--blue-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: var(--toolbar-button-height);\n font-size: 12px;\n padding: 2px 5px;\n}\n"],"sourceRoot":""}]);
22164
24116
  // Exports
22165
24117
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
22166
24118
 
@@ -22525,6 +24477,60 @@ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js
22525
24477
  /* 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);
22526
24478
 
22527
24479
 
24480
+ /***/ }),
24481
+
24482
+ /***/ "./style/AskUserQuestionToolUI.css":
24483
+ /*!*****************************************!*\
24484
+ !*** ./style/AskUserQuestionToolUI.css ***!
24485
+ \*****************************************/
24486
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
24487
+
24488
+ __webpack_require__.r(__webpack_exports__);
24489
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
24490
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
24491
+ /* harmony export */ });
24492
+ /* 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");
24493
+ /* 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__);
24494
+ /* 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");
24495
+ /* 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__);
24496
+ /* 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");
24497
+ /* 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__);
24498
+ /* 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");
24499
+ /* 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__);
24500
+ /* 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");
24501
+ /* 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__);
24502
+ /* 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");
24503
+ /* 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__);
24504
+ /* harmony import */ var _node_modules_css_loader_dist_cjs_js_AskUserQuestionToolUI_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../node_modules/css-loader/dist/cjs.js!./AskUserQuestionToolUI.css */ "./node_modules/css-loader/dist/cjs.js!./style/AskUserQuestionToolUI.css");
24505
+
24506
+
24507
+
24508
+
24509
+
24510
+
24511
+
24512
+
24513
+
24514
+
24515
+
24516
+ var options = {};
24517
+
24518
+ options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default());
24519
+ options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default());
24520
+
24521
+ options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head");
24522
+
24523
+ options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());
24524
+ options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());
24525
+
24526
+ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_AskUserQuestionToolUI_css__WEBPACK_IMPORTED_MODULE_6__["default"], options);
24527
+
24528
+
24529
+
24530
+
24531
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_AskUserQuestionToolUI_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_AskUserQuestionToolUI_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_AskUserQuestionToolUI_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined);
24532
+
24533
+
22528
24534
  /***/ }),
22529
24535
 
22530
24536
  /***/ "./style/AssumptionTool.css":
@@ -22741,6 +24747,114 @@ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js
22741
24747
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_CellReference_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_CellReference_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_CellReference_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined);
22742
24748
 
22743
24749
 
24750
+ /***/ }),
24751
+
24752
+ /***/ "./style/ChartWizardPlugin.css":
24753
+ /*!*************************************!*\
24754
+ !*** ./style/ChartWizardPlugin.css ***!
24755
+ \*************************************/
24756
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
24757
+
24758
+ __webpack_require__.r(__webpack_exports__);
24759
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
24760
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
24761
+ /* harmony export */ });
24762
+ /* 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");
24763
+ /* 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__);
24764
+ /* 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");
24765
+ /* 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__);
24766
+ /* 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");
24767
+ /* 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__);
24768
+ /* 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");
24769
+ /* 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__);
24770
+ /* 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");
24771
+ /* 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__);
24772
+ /* 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");
24773
+ /* 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__);
24774
+ /* harmony import */ var _node_modules_css_loader_dist_cjs_js_ChartWizardPlugin_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../node_modules/css-loader/dist/cjs.js!./ChartWizardPlugin.css */ "./node_modules/css-loader/dist/cjs.js!./style/ChartWizardPlugin.css");
24775
+
24776
+
24777
+
24778
+
24779
+
24780
+
24781
+
24782
+
24783
+
24784
+
24785
+
24786
+ var options = {};
24787
+
24788
+ options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default());
24789
+ options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default());
24790
+
24791
+ options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head");
24792
+
24793
+ options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());
24794
+ options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());
24795
+
24796
+ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_ChartWizardPlugin_css__WEBPACK_IMPORTED_MODULE_6__["default"], options);
24797
+
24798
+
24799
+
24800
+
24801
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_ChartWizardPlugin_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_ChartWizardPlugin_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_ChartWizardPlugin_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined);
24802
+
24803
+
24804
+ /***/ }),
24805
+
24806
+ /***/ "./style/ChartWizardWidget.css":
24807
+ /*!*************************************!*\
24808
+ !*** ./style/ChartWizardWidget.css ***!
24809
+ \*************************************/
24810
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
24811
+
24812
+ __webpack_require__.r(__webpack_exports__);
24813
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
24814
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
24815
+ /* harmony export */ });
24816
+ /* 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");
24817
+ /* 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__);
24818
+ /* 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");
24819
+ /* 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__);
24820
+ /* 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");
24821
+ /* 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__);
24822
+ /* 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");
24823
+ /* 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__);
24824
+ /* 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");
24825
+ /* 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__);
24826
+ /* 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");
24827
+ /* 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__);
24828
+ /* harmony import */ var _node_modules_css_loader_dist_cjs_js_ChartWizardWidget_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../node_modules/css-loader/dist/cjs.js!./ChartWizardWidget.css */ "./node_modules/css-loader/dist/cjs.js!./style/ChartWizardWidget.css");
24829
+
24830
+
24831
+
24832
+
24833
+
24834
+
24835
+
24836
+
24837
+
24838
+
24839
+
24840
+ var options = {};
24841
+
24842
+ options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default());
24843
+ options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default());
24844
+
24845
+ options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head");
24846
+
24847
+ options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());
24848
+ options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());
24849
+
24850
+ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_ChartWizardWidget_css__WEBPACK_IMPORTED_MODULE_6__["default"], options);
24851
+
24852
+
24853
+
24854
+
24855
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_ChartWizardWidget_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_ChartWizardWidget_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_ChartWizardWidget_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined);
24856
+
24857
+
22744
24858
  /***/ }),
22745
24859
 
22746
24860
  /***/ "./style/ChatDropdown.css":
@@ -24580,4 +26694,4 @@ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js
24580
26694
  /***/ })
24581
26695
 
24582
26696
  }]);
24583
- //# sourceMappingURL=lib_index_js.dfd7975de75d64db80d6.js.map
26697
+ //# sourceMappingURL=lib_index_js.9d26322f3e78beb2b666.js.map