mito-ai 0.1.43__py3-none-any.whl → 0.1.44__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of mito-ai might be problematic. Click here for more details.
- mito_ai/__init__.py +3 -3
- mito_ai/_version.py +1 -1
- mito_ai/{app_builder → app_deploy}/__init__.py +1 -1
- mito_ai/{app_builder → app_deploy}/handlers.py +39 -28
- mito_ai/{app_builder → app_deploy}/models.py +13 -13
- mito_ai/app_manager/handlers.py +33 -0
- mito_ai/app_manager/models.py +15 -1
- mito_ai/completions/handlers.py +13 -0
- mito_ai/completions/models.py +4 -1
- mito_ai/completions/prompt_builders/agent_system_message.py +6 -4
- mito_ai/completions/providers.py +5 -11
- mito_ai/streamlit_conversion/streamlit_agent_handler.py +1 -1
- mito_ai/streamlit_conversion/streamlit_utils.py +10 -0
- mito_ai/streamlit_preview/handlers.py +47 -71
- mito_ai/streamlit_preview/utils.py +41 -0
- mito_ai/tests/streamlit_preview/test_streamlit_preview_handler.py +88 -0
- mito_ai/tests/streamlit_preview/test_streamlit_preview_manager.py +4 -1
- mito_ai/utils/telemetry_utils.py +15 -5
- {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/build_log.json +1 -1
- {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/package.json +2 -2
- {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/schemas/mito_ai/package.json.orig +1 -1
- {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/schemas/mito_ai/toolbar-buttons.json +0 -5
- mito_ai-0.1.43.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.81703ac2bc645e5c2fc2.js → mito_ai-0.1.44.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.cf2e3ad2797fbb53826b.js +1202 -701
- mito_ai-0.1.44.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.cf2e3ad2797fbb53826b.js.map +1 -0
- mito_ai-0.1.43.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.502aef26f0416fab7435.js → mito_ai-0.1.44.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.5482493d1270f55b7283.js +5 -5
- mito_ai-0.1.43.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.502aef26f0416fab7435.js.map → mito_ai-0.1.44.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.5482493d1270f55b7283.js.map +1 -1
- {mito_ai-0.1.43.dist-info → mito_ai-0.1.44.dist-info}/METADATA +1 -1
- {mito_ai-0.1.43.dist-info → mito_ai-0.1.44.dist-info}/RECORD +51 -49
- mito_ai-0.1.43.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.81703ac2bc645e5c2fc2.js.map +0 -1
- {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/etc/jupyter/jupyter_server_config.d/mito_ai.json +0 -0
- {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/static/node_modules_process_browser_js.4b128e94d31a81ebd209.js +0 -0
- {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/static/node_modules_process_browser_js.4b128e94d31a81ebd209.js.map +0 -0
- {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/static/style.js +0 -0
- {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/static/style_index_js.5876024bb17dbd6a3ee6.js +0 -0
- {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/static/style_index_js.5876024bb17dbd6a3ee6.js.map +0 -0
- {mito_ai-0.1.43.data → mito_ai-0.1.44.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
- {mito_ai-0.1.43.data → mito_ai-0.1.44.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
- {mito_ai-0.1.43.data → mito_ai-0.1.44.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
- {mito_ai-0.1.43.data → mito_ai-0.1.44.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
- {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_dist_esm_index_mjs.6bac1a8c4cc93f15f6b7.js +0 -0
- {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_dist_esm_index_mjs.6bac1a8c4cc93f15f6b7.js.map +0 -0
- {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_ui-react_dist_esm_index_mjs.4fcecd65bef9e9847609.js +0 -0
- {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_ui-react_dist_esm_index_mjs.4fcecd65bef9e9847609.js.map +0 -0
- {mito_ai-0.1.43.data → mito_ai-0.1.44.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
- {mito_ai-0.1.43.data → mito_ai-0.1.44.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
- {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_semver_index_js.3f6754ac5116d47de76b.js +0 -0
- {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_semver_index_js.3f6754ac5116d47de76b.js.map +0 -0
- {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_vscode-diff_dist_index_js.ea55f1f9346638aafbcf.js +0 -0
- {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_vscode-diff_dist_index_js.ea55f1f9346638aafbcf.js.map +0 -0
- {mito_ai-0.1.43.dist-info → mito_ai-0.1.44.dist-info}/WHEEL +0 -0
- {mito_ai-0.1.43.dist-info → mito_ai-0.1.44.dist-info}/entry_points.txt +0 -0
- {mito_ai-0.1.43.dist-info → mito_ai-0.1.44.dist-info}/licenses/LICENSE +0 -0
|
@@ -213,9 +213,10 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
213
213
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
214
214
|
/* harmony export */ ChatHistoryManager: () => (/* binding */ ChatHistoryManager)
|
|
215
215
|
/* harmony export */ });
|
|
216
|
-
/* harmony import */ var
|
|
217
|
-
/* harmony import */ var
|
|
218
|
-
/* harmony import */ var
|
|
216
|
+
/* harmony import */ var _utils_notebook__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/notebook */ "./lib/utils/notebook.js");
|
|
217
|
+
/* harmony import */ var _utils_strings__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/strings */ "./lib/utils/strings.js");
|
|
218
|
+
/* harmony import */ var _utils_user__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/user */ "./lib/utils/user.js");
|
|
219
|
+
/* harmony import */ var _validationUtils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./validationUtils */ "./lib/Extensions/AiChat/validationUtils.js");
|
|
219
220
|
/*
|
|
220
221
|
* Copyright (c) Saga Inc.
|
|
221
222
|
* Distributed under the terms of the GNU Affero General Public License v3.0 License.
|
|
@@ -223,6 +224,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
223
224
|
|
|
224
225
|
|
|
225
226
|
|
|
227
|
+
|
|
226
228
|
/*
|
|
227
229
|
The ChatHistoryManager is responsible for managing the AI chat history.
|
|
228
230
|
|
|
@@ -271,6 +273,11 @@ class ChatHistoryManager {
|
|
|
271
273
|
this._allAssumptions.clear();
|
|
272
274
|
this.displayOptimizedChatHistory.forEach(item => {
|
|
273
275
|
var _a;
|
|
276
|
+
// Validate the agent response if it exists
|
|
277
|
+
if (item.agentResponse !== undefined) {
|
|
278
|
+
item.agentResponse = (0,_validationUtils__WEBPACK_IMPORTED_MODULE_0__.validateAndCorrectAgentResponse)(item.agentResponse);
|
|
279
|
+
}
|
|
280
|
+
// Process the assumptions
|
|
274
281
|
if ((_a = item.agentResponse) === null || _a === void 0 ? void 0 : _a.analysis_assumptions) {
|
|
275
282
|
item.agentResponse.analysis_assumptions.forEach(assumption => {
|
|
276
283
|
this._allAssumptions.add(assumption);
|
|
@@ -308,12 +315,13 @@ class ChatHistoryManager {
|
|
|
308
315
|
});
|
|
309
316
|
}
|
|
310
317
|
async addChatInputMessage(input, activeThreadId, messageIndex, additionalContext) {
|
|
311
|
-
const activeCellCode = (0,
|
|
312
|
-
const activeCellID = (0,
|
|
318
|
+
const activeCellCode = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_1__.getActiveCellCode)(this.notebookTracker) || '';
|
|
319
|
+
const activeCellID = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_1__.getActiveCellID)(this.notebookTracker) || '';
|
|
320
|
+
const activeNotebookContext = this.contextManager.getActiveNotebookContext();
|
|
313
321
|
const chatMessageMetadata = {
|
|
314
322
|
promptType: 'chat',
|
|
315
|
-
variables:
|
|
316
|
-
files:
|
|
323
|
+
variables: (activeNotebookContext === null || activeNotebookContext === void 0 ? void 0 : activeNotebookContext.variables) || [],
|
|
324
|
+
files: (activeNotebookContext === null || activeNotebookContext === void 0 ? void 0 : activeNotebookContext.files) || [],
|
|
317
325
|
activeCellCode: activeCellCode,
|
|
318
326
|
activeCellId: activeCellID,
|
|
319
327
|
input: input,
|
|
@@ -330,16 +338,17 @@ class ChatHistoryManager {
|
|
|
330
338
|
});
|
|
331
339
|
return chatMessageMetadata;
|
|
332
340
|
}
|
|
333
|
-
addAgentExecutionMessage(activeThreadId, input, additionalContext) {
|
|
334
|
-
const aiOptimizedCells = (0,
|
|
341
|
+
addAgentExecutionMessage(activeThreadId, notebookPanel, input, additionalContext) {
|
|
342
|
+
const aiOptimizedCells = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_1__.getAIOptimizedCellsInNotebookPanel)(notebookPanel);
|
|
343
|
+
const notebookContext = this.contextManager.getNotebookContext(notebookPanel.id);
|
|
335
344
|
const agentExecutionMetadata = {
|
|
336
345
|
promptType: 'agent:execution',
|
|
337
|
-
variables:
|
|
338
|
-
files:
|
|
346
|
+
variables: (notebookContext === null || notebookContext === void 0 ? void 0 : notebookContext.variables) || [],
|
|
347
|
+
files: (notebookContext === null || notebookContext === void 0 ? void 0 : notebookContext.files) || [],
|
|
339
348
|
aiOptimizedCells: aiOptimizedCells,
|
|
340
349
|
input: input || '',
|
|
341
350
|
threadId: activeThreadId,
|
|
342
|
-
isChromeBrowser: (0,
|
|
351
|
+
isChromeBrowser: (0,_utils_user__WEBPACK_IMPORTED_MODULE_2__.isChromeBasedBrowser)(),
|
|
343
352
|
additionalContext: additionalContext
|
|
344
353
|
};
|
|
345
354
|
// We use this function in two ways:
|
|
@@ -364,16 +373,14 @@ class ChatHistoryManager {
|
|
|
364
373
|
});
|
|
365
374
|
return agentExecutionMetadata;
|
|
366
375
|
}
|
|
367
|
-
dropMessagesStartingAtIndex(index) {
|
|
368
|
-
this.displayOptimizedChatHistory.splice(index);
|
|
369
|
-
}
|
|
370
376
|
addSmartDebugMessage(activeThreadId, errorMessage) {
|
|
371
|
-
const activeCellID = (0,
|
|
372
|
-
const activeCellCode = (0,
|
|
377
|
+
const activeCellID = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_1__.getActiveCellID)(this.notebookTracker) || '';
|
|
378
|
+
const activeCellCode = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_1__.getCellCodeByID)(this.notebookTracker, activeCellID) || '';
|
|
379
|
+
const activeNotebookContext = this.contextManager.getActiveNotebookContext();
|
|
373
380
|
const smartDebugMetadata = {
|
|
374
381
|
promptType: 'smartDebug',
|
|
375
|
-
variables:
|
|
376
|
-
files:
|
|
382
|
+
variables: (activeNotebookContext === null || activeNotebookContext === void 0 ? void 0 : activeNotebookContext.variables) || [],
|
|
383
|
+
files: (activeNotebookContext === null || activeNotebookContext === void 0 ? void 0 : activeNotebookContext.files) || [],
|
|
377
384
|
activeCellCode: activeCellCode,
|
|
378
385
|
activeCellId: activeCellID,
|
|
379
386
|
errorMessage: errorMessage,
|
|
@@ -387,18 +394,19 @@ class ChatHistoryManager {
|
|
|
387
394
|
});
|
|
388
395
|
return smartDebugMetadata;
|
|
389
396
|
}
|
|
390
|
-
addAgentSmartDebugMessage(activeThreadId, errorMessage) {
|
|
391
|
-
const activeCellID = (0,
|
|
392
|
-
const activeCellCode = (0,
|
|
397
|
+
addAgentSmartDebugMessage(activeThreadId, errorMessage, notebookPanel) {
|
|
398
|
+
const activeCellID = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_1__.getActiveCellIDInNotebookPanel)(notebookPanel);
|
|
399
|
+
const activeCellCode = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_1__.getCellCodeByIDInNotebookPanel)(notebookPanel, activeCellID);
|
|
400
|
+
const notebookContext = this.contextManager.getNotebookContext(notebookPanel.id);
|
|
393
401
|
const agentSmartDebugMetadata = {
|
|
394
402
|
promptType: 'agent:autoErrorFixup',
|
|
395
|
-
aiOptimizedCells: (0,
|
|
396
|
-
variables:
|
|
397
|
-
files:
|
|
403
|
+
aiOptimizedCells: (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_1__.getAIOptimizedCellsInNotebookPanel)(notebookPanel),
|
|
404
|
+
variables: (notebookContext === null || notebookContext === void 0 ? void 0 : notebookContext.variables) || [],
|
|
405
|
+
files: (notebookContext === null || notebookContext === void 0 ? void 0 : notebookContext.files) || [],
|
|
398
406
|
errorMessage: errorMessage,
|
|
399
407
|
error_message_producing_code_cell_id: activeCellID || '',
|
|
400
408
|
threadId: activeThreadId,
|
|
401
|
-
isChromeBrowser: (0,
|
|
409
|
+
isChromeBrowser: (0,_utils_user__WEBPACK_IMPORTED_MODULE_2__.isChromeBasedBrowser)()
|
|
402
410
|
};
|
|
403
411
|
this.displayOptimizedChatHistory.push({
|
|
404
412
|
message: getDisplayedOptimizedUserMessage(errorMessage, activeCellCode),
|
|
@@ -409,11 +417,12 @@ class ChatHistoryManager {
|
|
|
409
417
|
return agentSmartDebugMetadata;
|
|
410
418
|
}
|
|
411
419
|
addExplainCodeMessage(activeThreadId) {
|
|
412
|
-
const activeCellID = (0,
|
|
413
|
-
const activeCellCode = (0,
|
|
420
|
+
const activeCellID = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_1__.getActiveCellID)(this.notebookTracker);
|
|
421
|
+
const activeCellCode = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_1__.getCellCodeByID)(this.notebookTracker, activeCellID);
|
|
422
|
+
const activeNotebookContext = this.contextManager.getActiveNotebookContext();
|
|
414
423
|
const codeExplainMetadata = {
|
|
415
424
|
promptType: 'codeExplain',
|
|
416
|
-
variables:
|
|
425
|
+
variables: (activeNotebookContext === null || activeNotebookContext === void 0 ? void 0 : activeNotebookContext.variables) || [],
|
|
417
426
|
activeCellCode,
|
|
418
427
|
threadId: activeThreadId
|
|
419
428
|
};
|
|
@@ -440,7 +449,7 @@ class ChatHistoryManager {
|
|
|
440
449
|
else {
|
|
441
450
|
type = 'openai message';
|
|
442
451
|
}
|
|
443
|
-
const activeCellID = (0,
|
|
452
|
+
const activeCellID = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_1__.getActiveCellID)(this.notebookTracker);
|
|
444
453
|
this.displayOptimizedChatHistory.push({
|
|
445
454
|
message: aiMessage,
|
|
446
455
|
type: type,
|
|
@@ -467,13 +476,14 @@ class ChatHistoryManager {
|
|
|
467
476
|
}
|
|
468
477
|
addAIMessageFromAgentResponse(agentResponse) {
|
|
469
478
|
var _a;
|
|
479
|
+
agentResponse = (0,_validationUtils__WEBPACK_IMPORTED_MODULE_0__.validateAndCorrectAgentResponse)(agentResponse);
|
|
470
480
|
let content = agentResponse.message;
|
|
471
481
|
if (agentResponse.type === 'cell_update') {
|
|
472
482
|
// For cell_update messages, we want to display the code the agent wrote along with
|
|
473
483
|
// the message it sent. For all other agent responses, we ignore all other fields
|
|
474
484
|
// and just display the message.
|
|
475
485
|
const code = (_a = agentResponse.cell_update) === null || _a === void 0 ? void 0 : _a.code;
|
|
476
|
-
const codeWithMarkdownFormatting = (0,
|
|
486
|
+
const codeWithMarkdownFormatting = (0,_utils_strings__WEBPACK_IMPORTED_MODULE_3__.addMarkdownCodeFormatting)(code);
|
|
477
487
|
if (codeWithMarkdownFormatting !== undefined) {
|
|
478
488
|
content = content + '\n\n' + codeWithMarkdownFormatting;
|
|
479
489
|
}
|
|
@@ -489,6 +499,9 @@ class ChatHistoryManager {
|
|
|
489
499
|
agentResponse: this.deduplicateAssumptions(agentResponse)
|
|
490
500
|
});
|
|
491
501
|
}
|
|
502
|
+
dropMessagesStartingAtIndex(index) {
|
|
503
|
+
this.displayOptimizedChatHistory.splice(index);
|
|
504
|
+
}
|
|
492
505
|
}
|
|
493
506
|
const getDisplayedOptimizedUserMessage = (input, activeCellCode, messageToAgent = false) => {
|
|
494
507
|
// Don't include the active cell code if it is an agent planning message
|
|
@@ -686,7 +699,29 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
686
699
|
|
|
687
700
|
|
|
688
701
|
|
|
689
|
-
const
|
|
702
|
+
const priortizeByType = (options, maxPerType) => {
|
|
703
|
+
/*
|
|
704
|
+
Makes sure that some of each type are displayed at the top of the dropdown so
|
|
705
|
+
users can easily see what types of options are available to them.
|
|
706
|
+
*/
|
|
707
|
+
const typeCounts = {};
|
|
708
|
+
const prioritizedOptions = [];
|
|
709
|
+
const extraOptions = [];
|
|
710
|
+
for (const option of options) {
|
|
711
|
+
const type = option.type;
|
|
712
|
+
const currentCount = typeCounts[type] || 0;
|
|
713
|
+
if (currentCount < maxPerType) {
|
|
714
|
+
prioritizedOptions.push(option);
|
|
715
|
+
typeCounts[type] = currentCount + 1;
|
|
716
|
+
}
|
|
717
|
+
else {
|
|
718
|
+
extraOptions.push(option);
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
// Return prioritized options first, then extras at the bottom
|
|
722
|
+
return [...prioritizedOptions, ...extraOptions];
|
|
723
|
+
};
|
|
724
|
+
const ChatDropdown = ({ options, onSelect, filterText, isDropdownFromButton = false, onFilterChange, onClose, }) => {
|
|
690
725
|
const [selectedIndex, setSelectedIndex] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(0);
|
|
691
726
|
const [localFilterText, setLocalFilterText] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(filterText);
|
|
692
727
|
const searchInputRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);
|
|
@@ -761,7 +796,7 @@ const ChatDropdown = ({ options, onSelect, filterText, maxDropdownItems = 10, is
|
|
|
761
796
|
variable: variable
|
|
762
797
|
})),
|
|
763
798
|
];
|
|
764
|
-
|
|
799
|
+
let searchFilteredOptions = allOptions.filter((option) => {
|
|
765
800
|
if (option.type === 'variable') {
|
|
766
801
|
return option.variable.variable_name.toLowerCase().includes(effectiveFilterText.toLowerCase()) &&
|
|
767
802
|
option.variable.type !== "<class 'module'>" &&
|
|
@@ -777,7 +812,12 @@ const ChatDropdown = ({ options, onSelect, filterText, maxDropdownItems = 10, is
|
|
|
777
812
|
else {
|
|
778
813
|
return option.rule.toLowerCase().includes(effectiveFilterText.toLowerCase());
|
|
779
814
|
}
|
|
780
|
-
})
|
|
815
|
+
});
|
|
816
|
+
// If user is searching (has filter text), show all matches
|
|
817
|
+
// Otherwise, show only 3 of each type by default
|
|
818
|
+
if (effectiveFilterText.trim() === '') {
|
|
819
|
+
searchFilteredOptions = priortizeByType(searchFilteredOptions, 3);
|
|
820
|
+
}
|
|
781
821
|
(0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
|
|
782
822
|
setSelectedIndex(0);
|
|
783
823
|
}, [options, rules, effectiveFilterText]);
|
|
@@ -786,18 +826,18 @@ const ChatDropdown = ({ options, onSelect, filterText, maxDropdownItems = 10, is
|
|
|
786
826
|
case 'ArrowDown':
|
|
787
827
|
case 'Down':
|
|
788
828
|
event.preventDefault();
|
|
789
|
-
setSelectedIndex((prev) => prev <
|
|
829
|
+
setSelectedIndex((prev) => prev < searchFilteredOptions.length - 1 ? prev + 1 : 0);
|
|
790
830
|
break;
|
|
791
831
|
case 'ArrowUp':
|
|
792
832
|
case 'Up':
|
|
793
833
|
event.preventDefault();
|
|
794
|
-
setSelectedIndex((prev) => prev > 0 ? prev - 1 :
|
|
834
|
+
setSelectedIndex((prev) => prev > 0 ? prev - 1 : searchFilteredOptions.length - 1);
|
|
795
835
|
break;
|
|
796
836
|
case 'Enter':
|
|
797
837
|
case 'Return':
|
|
798
838
|
case 'Tab': {
|
|
799
839
|
event.preventDefault();
|
|
800
|
-
const selectedOption =
|
|
840
|
+
const selectedOption = searchFilteredOptions[selectedIndex];
|
|
801
841
|
if (selectedOption !== undefined) {
|
|
802
842
|
if (selectedOption.type === 'variable') {
|
|
803
843
|
onSelect(selectedOption);
|
|
@@ -813,7 +853,7 @@ const ChatDropdown = ({ options, onSelect, filterText, maxDropdownItems = 10, is
|
|
|
813
853
|
(0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
|
|
814
854
|
document.addEventListener('keydown', handleKeyDown);
|
|
815
855
|
return () => document.removeEventListener('keydown', handleKeyDown);
|
|
816
|
-
}, [
|
|
856
|
+
}, [searchFilteredOptions, selectedIndex]);
|
|
817
857
|
// Handle click outside to close dropdown
|
|
818
858
|
(0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
|
|
819
859
|
const handleClickOutside = (event) => {
|
|
@@ -851,8 +891,8 @@ const ChatDropdown = ({ options, onSelect, filterText, maxDropdownItems = 10, is
|
|
|
851
891
|
isDropdownFromButton && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "chat-dropdown-search" },
|
|
852
892
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { ref: searchInputRef, type: "text", placeholder: "Search variables and rules...", value: localFilterText, onChange: handleSearchInputChange, onKeyDown: handleSearchInputKeyDown, className: "chat-dropdown-search-input" }))),
|
|
853
893
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("ul", { className: "chat-dropdown-list", "data-testid": "chat-dropdown-list" },
|
|
854
|
-
|
|
855
|
-
|
|
894
|
+
searchFilteredOptions.length === 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("li", { className: "chat-dropdown-item", "data-testid": "chat-dropdown-empty-item" }, "No variables found")),
|
|
895
|
+
searchFilteredOptions.map((option, index) => {
|
|
856
896
|
switch (option.type) {
|
|
857
897
|
case 'variable': {
|
|
858
898
|
const uniqueKey = option.variable.parent_df
|
|
@@ -990,7 +1030,6 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
990
1030
|
const ChatInput = ({ app, initialContent, placeholder, onSave, onCancel, isEditing, contextManager, notebookTracker, agentModeEnabled = false, agentExecutionStatus = 'idle', }) => {
|
|
991
1031
|
var _a;
|
|
992
1032
|
const [input, setInput] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(initialContent);
|
|
993
|
-
const [expandedVariables, setExpandedVariables] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);
|
|
994
1033
|
const textAreaRef = react__WEBPACK_IMPORTED_MODULE_0___default().useRef(null);
|
|
995
1034
|
const [activeCellID, setActiveCellID] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)((0,_utils_notebook__WEBPACK_IMPORTED_MODULE_3__.getActiveCellID)(notebookTracker));
|
|
996
1035
|
const activeCellCode = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_3__.getActiveCellCode)(notebookTracker) || '';
|
|
@@ -1175,22 +1214,22 @@ const ChatInput = ({ app, initialContent, placeholder, onSave, onCancel, isEditi
|
|
|
1175
1214
|
});
|
|
1176
1215
|
return result;
|
|
1177
1216
|
};
|
|
1178
|
-
|
|
1179
|
-
|
|
1217
|
+
const getExpandedVarialbes = () => {
|
|
1218
|
+
const activeNotebookContext = contextManager === null || contextManager === void 0 ? void 0 : contextManager.getActiveNotebookContext();
|
|
1180
1219
|
const expandedVariables = [
|
|
1181
1220
|
// Add base variables (excluding DataFrames)
|
|
1182
|
-
...((
|
|
1221
|
+
...((activeNotebookContext === null || activeNotebookContext === void 0 ? void 0 : activeNotebookContext.variables.filter(variable => variable.type !== "pd.DataFrame")) || []),
|
|
1183
1222
|
// Add DataFrames
|
|
1184
|
-
...((
|
|
1223
|
+
...((activeNotebookContext === null || activeNotebookContext === void 0 ? void 0 : activeNotebookContext.variables.filter((variable) => variable.type === "pd.DataFrame")) || []),
|
|
1185
1224
|
// Add series with parent DataFrame references
|
|
1186
|
-
...((
|
|
1225
|
+
...((activeNotebookContext === null || activeNotebookContext === void 0 ? void 0 : activeNotebookContext.variables.filter((variable) => variable.type === "pd.DataFrame").flatMap((df) => Object.entries(df.value).map(([seriesName, _]) => ({
|
|
1187
1226
|
variable_name: seriesName,
|
|
1188
1227
|
type: "col",
|
|
1189
1228
|
value: "replace_me",
|
|
1190
1229
|
parent_df: df.variable_name,
|
|
1191
1230
|
})))) || []),
|
|
1192
1231
|
// Add files
|
|
1193
|
-
...((
|
|
1232
|
+
...((activeNotebookContext === null || activeNotebookContext === void 0 ? void 0 : activeNotebookContext.files.map(file => {
|
|
1194
1233
|
var _a;
|
|
1195
1234
|
return ({
|
|
1196
1235
|
variable_name: file.file_name,
|
|
@@ -1200,8 +1239,8 @@ const ChatInput = ({ app, initialContent, placeholder, onSave, onCancel, isEditi
|
|
|
1200
1239
|
});
|
|
1201
1240
|
})) || [])
|
|
1202
1241
|
];
|
|
1203
|
-
|
|
1204
|
-
}
|
|
1242
|
+
return expandedVariables;
|
|
1243
|
+
};
|
|
1205
1244
|
// Automatically add active cell context when in Chat mode and there's active cell code
|
|
1206
1245
|
(0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
|
|
1207
1246
|
if (!agentModeEnabled) {
|
|
@@ -1263,7 +1302,7 @@ const ChatInput = ({ app, initialContent, placeholder, onSave, onCancel, isEditi
|
|
|
1263
1302
|
}
|
|
1264
1303
|
}
|
|
1265
1304
|
} }),
|
|
1266
|
-
isDropdownVisible && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ChatDropdown__WEBPACK_IMPORTED_MODULE_9__["default"], { options:
|
|
1305
|
+
isDropdownVisible && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ChatDropdown__WEBPACK_IMPORTED_MODULE_9__["default"], { options: getExpandedVarialbes(), onSelect: handleOptionSelect, filterText: dropdownFilter, isDropdownFromButton: isDropdownFromButton, onFilterChange: setDropdownFilter, onClose: handleDropdownClose }))),
|
|
1267
1306
|
isEditing &&
|
|
1268
1307
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "message-edit-buttons" },
|
|
1269
1308
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { onClick: () => onSave(input, undefined, mapAdditionalContext()) }, "Save"),
|
|
@@ -1383,11 +1422,11 @@ const ChatMessage = ({ app, message, promptType, agentResponse, messageIndex, mi
|
|
|
1383
1422
|
if (messagePart.length > 14) {
|
|
1384
1423
|
return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
|
|
1385
1424
|
message.role === 'user' ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_UserCodeBlock__WEBPACK_IMPORTED_MODULE_7__["default"], { code: messagePart, renderMimeRegistry: renderMimeRegistry, agentModeEnabled: agentModeEnabled })) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_AssistantCodeBlock__WEBPACK_IMPORTED_MODULE_8__["default"], { code: messagePart, codeSummary: (_b = (_a = agentResponse === null || agentResponse === void 0 ? void 0 : agentResponse.cell_update) === null || _a === void 0 ? void 0 : _a.code_summary) !== null && _b !== void 0 ? _b : ((agentResponse === null || agentResponse === void 0 ? void 0 : agentResponse.type) === 'run_all_cells' ? 'Running all cells' : undefined), isCodeComplete: isCodeComplete, renderMimeRegistry: renderMimeRegistry, previewAICode: previewAICode, acceptAICode: acceptAICode, rejectAICode: rejectAICode, isLastAiMessage: isLastAiMessage, codeReviewStatus: codeReviewStatus, agentModeEnabled: agentModeEnabled })),
|
|
1386
|
-
isLastAiMessage && isCodeComplete && codeReviewStatus === 'chatPreview' &&
|
|
1425
|
+
!agentModeEnabled && isLastAiMessage && isCodeComplete && codeReviewStatus === 'chatPreview' &&
|
|
1387
1426
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: 'chat-message-buttons' },
|
|
1388
1427
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_TextAndIconButton__WEBPACK_IMPORTED_MODULE_9__["default"], { onClick: () => { previewAICode(); }, text: 'Overwrite Active Cell', icon: _icons_PlayButtonIcon__WEBPACK_IMPORTED_MODULE_10__["default"], title: 'Write the Ai generated code to the active cell in the jupyter notebook, replacing the current code.', variant: 'gray', width: 'fit-contents' }),
|
|
1389
1428
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_TextAndIconButton__WEBPACK_IMPORTED_MODULE_9__["default"], { onClick: () => { void (0,_utils_copyToClipboard__WEBPACK_IMPORTED_MODULE_11__["default"])(messagePart); }, text: 'Copy', icon: _icons_CopyIcon__WEBPACK_IMPORTED_MODULE_12__["default"], title: 'Copy the Ai generated code to your clipboard', variant: 'gray', width: 'fit-contents' })),
|
|
1390
|
-
isLastAiMessage && isCodeComplete && codeReviewStatus === 'codeCellPreview' &&
|
|
1429
|
+
!agentModeEnabled && isLastAiMessage && isCodeComplete && codeReviewStatus === 'codeCellPreview' &&
|
|
1391
1430
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: 'chat-message-buttons' },
|
|
1392
1431
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_TextButton__WEBPACK_IMPORTED_MODULE_13__["default"], { onClick: () => { acceptAICode(); }, text: `Accept code ${operatingSystem === 'mac' ? '⌘Y' : 'Ctrl+Y'}`, title: 'Accept the Ai generated code', variant: 'green', width: 'fit-contents' }),
|
|
1393
1432
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_TextButton__WEBPACK_IMPORTED_MODULE_13__["default"], { onClick: () => { rejectAICode(); }, text: `Reject code ${operatingSystem === 'mac' ? '⌘U' : 'Ctrl+U'}`, title: 'Reject the Ai generated code and revert to the previous version of the code cell', variant: 'red', width: 'fit-contents' })),
|
|
@@ -1468,7 +1507,7 @@ const Citation = ({ citationIndex, cellId, line, notebookTracker }) => {
|
|
|
1468
1507
|
// we set the end line to the start line if only a single line number is provided.
|
|
1469
1508
|
const lineEnd = typeof line === 'number' ? line : line.end;
|
|
1470
1509
|
// Scroll to the cell and highlight the lines
|
|
1471
|
-
(0,_utils_notebook__WEBPACK_IMPORTED_MODULE_2__.scrollToAndHighlightCell)(notebookTracker, cellId, lineStart, lineEnd);
|
|
1510
|
+
(0,_utils_notebook__WEBPACK_IMPORTED_MODULE_2__.scrollToAndHighlightCell)(notebookTracker.currentWidget, cellId, lineStart, lineEnd);
|
|
1472
1511
|
};
|
|
1473
1512
|
return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "citation-button", onClick: handleClick, title: getLineDisplayText(line) }, citationIndex));
|
|
1474
1513
|
};
|
|
@@ -1958,42 +1997,43 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
1958
1997
|
/* harmony import */ var _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_2__);
|
|
1959
1998
|
/* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @lumino/coreutils */ "webpack/sharing/consume/default/@lumino/coreutils");
|
|
1960
1999
|
/* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_lumino_coreutils__WEBPACK_IMPORTED_MODULE_3__);
|
|
1961
|
-
/* harmony import */ var
|
|
1962
|
-
/* harmony import */ var
|
|
1963
|
-
/* harmony import */ var
|
|
1964
|
-
/* harmony import */ var
|
|
1965
|
-
/* harmony import */ var
|
|
1966
|
-
/* harmony import */ var _components_LoadingDots__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../../components/LoadingDots */ "./lib/components/LoadingDots.js");
|
|
2000
|
+
/* harmony import */ var _commands__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../commands */ "./lib/commands.js");
|
|
2001
|
+
/* harmony import */ var _components_AgentComponents_ErrorFixupToolUI__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../../components/AgentComponents/ErrorFixupToolUI */ "./lib/components/AgentComponents/ErrorFixupToolUI.js");
|
|
2002
|
+
/* harmony import */ var _components_DropdownMenu__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../../components/DropdownMenu */ "./lib/components/DropdownMenu.js");
|
|
2003
|
+
/* harmony import */ var _components_IconButton__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../../components/IconButton */ "./lib/components/IconButton.js");
|
|
2004
|
+
/* harmony import */ var _components_LoadingCircle__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ../../components/LoadingCircle */ "./lib/components/LoadingCircle.js");
|
|
1967
2005
|
/* harmony import */ var _components_ModelSelector__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../components/ModelSelector */ "./lib/components/ModelSelector.js");
|
|
1968
|
-
/* harmony import */ var
|
|
1969
|
-
/* harmony import */ var
|
|
1970
|
-
/* harmony import */ var
|
|
1971
|
-
/* harmony import */ var
|
|
1972
|
-
/* harmony import */ var
|
|
1973
|
-
/* harmony import */ var
|
|
2006
|
+
/* harmony import */ var _components_NextStepsPills__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ../../components/NextStepsPills */ "./lib/components/NextStepsPills.js");
|
|
2007
|
+
/* harmony import */ var _components_TextAndIconButton__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ../../components/TextAndIconButton */ "./lib/components/TextAndIconButton.js");
|
|
2008
|
+
/* harmony import */ var _components_ToggleButton__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ../../components/ToggleButton */ "./lib/components/ToggleButton.js");
|
|
2009
|
+
/* harmony import */ var _icons__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../../icons */ "./lib/icons/index.js");
|
|
2010
|
+
/* harmony import */ var _icons_MitoLogo__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../../icons/MitoLogo */ "./lib/icons/MitoLogo.js");
|
|
2011
|
+
/* harmony import */ var _icons_UndoIcon__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ../../icons/UndoIcon */ "./lib/icons/UndoIcon.js");
|
|
1974
2012
|
/* harmony import */ var _utils_agentActions__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../utils/agentActions */ "./lib/utils/agentActions.js");
|
|
1975
2013
|
/* harmony import */ var _utils_blacklistedWords__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../utils/blacklistedWords */ "./lib/utils/blacklistedWords.js");
|
|
1976
2014
|
/* harmony import */ var _utils_checkpoint__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../utils/checkpoint */ "./lib/utils/checkpoint.js");
|
|
1977
|
-
/* harmony import */ var
|
|
1978
|
-
/* harmony import */ var
|
|
1979
|
-
/* harmony import */ var
|
|
2015
|
+
/* harmony import */ var _utils_chatHistory__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../../utils/chatHistory */ "./lib/utils/chatHistory.js");
|
|
2016
|
+
/* harmony import */ var _utils_codeDiff__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../utils/codeDiff */ "./lib/utils/codeDiff.js");
|
|
2017
|
+
/* harmony import */ var _utils_notebook__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../utils/notebook */ "./lib/utils/notebook.js");
|
|
2018
|
+
/* harmony import */ var _utils_cellOutput__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../utils/cellOutput */ "./lib/utils/cellOutput.js");
|
|
1980
2019
|
/* harmony import */ var _utils_scroll__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../utils/scroll */ "./lib/utils/scroll.js");
|
|
1981
2020
|
/* harmony import */ var _utils_strings__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../utils/strings */ "./lib/utils/strings.js");
|
|
1982
2021
|
/* harmony import */ var _utils_waitForNotebookReady__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../utils/waitForNotebookReady */ "./lib/utils/waitForNotebookReady.js");
|
|
1983
2022
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./utils */ "./lib/Extensions/AiChat/utils.js");
|
|
1984
|
-
/* harmony import */ var
|
|
2023
|
+
/* harmony import */ var _SettingsManager_SettingsManagerPlugin__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../SettingsManager/SettingsManagerPlugin */ "./lib/Extensions/SettingsManager/SettingsManagerPlugin.js");
|
|
1985
2024
|
/* harmony import */ var _SettingsManager_profiler_ProfilerPage__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../SettingsManager/profiler/ProfilerPage */ "./lib/Extensions/SettingsManager/profiler/ProfilerPage.js");
|
|
1986
|
-
/* harmony import */ var
|
|
1987
|
-
/* harmony import */ var
|
|
2025
|
+
/* harmony import */ var _CTACarousel__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./CTACarousel */ "./lib/Extensions/AiChat/CTACarousel.js");
|
|
2026
|
+
/* harmony import */ var _CodeDiffDisplay__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./CodeDiffDisplay */ "./lib/Extensions/AiChat/CodeDiffDisplay.js");
|
|
1988
2027
|
/* harmony import */ var _FirstMessage__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./FirstMessage */ "./lib/Extensions/AiChat/FirstMessage.js");
|
|
1989
|
-
/* harmony import */ var
|
|
1990
|
-
/* harmony import */ var
|
|
1991
|
-
/* harmony import */ var
|
|
1992
|
-
/* harmony import */ var
|
|
2028
|
+
/* harmony import */ var _ChatMessage_ChatInput__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./ChatMessage/ChatInput */ "./lib/Extensions/AiChat/ChatMessage/ChatInput.js");
|
|
2029
|
+
/* harmony import */ var _ChatMessage_ChatMessage__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./ChatMessage/ChatMessage */ "./lib/Extensions/AiChat/ChatMessage/ChatMessage.js");
|
|
2030
|
+
/* harmony import */ var _ChatMessage_RevertQuestionnaire__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./ChatMessage/RevertQuestionnaire */ "./lib/Extensions/AiChat/ChatMessage/RevertQuestionnaire.js");
|
|
2031
|
+
/* harmony import */ var _ChatMessage_ScrollableSuggestions__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./ChatMessage/ScrollableSuggestions */ "./lib/Extensions/AiChat/ChatMessage/ScrollableSuggestions.js");
|
|
1993
2032
|
/* harmony import */ var _ChatHistoryManager__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./ChatHistoryManager */ "./lib/Extensions/AiChat/ChatHistoryManager.js");
|
|
1994
2033
|
/* harmony import */ var _style_button_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../style/button.css */ "./style/button.css");
|
|
1995
2034
|
/* harmony import */ var _style_ChatTaskpane_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../style/ChatTaskpane.css */ "./style/ChatTaskpane.css");
|
|
1996
2035
|
/* harmony import */ var _style_TextButton_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../style/TextButton.css */ "./style/TextButton.css");
|
|
2036
|
+
/* harmony import */ var _components_LoadingDots__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../../components/LoadingDots */ "./lib/components/LoadingDots.js");
|
|
1997
2037
|
/*
|
|
1998
2038
|
* Copyright (c) Saga Inc.
|
|
1999
2039
|
* Distributed under the terms of the GNU Affero General Public License v3.0 License.
|
|
@@ -2015,7 +2055,6 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
2015
2055
|
|
|
2016
2056
|
|
|
2017
2057
|
|
|
2018
|
-
|
|
2019
2058
|
// Internal imports - Icons
|
|
2020
2059
|
|
|
2021
2060
|
|
|
@@ -2033,6 +2072,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
2033
2072
|
|
|
2034
2073
|
|
|
2035
2074
|
|
|
2075
|
+
|
|
2036
2076
|
// Internal imports - Chat components
|
|
2037
2077
|
|
|
2038
2078
|
|
|
@@ -2046,12 +2086,14 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
2046
2086
|
|
|
2047
2087
|
|
|
2048
2088
|
|
|
2089
|
+
|
|
2049
2090
|
const AGENT_EXECUTION_DEPTH_LIMIT = 20;
|
|
2050
2091
|
const getDefaultChatHistoryManager = (notebookTracker, contextManager) => {
|
|
2051
2092
|
const chatHistoryManager = new _ChatHistoryManager__WEBPACK_IMPORTED_MODULE_7__.ChatHistoryManager(contextManager, notebookTracker);
|
|
2052
2093
|
return chatHistoryManager;
|
|
2053
2094
|
};
|
|
2054
2095
|
const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app, operatingSystem, websocketClient, }) => {
|
|
2096
|
+
var _a;
|
|
2055
2097
|
const [chatHistoryManager, setChatHistoryManager] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(() => getDefaultChatHistoryManager(notebookTracker, contextManager));
|
|
2056
2098
|
const chatHistoryManagerRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(chatHistoryManager);
|
|
2057
2099
|
const [loadingAIResponse, setLoadingAIResponse] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);
|
|
@@ -2097,6 +2139,7 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
|
|
|
2097
2139
|
3. idle: the agent is idle
|
|
2098
2140
|
*/
|
|
2099
2141
|
const [agentExecutionStatus, setAgentExecutionStatus] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)('idle');
|
|
2142
|
+
const agentTargetNotebookPanelRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null);
|
|
2100
2143
|
// We use a ref to always access the most up-to-date value during a function's execution. Refs immediately reflect changes,
|
|
2101
2144
|
// unlike state variables, which are captured at the beginning of a function and may not reflect updates made during execution.
|
|
2102
2145
|
const shouldContinueAgentExecution = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(true);
|
|
@@ -2381,13 +2424,16 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
|
|
|
2381
2424
|
await _sendMessageAndSaveResponse(smartDebugCompletionRequest, newChatHistoryManager);
|
|
2382
2425
|
};
|
|
2383
2426
|
const sendAgentSmartDebugMessage = async (errorMessage) => {
|
|
2427
|
+
if (agentTargetNotebookPanelRef.current === null) {
|
|
2428
|
+
return;
|
|
2429
|
+
}
|
|
2384
2430
|
// Step 0: reset the state for a new message
|
|
2385
2431
|
resetForNewMessage();
|
|
2386
2432
|
// Enable follow mode when sending agent debug message (same behavior as other modes)
|
|
2387
2433
|
setAutoScrollFollowMode(true);
|
|
2388
2434
|
// Step 1: Create message metadata
|
|
2389
2435
|
const newChatHistoryManager = getDuplicateChatHistoryManager();
|
|
2390
|
-
const agentSmartDebugMessage = newChatHistoryManager.addAgentSmartDebugMessage(activeThreadIdRef.current, errorMessage);
|
|
2436
|
+
const agentSmartDebugMessage = newChatHistoryManager.addAgentSmartDebugMessage(activeThreadIdRef.current, errorMessage, agentTargetNotebookPanelRef.current);
|
|
2391
2437
|
setChatHistoryManager(newChatHistoryManager);
|
|
2392
2438
|
setLoadingAIResponse(true);
|
|
2393
2439
|
// Step 2: Send the message to the AI
|
|
@@ -2422,17 +2468,21 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
|
|
|
2422
2468
|
const sendAgentExecutionMessage = async (input, messageIndex, sendCellIDOutput = undefined, additionalContext) => {
|
|
2423
2469
|
// Step 0: reset the state for a new message
|
|
2424
2470
|
resetForNewMessage();
|
|
2471
|
+
const agentTargetNotebookPanel = agentTargetNotebookPanelRef.current;
|
|
2472
|
+
if (agentTargetNotebookPanel === null) {
|
|
2473
|
+
return;
|
|
2474
|
+
}
|
|
2425
2475
|
// Step 1: Add the user's message to the chat history
|
|
2426
2476
|
const newChatHistoryManager = getDuplicateChatHistoryManager();
|
|
2427
2477
|
if (messageIndex !== undefined) {
|
|
2428
2478
|
// Drop all of the messages starting at the message index
|
|
2429
2479
|
newChatHistoryManager.dropMessagesStartingAtIndex(messageIndex);
|
|
2430
2480
|
}
|
|
2431
|
-
const agentExecutionMetadata = newChatHistoryManager.addAgentExecutionMessage(activeThreadIdRef.current, input, additionalContext);
|
|
2481
|
+
const agentExecutionMetadata = newChatHistoryManager.addAgentExecutionMessage(activeThreadIdRef.current, agentTargetNotebookPanel, input, additionalContext);
|
|
2432
2482
|
if (messageIndex !== undefined) {
|
|
2433
2483
|
agentExecutionMetadata.index = messageIndex;
|
|
2434
2484
|
}
|
|
2435
|
-
agentExecutionMetadata.base64EncodedActiveCellOutput = await (0,_utils__WEBPACK_IMPORTED_MODULE_12__.
|
|
2485
|
+
agentExecutionMetadata.base64EncodedActiveCellOutput = await (0,_utils__WEBPACK_IMPORTED_MODULE_12__.getBase64EncodedCellOutputInNotebook)(agentTargetNotebookPanel, sendCellIDOutput);
|
|
2436
2486
|
setChatHistoryManager(newChatHistoryManager);
|
|
2437
2487
|
setLoadingAIResponse(true);
|
|
2438
2488
|
// Step 2: Send the message to the AI
|
|
@@ -2468,7 +2518,7 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
|
|
|
2468
2518
|
// Add the active cell output to the metadata afterwards setting the chatHistoryManager so that
|
|
2469
2519
|
// we don't have to wait on turning the output into a base64 image before we can add the user's message
|
|
2470
2520
|
// to the chat.
|
|
2471
|
-
const activeCellOutput = await (0,
|
|
2521
|
+
const activeCellOutput = await (0,_utils_cellOutput__WEBPACK_IMPORTED_MODULE_13__.getActiveCellOutput)(notebookTracker);
|
|
2472
2522
|
if (activeCellOutput !== undefined) {
|
|
2473
2523
|
chatMessageMetadata.base64EncodedActiveCellOutput = activeCellOutput;
|
|
2474
2524
|
}
|
|
@@ -2629,6 +2679,7 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
|
|
|
2629
2679
|
setAgentExecutionStatus('idle');
|
|
2630
2680
|
};
|
|
2631
2681
|
const startAgentExecution = async (input, messageIndex, additionalContext) => {
|
|
2682
|
+
agentTargetNotebookPanelRef.current = notebookTracker.currentWidget;
|
|
2632
2683
|
await (0,_utils_checkpoint__WEBPACK_IMPORTED_MODULE_15__.createCheckpoint)(app, setHasCheckpoint);
|
|
2633
2684
|
setAgentExecutionStatus('working');
|
|
2634
2685
|
// Enable follow mode when user starts agent execution
|
|
@@ -2673,6 +2724,11 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
|
|
|
2673
2724
|
}
|
|
2674
2725
|
}
|
|
2675
2726
|
const agentResponse = aiDisplayOptimizedChatItem === null || aiDisplayOptimizedChatItem === void 0 ? void 0 : aiDisplayOptimizedChatItem.agentResponse;
|
|
2727
|
+
if (agentTargetNotebookPanelRef.current === null) {
|
|
2728
|
+
// If the agent target notebook panel is not set, we don't know where to run the code so we stop
|
|
2729
|
+
isAgentFinished = true;
|
|
2730
|
+
break;
|
|
2731
|
+
}
|
|
2676
2732
|
if (agentResponse === undefined) {
|
|
2677
2733
|
// If the agent response is undefined, we need to send a message to the agent
|
|
2678
2734
|
isAgentFinished = true;
|
|
@@ -2690,8 +2746,8 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
|
|
|
2690
2746
|
}
|
|
2691
2747
|
if (agentResponse.type === 'cell_update' && agentResponse.cell_update) {
|
|
2692
2748
|
// Run the code and handle any errors
|
|
2693
|
-
await (0,_utils_agentActions__WEBPACK_IMPORTED_MODULE_18__.acceptAndRunCellUpdate)(agentResponse.cell_update,
|
|
2694
|
-
const status = await (0,_utils_agentActions__WEBPACK_IMPORTED_MODULE_18__.retryIfExecutionError)(
|
|
2749
|
+
await (0,_utils_agentActions__WEBPACK_IMPORTED_MODULE_18__.acceptAndRunCellUpdate)(agentResponse.cell_update, agentTargetNotebookPanelRef.current);
|
|
2750
|
+
const status = await (0,_utils_agentActions__WEBPACK_IMPORTED_MODULE_18__.retryIfExecutionError)(agentTargetNotebookPanelRef.current, app, sendAgentSmartDebugMessage, shouldContinueAgentExecution, finalizeAgentStop, chatHistoryManagerRef);
|
|
2695
2751
|
if (status === 'interupted') {
|
|
2696
2752
|
break;
|
|
2697
2753
|
}
|
|
@@ -2711,12 +2767,12 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
|
|
|
2711
2767
|
sendCellIDOutput = agentResponse.get_cell_output_cell_id;
|
|
2712
2768
|
}
|
|
2713
2769
|
if (agentResponse.type === 'run_all_cells') {
|
|
2714
|
-
const result = await (0,_utils_agentActions__WEBPACK_IMPORTED_MODULE_18__.runAllCells)(app,
|
|
2770
|
+
const result = await (0,_utils_agentActions__WEBPACK_IMPORTED_MODULE_18__.runAllCells)(app, agentTargetNotebookPanelRef.current);
|
|
2715
2771
|
// If run_all_cells resulted in an error, handle it through the error fixup process
|
|
2716
2772
|
if (!result.success && result.errorMessage && result.errorCellId) {
|
|
2717
2773
|
// Set the error cell as active so the error retry logic can work with it
|
|
2718
|
-
(0,
|
|
2719
|
-
const status = await (0,_utils_agentActions__WEBPACK_IMPORTED_MODULE_18__.retryIfExecutionError)(
|
|
2774
|
+
(0,_utils_notebook__WEBPACK_IMPORTED_MODULE_19__.setActiveCellByIDInNotebookPanel)(agentTargetNotebookPanelRef.current, result.errorCellId);
|
|
2775
|
+
const status = await (0,_utils_agentActions__WEBPACK_IMPORTED_MODULE_18__.retryIfExecutionError)(agentTargetNotebookPanelRef.current, app, sendAgentSmartDebugMessage, shouldContinueAgentExecution, finalizeAgentStop, chatHistoryManagerRef);
|
|
2720
2776
|
if (status === 'interupted') {
|
|
2721
2777
|
break;
|
|
2722
2778
|
}
|
|
@@ -2736,33 +2792,33 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
|
|
|
2736
2792
|
if (!aiMessage) {
|
|
2737
2793
|
return;
|
|
2738
2794
|
}
|
|
2739
|
-
const updateCellCode = (0,
|
|
2795
|
+
const updateCellCode = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_19__.getCellCodeByID)(notebookTracker, updateCellID);
|
|
2740
2796
|
if (updateCellID === undefined || updateCellCode === undefined) {
|
|
2741
2797
|
return;
|
|
2742
2798
|
}
|
|
2743
2799
|
// Extract the code from the AI's message and then calculate the code diffs
|
|
2744
2800
|
const aiGeneratedCode = (0,_utils_strings__WEBPACK_IMPORTED_MODULE_16__.getCodeBlockFromMessage)(aiMessage);
|
|
2745
2801
|
const aiGeneratedCodeCleaned = (0,_utils_strings__WEBPACK_IMPORTED_MODULE_16__.removeMarkdownCodeFormatting)(aiGeneratedCode || '');
|
|
2746
|
-
const { unifiedCodeString, unifiedDiffs } = (0,
|
|
2802
|
+
const { unifiedCodeString, unifiedDiffs } = (0,_utils_codeDiff__WEBPACK_IMPORTED_MODULE_20__.getCodeDiffsAndUnifiedCodeString)(updateCellCode, aiGeneratedCodeCleaned);
|
|
2747
2803
|
// Store the code cell ID where we write the code diffs so that we can
|
|
2748
2804
|
// accept or reject the code diffs to the correct cell
|
|
2749
2805
|
cellStateBeforeDiff.current = { codeCellID: updateCellID, code: updateCellCode };
|
|
2750
2806
|
// Temporarily write the unified code string to the active cell so we can display
|
|
2751
2807
|
// the code diffs to the user
|
|
2752
|
-
(0,
|
|
2808
|
+
(0,_utils_notebook__WEBPACK_IMPORTED_MODULE_19__.writeCodeToCellByID)(notebookTracker, unifiedCodeString, updateCellID);
|
|
2753
2809
|
updateCodeCellsExtensions(unifiedDiffs);
|
|
2754
2810
|
// Briefly highlight the code cell to draw the user's attention to it
|
|
2755
|
-
(0,
|
|
2811
|
+
(0,_utils_notebook__WEBPACK_IMPORTED_MODULE_19__.highlightCodeCell)(notebookTracker, updateCellID);
|
|
2756
2812
|
};
|
|
2757
2813
|
const displayOptimizedChatHistory = chatHistoryManager.getDisplayOptimizedHistory();
|
|
2758
2814
|
const previewAICodeToActiveCell = () => {
|
|
2759
2815
|
setCodeReviewStatus('codeCellPreview');
|
|
2760
|
-
const activeCellID = (0,
|
|
2816
|
+
const activeCellID = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_19__.getActiveCellID)(notebookTracker);
|
|
2761
2817
|
const lastAIDisplayMessage = chatHistoryManagerRef.current.getLastAIDisplayOptimizedChatItem();
|
|
2762
2818
|
if (activeCellID === undefined || lastAIDisplayMessage === undefined) {
|
|
2763
2819
|
return;
|
|
2764
2820
|
}
|
|
2765
|
-
(0,
|
|
2821
|
+
(0,_utils_notebook__WEBPACK_IMPORTED_MODULE_19__.scrollToCell)(notebookTracker.currentWidget, activeCellID, undefined, 'end');
|
|
2766
2822
|
updateCodeDiffStripes(lastAIDisplayMessage.message, activeCellID);
|
|
2767
2823
|
updateCellToolbarButtons();
|
|
2768
2824
|
};
|
|
@@ -2781,10 +2837,10 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
|
|
|
2781
2837
|
// Write to the cell that has the code diffs
|
|
2782
2838
|
writeCodeToCellAndTurnOffDiffs(aiGeneratedCode, targetCellID);
|
|
2783
2839
|
// Focus on the active cell after the code is written
|
|
2784
|
-
const targetCell = (0,
|
|
2840
|
+
const targetCell = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_19__.getCellByID)(notebookTracker, targetCellID);
|
|
2785
2841
|
if (targetCell) {
|
|
2786
2842
|
// Make the target cell the active cell
|
|
2787
|
-
(0,
|
|
2843
|
+
(0,_utils_notebook__WEBPACK_IMPORTED_MODULE_19__.setActiveCellByID)(notebookTracker, targetCellID);
|
|
2788
2844
|
// Focus on the active cell
|
|
2789
2845
|
targetCell.activate();
|
|
2790
2846
|
}
|
|
@@ -2810,7 +2866,7 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
|
|
|
2810
2866
|
updateCodeCellsExtensions(undefined);
|
|
2811
2867
|
cellStateBeforeDiff.current = undefined;
|
|
2812
2868
|
if (codeCellID !== undefined) {
|
|
2813
|
-
(0,
|
|
2869
|
+
(0,_utils_notebook__WEBPACK_IMPORTED_MODULE_19__.writeCodeToCellByID)(notebookTracker, code, codeCellID);
|
|
2814
2870
|
updateCellToolbarButtons();
|
|
2815
2871
|
}
|
|
2816
2872
|
};
|
|
@@ -2821,17 +2877,17 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
|
|
|
2821
2877
|
the first time we create the chat. Registering the command when it is already created causes
|
|
2822
2878
|
errors.
|
|
2823
2879
|
*/
|
|
2824
|
-
app.commands.addCommand(
|
|
2880
|
+
app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_PREVIEW_LATEST_CODE, {
|
|
2825
2881
|
execute: () => {
|
|
2826
2882
|
previewAICodeToActiveCell();
|
|
2827
2883
|
}
|
|
2828
2884
|
});
|
|
2829
|
-
app.commands.addCommand(
|
|
2885
|
+
app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_APPLY_LATEST_CODE, {
|
|
2830
2886
|
execute: () => {
|
|
2831
2887
|
acceptAICode();
|
|
2832
2888
|
}
|
|
2833
2889
|
});
|
|
2834
|
-
app.commands.addCommand(
|
|
2890
|
+
app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_REJECT_LATEST_CODE, {
|
|
2835
2891
|
execute: () => {
|
|
2836
2892
|
rejectAICode();
|
|
2837
2893
|
}
|
|
@@ -2840,23 +2896,21 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
|
|
|
2840
2896
|
Add a new command to the JupyterLab command registry that sends the current chat message.
|
|
2841
2897
|
We use this to automatically send the message when the user adds an error to the chat.
|
|
2842
2898
|
*/
|
|
2843
|
-
app.commands.addCommand(
|
|
2899
|
+
app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_SEND_DEBUG_ERROR_MESSAGE, {
|
|
2844
2900
|
execute: async (args) => {
|
|
2845
2901
|
if (args === null || args === void 0 ? void 0 : args.input) {
|
|
2846
2902
|
await sendSmartDebugMessage(args.input.toString());
|
|
2847
2903
|
}
|
|
2848
2904
|
}
|
|
2849
2905
|
});
|
|
2850
|
-
app.commands.addCommand(
|
|
2906
|
+
app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_SEND_EXPLAIN_CODE_MESSAGE, {
|
|
2851
2907
|
execute: async () => {
|
|
2852
2908
|
await sendExplainCodeMessage();
|
|
2853
2909
|
}
|
|
2854
2910
|
});
|
|
2855
|
-
app.commands.addCommand(
|
|
2911
|
+
app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_SEND_AGENT_MESSAGE, {
|
|
2856
2912
|
execute: async (args) => {
|
|
2857
2913
|
if (args === null || args === void 0 ? void 0 : args.input) {
|
|
2858
|
-
// Make sure we're in agent mode
|
|
2859
|
-
console.log('Setting agent mode to true');
|
|
2860
2914
|
// If its not already in agent mode, start a new chat in agent mode
|
|
2861
2915
|
if (!agentModeEnabledRef.current) {
|
|
2862
2916
|
await startNewChat();
|
|
@@ -2871,7 +2925,7 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
|
|
|
2871
2925
|
/*
|
|
2872
2926
|
Register the code cell toolbar buttons for accepting and rejecting code.
|
|
2873
2927
|
*/
|
|
2874
|
-
app.commands.addCommand(
|
|
2928
|
+
app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_CELL_TOOLBAR_ACCEPT_CODE, {
|
|
2875
2929
|
label: `Accept ${operatingSystem === 'mac' ? '⌘Y' : 'Ctrl+Y'}`,
|
|
2876
2930
|
className: 'text-button-mito-ai button-base button-green',
|
|
2877
2931
|
caption: 'Accept Code',
|
|
@@ -2889,7 +2943,7 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
|
|
|
2889
2943
|
}
|
|
2890
2944
|
}
|
|
2891
2945
|
});
|
|
2892
|
-
app.commands.addCommand(
|
|
2946
|
+
app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_CELL_TOOLBAR_REJECT_CODE, {
|
|
2893
2947
|
label: `Reject ${operatingSystem === 'mac' ? '⌘U' : 'Ctrl+U'}`,
|
|
2894
2948
|
className: 'text-button-mito-ai button-base button-red',
|
|
2895
2949
|
caption: 'Reject Code',
|
|
@@ -2910,13 +2964,13 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
|
|
|
2910
2964
|
// Register keyboard shortcuts
|
|
2911
2965
|
const accelYDisposable = app.commands.addKeyBinding({
|
|
2912
2966
|
command: codeReviewStatus === 'chatPreview' ?
|
|
2913
|
-
|
|
2914
|
-
|
|
2967
|
+
_commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_PREVIEW_LATEST_CODE :
|
|
2968
|
+
_commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_APPLY_LATEST_CODE,
|
|
2915
2969
|
keys: ['Accel Y'],
|
|
2916
2970
|
selector: 'body',
|
|
2917
2971
|
});
|
|
2918
2972
|
const accelDDisposable = app.commands.addKeyBinding({
|
|
2919
|
-
command:
|
|
2973
|
+
command: _commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_REJECT_LATEST_CODE,
|
|
2920
2974
|
keys: ['Accel U'],
|
|
2921
2975
|
selector: 'body',
|
|
2922
2976
|
preventDefault: true,
|
|
@@ -2933,8 +2987,8 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
|
|
|
2933
2987
|
// Without this, the user needs to take some action, like switching to a different cell
|
|
2934
2988
|
// and then switching back in order for the Jupyter to re-evaluate if it should
|
|
2935
2989
|
// show the toolbar buttons.
|
|
2936
|
-
app.commands.notifyCommandChanged(
|
|
2937
|
-
app.commands.notifyCommandChanged(
|
|
2990
|
+
app.commands.notifyCommandChanged(_commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_CELL_TOOLBAR_ACCEPT_CODE);
|
|
2991
|
+
app.commands.notifyCommandChanged(_commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_CELL_TOOLBAR_REJECT_CODE);
|
|
2938
2992
|
};
|
|
2939
2993
|
const codeDiffStripesCompartments = react__WEBPACK_IMPORTED_MODULE_1___default().useRef(new Map());
|
|
2940
2994
|
// Function to update the extensions of code cells
|
|
@@ -2962,13 +3016,13 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
|
|
|
2962
3016
|
codeDiffStripesCompartments.current.set(cellId, compartment);
|
|
2963
3017
|
// Apply the initial configuration
|
|
2964
3018
|
editorView.dispatch({
|
|
2965
|
-
effects: _codemirror_state__WEBPACK_IMPORTED_MODULE_0__.StateEffect.appendConfig.of(compartment.of(unifiedDiffLines !== undefined && isActiveCodeCell ? (0,
|
|
3019
|
+
effects: _codemirror_state__WEBPACK_IMPORTED_MODULE_0__.StateEffect.appendConfig.of(compartment.of(unifiedDiffLines !== undefined && isActiveCodeCell ? (0,_CodeDiffDisplay__WEBPACK_IMPORTED_MODULE_22__.codeDiffStripesExtension)({ unifiedDiffLines: unifiedDiffLines }) : [])),
|
|
2966
3020
|
});
|
|
2967
3021
|
}
|
|
2968
3022
|
else {
|
|
2969
3023
|
// Reconfigure the compartment
|
|
2970
3024
|
editorView.dispatch({
|
|
2971
|
-
effects: compartment.reconfigure(unifiedDiffLines !== undefined && isActiveCodeCell ? (0,
|
|
3025
|
+
effects: compartment.reconfigure(unifiedDiffLines !== undefined && isActiveCodeCell ? (0,_CodeDiffDisplay__WEBPACK_IMPORTED_MODULE_22__.codeDiffStripesExtension)({ unifiedDiffLines: unifiedDiffLines }) : []),
|
|
2972
3026
|
});
|
|
2973
3027
|
}
|
|
2974
3028
|
}
|
|
@@ -2983,7 +3037,7 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
|
|
|
2983
3037
|
// In agent mode, we group consecutive error messages together.
|
|
2984
3038
|
// In chat mode, we display messages individually as they were sent
|
|
2985
3039
|
if (agentModeEnabled) {
|
|
2986
|
-
processedDisplayOptimizedChatHistory = (0,
|
|
3040
|
+
processedDisplayOptimizedChatHistory = (0,_utils_chatHistory__WEBPACK_IMPORTED_MODULE_23__.processChatHistoryForErrorGrouping)(chatHistoryManager.getDisplayOptimizedHistory());
|
|
2987
3041
|
}
|
|
2988
3042
|
else {
|
|
2989
3043
|
processedDisplayOptimizedChatHistory = chatHistoryManager.getDisplayOptimizedHistory();
|
|
@@ -2995,16 +3049,16 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
|
|
|
2995
3049
|
return (react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "chat-taskpane" },
|
|
2996
3050
|
react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "chat-taskpane-header" },
|
|
2997
3051
|
react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "chat-taskpane-header-left" },
|
|
2998
|
-
react__WEBPACK_IMPORTED_MODULE_1___default().createElement(
|
|
2999
|
-
void app.commands.execute(
|
|
3052
|
+
react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_IconButton__WEBPACK_IMPORTED_MODULE_24__["default"], { icon: react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_2__.settingsIcon.react, null), title: "Mito AI Settings", onClick: () => {
|
|
3053
|
+
void app.commands.execute(_SettingsManager_SettingsManagerPlugin__WEBPACK_IMPORTED_MODULE_25__.COMMAND_MITO_AI_SETTINGS);
|
|
3000
3054
|
} })),
|
|
3001
3055
|
react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "chat-taskpane-header-right" },
|
|
3002
|
-
react__WEBPACK_IMPORTED_MODULE_1___default().createElement(
|
|
3003
|
-
react__WEBPACK_IMPORTED_MODULE_1___default().createElement(
|
|
3056
|
+
react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_IconButton__WEBPACK_IMPORTED_MODULE_24__["default"], { icon: react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_2__.addIcon.react, null), title: "Start New Chat", onClick: async () => { await startNewChat(); } }),
|
|
3057
|
+
react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_DropdownMenu__WEBPACK_IMPORTED_MODULE_26__["default"], { trigger: react__WEBPACK_IMPORTED_MODULE_1___default().createElement("button", { className: "icon-button", title: "Chat Threads", onClick: fetchChatThreads },
|
|
3004
3058
|
react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_2__.historyIcon.react, null)), items: chatThreads.length > 0
|
|
3005
3059
|
? chatThreads.map(thread => ({
|
|
3006
3060
|
label: thread.name,
|
|
3007
|
-
primaryIcon: activeThreadIdRef.current === thread.thread_id ?
|
|
3061
|
+
primaryIcon: activeThreadIdRef.current === thread.thread_id ? _icons__WEBPACK_IMPORTED_MODULE_27__.OpenIndicatorLabIcon.react : undefined,
|
|
3008
3062
|
onClick: () => fetchChatHistoryAndSetActiveThread(thread.thread_id),
|
|
3009
3063
|
secondaryActions: [
|
|
3010
3064
|
{
|
|
@@ -3023,26 +3077,26 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
|
|
|
3023
3077
|
displayOptimizedChatHistory.length === 0 &&
|
|
3024
3078
|
react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "chat-empty-message" },
|
|
3025
3079
|
react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { style: { margin: '0 auto 8px', display: 'block', textAlign: 'center' } },
|
|
3026
|
-
react__WEBPACK_IMPORTED_MODULE_1___default().createElement(
|
|
3080
|
+
react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_icons_MitoLogo__WEBPACK_IMPORTED_MODULE_28__["default"], { width: "60", height: "30" })),
|
|
3027
3081
|
react__WEBPACK_IMPORTED_MODULE_1___default().createElement("span", { style: { display: 'block', textAlign: 'center', fontWeight: 'bold', fontSize: '20px', marginBottom: '15px' } }, "Data Copilot"),
|
|
3028
|
-
react__WEBPACK_IMPORTED_MODULE_1___default().createElement(
|
|
3082
|
+
react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_CTACarousel__WEBPACK_IMPORTED_MODULE_29__["default"], { app: app })),
|
|
3029
3083
|
processedDisplayOptimizedChatHistory.map((displayOptimizedChat, index) => {
|
|
3030
3084
|
if (isGroupedErrorMessages(displayOptimizedChat)) {
|
|
3031
|
-
return (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(
|
|
3085
|
+
return (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_AgentComponents_ErrorFixupToolUI__WEBPACK_IMPORTED_MODULE_30__["default"], { key: index, messages: displayOptimizedChat, renderMimeRegistry: renderMimeRegistry }));
|
|
3032
3086
|
}
|
|
3033
3087
|
else {
|
|
3034
|
-
return (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(
|
|
3088
|
+
return (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_ChatMessage_ChatMessage__WEBPACK_IMPORTED_MODULE_31__["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, onUpdateMessage: handleUpdateMessage, contextManager: contextManager, codeReviewStatus: codeReviewStatus, setNextSteps: setNextSteps, agentModeEnabled: agentModeEnabled, additionalContext: displayOptimizedChat.additionalContext }));
|
|
3035
3089
|
}
|
|
3036
3090
|
}).filter(message => message !== null),
|
|
3037
3091
|
loadingAIResponse &&
|
|
3038
3092
|
react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "chat-loading-message" },
|
|
3039
3093
|
"Thinking ",
|
|
3040
|
-
react__WEBPACK_IMPORTED_MODULE_1___default().createElement(
|
|
3094
|
+
react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_LoadingDots__WEBPACK_IMPORTED_MODULE_32__["default"], null)),
|
|
3041
3095
|
hasCheckpoint &&
|
|
3042
3096
|
agentModeEnabled &&
|
|
3043
3097
|
agentExecutionStatus === 'idle' &&
|
|
3044
3098
|
displayOptimizedChatHistory.length > 0 && (react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: 'message message-assistant-chat' },
|
|
3045
|
-
react__WEBPACK_IMPORTED_MODULE_1___default().createElement(
|
|
3099
|
+
react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_TextAndIconButton__WEBPACK_IMPORTED_MODULE_33__["default"], { text: "Revert changes", icon: _icons_UndoIcon__WEBPACK_IMPORTED_MODULE_34__["default"], title: "Revert changes", onClick: () => {
|
|
3046
3100
|
void (0,_utils_checkpoint__WEBPACK_IMPORTED_MODULE_15__.restoreCheckpoint)(app, notebookTracker, setHasCheckpoint);
|
|
3047
3101
|
setDisplayedNextStepsIfAvailable(false);
|
|
3048
3102
|
setHasCheckpoint(false);
|
|
@@ -3050,9 +3104,9 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
|
|
|
3050
3104
|
(0,_utils_scroll__WEBPACK_IMPORTED_MODULE_11__.scrollToDiv)(chatMessagesRef);
|
|
3051
3105
|
}, variant: "gray", width: "fit-contents", iconPosition: "left" }),
|
|
3052
3106
|
react__WEBPACK_IMPORTED_MODULE_1___default().createElement("p", { className: "text-muted text-sm" }, "Undo the most recent changes made by the agent"))),
|
|
3053
|
-
showRevertQuestionnaire && (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(
|
|
3107
|
+
showRevertQuestionnaire && (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_ChatMessage_RevertQuestionnaire__WEBPACK_IMPORTED_MODULE_35__["default"], { onDestroy: () => setShowRevertQuestionnaire(false), getDuplicateChatHistoryManager: getDuplicateChatHistoryManager, setChatHistoryManager: setChatHistoryManager }))),
|
|
3054
3108
|
displayOptimizedChatHistory.length === 0 && (react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "suggestions-container" },
|
|
3055
|
-
react__WEBPACK_IMPORTED_MODULE_1___default().createElement(
|
|
3109
|
+
react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_ChatMessage_ScrollableSuggestions__WEBPACK_IMPORTED_MODULE_36__["default"], { onSelectSuggestion: (prompt) => {
|
|
3056
3110
|
if (agentModeEnabled) {
|
|
3057
3111
|
void startAgentExecution(prompt);
|
|
3058
3112
|
}
|
|
@@ -3061,15 +3115,15 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
|
|
|
3061
3115
|
}
|
|
3062
3116
|
} }))),
|
|
3063
3117
|
react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: `connected-input-container ${nextSteps.length > 0 ? 'has-next-steps' : ''}` },
|
|
3064
|
-
nextSteps.length > 0 && (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(
|
|
3065
|
-
react__WEBPACK_IMPORTED_MODULE_1___default().createElement(
|
|
3118
|
+
nextSteps.length > 0 && (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_NextStepsPills__WEBPACK_IMPORTED_MODULE_37__["default"], { nextSteps: nextSteps, onSelectNextStep: agentModeEnabled ? startAgentExecution : sendChatInputMessage, displayedNextStepsIfAvailable: displayedNextStepsIfAvailable, setDisplayedNextStepsIfAvailable: setDisplayedNextStepsIfAvailable })),
|
|
3119
|
+
react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_ChatMessage_ChatInput__WEBPACK_IMPORTED_MODULE_38__["default"], { app: app, initialContent: '', placeholder: agentExecutionStatus === 'working' ? `Agent is editing ${(_a = agentTargetNotebookPanelRef.current) === null || _a === void 0 ? void 0 : _a.context.path.split('/').pop()}` :
|
|
3066
3120
|
agentExecutionStatus === 'stopping' ? 'Agent is stopping...' :
|
|
3067
3121
|
agentModeEnabled ? 'Ask agent to do anything' :
|
|
3068
3122
|
displayOptimizedChatHistory.length < 2 ? `Ask question (${operatingSystem === 'mac' ? '⌘' : 'Ctrl'}E), @ to mention`
|
|
3069
3123
|
: `Ask followup (${operatingSystem === 'mac' ? '⌘' : 'Ctrl'}E), @ to mention`, onSave: agentModeEnabled ? startAgentExecution : sendChatInputMessage, onCancel: undefined, isEditing: false, contextManager: contextManager, notebookTracker: notebookTracker, agentModeEnabled: agentModeEnabled, agentExecutionStatus: agentExecutionStatus })),
|
|
3070
3124
|
agentExecutionStatus !== 'working' && agentExecutionStatus !== 'stopping' && (react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "chat-controls" },
|
|
3071
3125
|
react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "chat-controls-left" },
|
|
3072
|
-
react__WEBPACK_IMPORTED_MODULE_1___default().createElement(
|
|
3126
|
+
react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_ToggleButton__WEBPACK_IMPORTED_MODULE_39__["default"], { leftText: "Chat", leftTooltip: "Chat mode suggests an edit to the active cell and let's you decide to accept or reject it.", rightText: "Agent", rightTooltip: "Agent mode writes and executes code until it's finished your request.", isLeftSelected: !agentModeEnabled, onChange: async (isLeftSelected) => {
|
|
3073
3127
|
await startNewChat(); // TODO: delete thread instead of starting new chat
|
|
3074
3128
|
setAgentModeEnabled(!isLeftSelected);
|
|
3075
3129
|
// Clear agent checkpoint when switching modes
|
|
@@ -3105,7 +3159,7 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
|
|
|
3105
3159
|
" \u23CE"))),
|
|
3106
3160
|
(agentExecutionStatus === 'working' || agentExecutionStatus === 'stopping') && (react__WEBPACK_IMPORTED_MODULE_1___default().createElement("button", { className: "button-base button-red stop-agent-button", onClick: markAgentForStopping, disabled: agentExecutionStatus === 'stopping', "data-testid": "stop-agent-button" }, agentExecutionStatus === 'stopping' ? (react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "stop-agent-button-content" },
|
|
3107
3161
|
"Stopping",
|
|
3108
|
-
react__WEBPACK_IMPORTED_MODULE_1___default().createElement(
|
|
3162
|
+
react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_LoadingCircle__WEBPACK_IMPORTED_MODULE_40__["default"], null),
|
|
3109
3163
|
" ")) : ('Stop Agent')))));
|
|
3110
3164
|
};
|
|
3111
3165
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ChatTaskpane);
|
|
@@ -3161,7 +3215,7 @@ class ChatWidget extends _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.React
|
|
|
3161
3215
|
this._lastErrorChanged = new _lumino_signaling__WEBPACK_IMPORTED_MODULE_3__.Signal(this);
|
|
3162
3216
|
// Create the websocket client
|
|
3163
3217
|
this.websocketClient = new _websockets_completions_CompletionsWebsocketClient__WEBPACK_IMPORTED_MODULE_5__.CompletionWebsocketClient({
|
|
3164
|
-
serverSettings: options.app.serviceManager.serverSettings
|
|
3218
|
+
serverSettings: options.app.serviceManager.serverSettings,
|
|
3165
3219
|
});
|
|
3166
3220
|
this.websocketClient.messages.connect(this.onMessage, this);
|
|
3167
3221
|
// Initialize the websocket client
|
|
@@ -3462,9 +3516,11 @@ const IChatTracker = new _lumino_coreutils__WEBPACK_IMPORTED_MODULE_0__.Token('m
|
|
|
3462
3516
|
|
|
3463
3517
|
__webpack_require__.r(__webpack_exports__);
|
|
3464
3518
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
3465
|
-
/* harmony export */ getBase64EncodedCellOutput: () => (/* binding */ getBase64EncodedCellOutput)
|
|
3519
|
+
/* harmony export */ getBase64EncodedCellOutput: () => (/* binding */ getBase64EncodedCellOutput),
|
|
3520
|
+
/* harmony export */ getBase64EncodedCellOutputInNotebook: () => (/* binding */ getBase64EncodedCellOutputInNotebook)
|
|
3466
3521
|
/* harmony export */ });
|
|
3467
3522
|
/* harmony import */ var _utils_notebook__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../utils/notebook */ "./lib/utils/notebook.js");
|
|
3523
|
+
/* harmony import */ var _utils_cellOutput__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/cellOutput */ "./lib/utils/cellOutput.js");
|
|
3468
3524
|
/* harmony import */ var _restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../restAPI/RestAPI */ "./lib/restAPI/RestAPI.js");
|
|
3469
3525
|
/*
|
|
3470
3526
|
* Copyright (c) Saga Inc.
|
|
@@ -3472,20 +3528,23 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
3472
3528
|
*/
|
|
3473
3529
|
|
|
3474
3530
|
|
|
3531
|
+
|
|
3475
3532
|
const getBase64EncodedCellOutput = async (notebookTracker, cellID) => {
|
|
3476
|
-
|
|
3533
|
+
const notebookPanel = notebookTracker.currentWidget;
|
|
3534
|
+
return getBase64EncodedCellOutputInNotebook(notebookPanel, cellID);
|
|
3535
|
+
};
|
|
3536
|
+
const getBase64EncodedCellOutputInNotebook = async (notebookPanel, cellID) => {
|
|
3537
|
+
if (cellID === undefined || notebookPanel === null) {
|
|
3477
3538
|
return undefined;
|
|
3478
3539
|
}
|
|
3479
|
-
|
|
3480
|
-
const cellIndex = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_0__.getCellIndexByID)(notebookTracker, cellID);
|
|
3540
|
+
const cellIndex = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_0__.getCellIndexByIDInNotebookPanel)(notebookPanel, cellID);
|
|
3481
3541
|
if (cellIndex === undefined) {
|
|
3482
3542
|
// Log that the cell id is not part of the notebook
|
|
3483
|
-
console.log(`Cell with id ${cellID} not found in notebook`);
|
|
3543
|
+
console.log(`Cell with id ${cellID} not found in notebook ${notebookPanel.context.path}`);
|
|
3484
3544
|
void (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_1__.logEvent)('get_cell_output_requested_non_existent_cell');
|
|
3485
3545
|
return undefined;
|
|
3486
3546
|
}
|
|
3487
|
-
(0,
|
|
3488
|
-
const activeCellOutput = await (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_0__.getActiveCellOutput)(notebookTracker);
|
|
3547
|
+
const activeCellOutput = await (0,_utils_cellOutput__WEBPACK_IMPORTED_MODULE_2__.getCellOutputByIDInNotebook)(notebookPanel, cellID);
|
|
3489
3548
|
if (activeCellOutput !== undefined) {
|
|
3490
3549
|
return activeCellOutput;
|
|
3491
3550
|
}
|
|
@@ -3495,20 +3554,83 @@ const getBase64EncodedCellOutput = async (notebookTracker, cellID) => {
|
|
|
3495
3554
|
|
|
3496
3555
|
/***/ }),
|
|
3497
3556
|
|
|
3498
|
-
/***/ "./lib/Extensions/
|
|
3499
|
-
|
|
3500
|
-
!*** ./lib/Extensions/
|
|
3501
|
-
|
|
3557
|
+
/***/ "./lib/Extensions/AiChat/validationUtils.js":
|
|
3558
|
+
/*!**************************************************!*\
|
|
3559
|
+
!*** ./lib/Extensions/AiChat/validationUtils.js ***!
|
|
3560
|
+
\**************************************************/
|
|
3502
3561
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3503
3562
|
|
|
3504
3563
|
__webpack_require__.r(__webpack_exports__);
|
|
3505
3564
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
3506
|
-
/* harmony export */
|
|
3565
|
+
/* harmony export */ validateAndCorrectAgentResponse: () => (/* binding */ validateAndCorrectAgentResponse)
|
|
3566
|
+
/* harmony export */ });
|
|
3567
|
+
/*
|
|
3568
|
+
* Copyright (c) Saga Inc.
|
|
3569
|
+
* Distributed under the terms of the GNU Affero General Public License v3.0 License.
|
|
3570
|
+
*/
|
|
3571
|
+
/**
|
|
3572
|
+
* Validates and corrects an AgentResponse to ensure it adheres to the expected format.
|
|
3573
|
+
* Handles common mistakes like string instead of array, missing fields, etc.
|
|
3574
|
+
*/
|
|
3575
|
+
function validateAndCorrectAgentResponse(agentResponse) {
|
|
3576
|
+
// Create a copy to avoid mutating the original
|
|
3577
|
+
const correctedResponse = { ...agentResponse };
|
|
3578
|
+
// Ensure type is valid. Default to finished_task if not valid.
|
|
3579
|
+
const validTypes = ['cell_update', 'get_cell_output', 'run_all_cells', 'finished_task'];
|
|
3580
|
+
correctedResponse.type = (correctedResponse.type && validTypes.includes(correctedResponse.type))
|
|
3581
|
+
? correctedResponse.type
|
|
3582
|
+
: 'finished_task';
|
|
3583
|
+
// Ensure message is a string. Default to empty string if not valid.
|
|
3584
|
+
if (!correctedResponse.message || typeof correctedResponse.message !== 'string') {
|
|
3585
|
+
correctedResponse.message = '';
|
|
3586
|
+
}
|
|
3587
|
+
// Correct get_cell_output_cell_id if present
|
|
3588
|
+
const getCellOutputCellIdType = typeof correctedResponse.get_cell_output_cell_id;
|
|
3589
|
+
correctedResponse.get_cell_output_cell_id = getCellOutputCellIdType === 'string' ? correctedResponse.get_cell_output_cell_id : undefined;
|
|
3590
|
+
// Correct next_steps - handle string to array conversion
|
|
3591
|
+
if (correctedResponse.next_steps !== undefined && correctedResponse.next_steps !== null) {
|
|
3592
|
+
correctedResponse.next_steps = correctStringArray(correctedResponse.next_steps);
|
|
3593
|
+
}
|
|
3594
|
+
// Correct analysis_assumptions - handle string to array conversion
|
|
3595
|
+
if (correctedResponse.analysis_assumptions !== undefined && correctedResponse.analysis_assumptions !== null) {
|
|
3596
|
+
correctedResponse.analysis_assumptions = correctStringArray(correctedResponse.analysis_assumptions);
|
|
3597
|
+
}
|
|
3598
|
+
// For now we don't validate the cell_update object itself, as this is more complex and has
|
|
3599
|
+
// not caused issues thus far.
|
|
3600
|
+
return correctedResponse;
|
|
3601
|
+
}
|
|
3602
|
+
/**
|
|
3603
|
+
* Corrects a value to be a string array, handling various input formats.
|
|
3604
|
+
* Handles cases where the AI returns a string instead of an array of strings.
|
|
3605
|
+
*/
|
|
3606
|
+
function correctStringArray(value) {
|
|
3607
|
+
// If it's already a valid array of strings, return it
|
|
3608
|
+
if (Array.isArray(value)) {
|
|
3609
|
+
return value;
|
|
3610
|
+
}
|
|
3611
|
+
if (typeof value === 'string') {
|
|
3612
|
+
return [value];
|
|
3613
|
+
}
|
|
3614
|
+
return null;
|
|
3615
|
+
}
|
|
3616
|
+
|
|
3617
|
+
|
|
3618
|
+
/***/ }),
|
|
3619
|
+
|
|
3620
|
+
/***/ "./lib/Extensions/AppDeploy/AppDeployPlugin.js":
|
|
3621
|
+
/*!*****************************************************!*\
|
|
3622
|
+
!*** ./lib/Extensions/AppDeploy/AppDeployPlugin.js ***!
|
|
3623
|
+
\*****************************************************/
|
|
3624
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3625
|
+
|
|
3626
|
+
__webpack_require__.r(__webpack_exports__);
|
|
3627
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
3628
|
+
/* harmony export */ IAppDeployService: () => (/* binding */ IAppDeployService),
|
|
3507
3629
|
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
3508
3630
|
/* harmony export */ });
|
|
3509
3631
|
/* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @lumino/coreutils */ "webpack/sharing/consume/default/@lumino/coreutils");
|
|
3510
3632
|
/* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_lumino_coreutils__WEBPACK_IMPORTED_MODULE_0__);
|
|
3511
|
-
/* harmony import */ var
|
|
3633
|
+
/* harmony import */ var _websockets_appDeploy_appDeployWebsocketClient__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../websockets/appDeploy/appDeployWebsocketClient */ "./lib/websockets/appDeploy/appDeployWebsocketClient.js");
|
|
3512
3634
|
/*
|
|
3513
3635
|
* Copyright (c) Saga Inc.
|
|
3514
3636
|
* Distributed under the terms of the GNU Affero General Public License v3.0 License.
|
|
@@ -3516,49 +3638,49 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
3516
3638
|
|
|
3517
3639
|
|
|
3518
3640
|
/**
|
|
3519
|
-
* The token for the
|
|
3641
|
+
* The token for the AppDeploy service.
|
|
3520
3642
|
*/
|
|
3521
|
-
const
|
|
3643
|
+
const IAppDeployService = new _lumino_coreutils__WEBPACK_IMPORTED_MODULE_0__.Token('mito-ai:IAppDeployService', 'Token for the AppDeploy service that provides access to the websocket client');
|
|
3522
3644
|
/**
|
|
3523
|
-
* Implementation of the
|
|
3645
|
+
* Implementation of the AppDeploy service.
|
|
3524
3646
|
*/
|
|
3525
|
-
class
|
|
3647
|
+
class AppDeployService {
|
|
3526
3648
|
/**
|
|
3527
|
-
* Create a new
|
|
3649
|
+
* Create a new AppDeploy service.
|
|
3528
3650
|
*/
|
|
3529
3651
|
constructor(app) {
|
|
3530
3652
|
// Create the websocket client with the app's server settings
|
|
3531
|
-
this.client = new
|
|
3653
|
+
this.client = new _websockets_appDeploy_appDeployWebsocketClient__WEBPACK_IMPORTED_MODULE_1__.AppDeployWebsocketClient({
|
|
3532
3654
|
serverSettings: app.serviceManager.serverSettings
|
|
3533
3655
|
});
|
|
3534
3656
|
// Initialize the websocket connection in the background
|
|
3535
3657
|
void this.client.initialize().catch(error => {
|
|
3536
|
-
console.error('Failed to initialize
|
|
3658
|
+
console.error('Failed to initialize AppDeploy websocket client:', error);
|
|
3537
3659
|
// We don't need to throw the error since the client will attempt to reconnect when used
|
|
3538
3660
|
});
|
|
3539
3661
|
}
|
|
3540
3662
|
}
|
|
3541
3663
|
/**
|
|
3542
|
-
* The
|
|
3664
|
+
* The AppDeploy plugin that provides the websocket client.
|
|
3543
3665
|
*/
|
|
3544
|
-
const
|
|
3545
|
-
id: 'mito-ai:app-
|
|
3666
|
+
const AppDeployPlugin = {
|
|
3667
|
+
id: 'mito-ai:app-deploy',
|
|
3546
3668
|
autoStart: true,
|
|
3547
|
-
provides:
|
|
3669
|
+
provides: IAppDeployService,
|
|
3548
3670
|
activate: (app) => {
|
|
3549
|
-
console.log('mito-ai:
|
|
3550
|
-
return new
|
|
3671
|
+
console.log('mito-ai: AppDeployPlugin activated');
|
|
3672
|
+
return new AppDeployService(app);
|
|
3551
3673
|
}
|
|
3552
3674
|
};
|
|
3553
|
-
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (
|
|
3675
|
+
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AppDeployPlugin);
|
|
3554
3676
|
|
|
3555
3677
|
|
|
3556
3678
|
/***/ }),
|
|
3557
3679
|
|
|
3558
|
-
/***/ "./lib/Extensions/
|
|
3559
|
-
|
|
3560
|
-
!*** ./lib/Extensions/
|
|
3561
|
-
|
|
3680
|
+
/***/ "./lib/Extensions/AppDeploy/DeployAppNotification.js":
|
|
3681
|
+
/*!***********************************************************!*\
|
|
3682
|
+
!*** ./lib/Extensions/AppDeploy/DeployAppNotification.js ***!
|
|
3683
|
+
\***********************************************************/
|
|
3562
3684
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3563
3685
|
|
|
3564
3686
|
__webpack_require__.r(__webpack_exports__);
|
|
@@ -3567,12 +3689,14 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
3567
3689
|
/* harmony export */ });
|
|
3568
3690
|
/* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/apputils */ "webpack/sharing/consume/default/@jupyterlab/apputils");
|
|
3569
3691
|
/* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__);
|
|
3692
|
+
/* harmony import */ var _AppManager_CheckAppStatusAPI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../AppManager/CheckAppStatusAPI */ "./lib/Extensions/AppManager/CheckAppStatusAPI.js");
|
|
3570
3693
|
/*
|
|
3571
3694
|
* Copyright (c) Saga Inc.
|
|
3572
3695
|
* Distributed under the terms of the GNU Affero General Public License v3.0 License.
|
|
3573
3696
|
*/
|
|
3574
3697
|
|
|
3575
|
-
|
|
3698
|
+
|
|
3699
|
+
const deployAppNotification = (url, appManagerService) => {
|
|
3576
3700
|
// Total deployment time in milliseconds (3 minutes = 180000ms)
|
|
3577
3701
|
const totalDeploymentTime = 180000;
|
|
3578
3702
|
// Create an array of deployment steps
|
|
@@ -3591,27 +3715,70 @@ const deployAppNotification = (url) => {
|
|
|
3591
3715
|
});
|
|
3592
3716
|
// Calculate time between steps (evenly distribute throughout the total deployment time)
|
|
3593
3717
|
const stepInterval = totalDeploymentTime / (deploymentSteps.length - 1);
|
|
3718
|
+
let retryCount = 5;
|
|
3594
3719
|
// Update message at each step interval
|
|
3595
3720
|
for (let i = 1; i < deploymentSteps.length; i++) {
|
|
3596
3721
|
setTimeout(() => {
|
|
3597
3722
|
const isLastStep = i === deploymentSteps.length - 1;
|
|
3598
|
-
|
|
3599
|
-
|
|
3600
|
-
|
|
3601
|
-
|
|
3602
|
-
|
|
3603
|
-
|
|
3604
|
-
|
|
3605
|
-
|
|
3606
|
-
|
|
3607
|
-
|
|
3608
|
-
|
|
3609
|
-
|
|
3610
|
-
|
|
3723
|
+
if (isLastStep) {
|
|
3724
|
+
const checkUrlAndUpdate = async () => {
|
|
3725
|
+
if (retryCount < 0) {
|
|
3726
|
+
console.log("Retries done");
|
|
3727
|
+
_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.Notification.update({
|
|
3728
|
+
id: notificationId,
|
|
3729
|
+
message: "Unable to deploy. Your app is not reachable",
|
|
3730
|
+
type: 'warning',
|
|
3731
|
+
autoClose: false
|
|
3732
|
+
});
|
|
3733
|
+
return;
|
|
3734
|
+
}
|
|
3735
|
+
try {
|
|
3736
|
+
console.log("Awaiting response");
|
|
3737
|
+
const urlIsUp = await (0,_AppManager_CheckAppStatusAPI__WEBPACK_IMPORTED_MODULE_1__.checkAppStatus)(url, appManagerService);
|
|
3738
|
+
console.log(`App status check result for ${url}: ${urlIsUp}`);
|
|
3739
|
+
if (urlIsUp) {
|
|
3740
|
+
// Update notification with the button
|
|
3741
|
+
_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.Notification.update({
|
|
3742
|
+
id: notificationId,
|
|
3743
|
+
message: deploymentSteps[i],
|
|
3744
|
+
type: 'default',
|
|
3745
|
+
autoClose: false,
|
|
3746
|
+
actions: [
|
|
3747
|
+
{
|
|
3748
|
+
label: "Launch Application Now",
|
|
3749
|
+
displayType: 'accent',
|
|
3750
|
+
callback: () => {
|
|
3751
|
+
window.open(url, '_blank');
|
|
3752
|
+
}
|
|
3753
|
+
}
|
|
3754
|
+
]
|
|
3755
|
+
});
|
|
3611
3756
|
}
|
|
3612
|
-
|
|
3613
|
-
|
|
3614
|
-
|
|
3757
|
+
else {
|
|
3758
|
+
// Retry after 30s
|
|
3759
|
+
console.log("In retry for url to be up");
|
|
3760
|
+
retryCount = retryCount - 1;
|
|
3761
|
+
setTimeout(() => void checkUrlAndUpdate(), 30000);
|
|
3762
|
+
}
|
|
3763
|
+
}
|
|
3764
|
+
catch (error) {
|
|
3765
|
+
// Retry after 30s
|
|
3766
|
+
console.error("Error checking app status:", error);
|
|
3767
|
+
retryCount = retryCount - 1;
|
|
3768
|
+
setTimeout(() => void checkUrlAndUpdate(), 30000);
|
|
3769
|
+
}
|
|
3770
|
+
};
|
|
3771
|
+
void checkUrlAndUpdate();
|
|
3772
|
+
}
|
|
3773
|
+
else {
|
|
3774
|
+
// Regular intermediate step
|
|
3775
|
+
_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.Notification.update({
|
|
3776
|
+
id: notificationId,
|
|
3777
|
+
message: deploymentSteps[i],
|
|
3778
|
+
type: 'in-progress',
|
|
3779
|
+
autoClose: false
|
|
3780
|
+
});
|
|
3781
|
+
}
|
|
3615
3782
|
}, i * stepInterval);
|
|
3616
3783
|
}
|
|
3617
3784
|
};
|
|
@@ -3619,27 +3786,25 @@ const deployAppNotification = (url) => {
|
|
|
3619
3786
|
|
|
3620
3787
|
/***/ }),
|
|
3621
3788
|
|
|
3622
|
-
/***/ "./lib/Extensions/
|
|
3623
|
-
|
|
3624
|
-
!*** ./lib/Extensions/
|
|
3625
|
-
|
|
3789
|
+
/***/ "./lib/Extensions/AppDeploy/DeployStreamlitApp.js":
|
|
3790
|
+
/*!********************************************************!*\
|
|
3791
|
+
!*** ./lib/Extensions/AppDeploy/DeployStreamlitApp.js ***!
|
|
3792
|
+
\********************************************************/
|
|
3626
3793
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3627
3794
|
|
|
3628
3795
|
__webpack_require__.r(__webpack_exports__);
|
|
3629
3796
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
3630
|
-
/* harmony export */
|
|
3797
|
+
/* harmony export */ deployStreamlitApp: () => (/* binding */ deployStreamlitApp)
|
|
3631
3798
|
/* harmony export */ });
|
|
3632
|
-
/* harmony import */ var
|
|
3633
|
-
/* harmony import */ var
|
|
3634
|
-
/* harmony import */ var
|
|
3635
|
-
/* harmony import */ var
|
|
3636
|
-
/* harmony import */ var
|
|
3637
|
-
/* harmony import */ var
|
|
3638
|
-
/* harmony import */ var
|
|
3639
|
-
/* harmony import */ var
|
|
3640
|
-
/* harmony import */ var
|
|
3641
|
-
/* harmony import */ var _auth__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./auth */ "./lib/Extensions/AppBuilder/auth.js");
|
|
3642
|
-
/* harmony import */ var _authPopupUtils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./authPopupUtils */ "./lib/Extensions/AppBuilder/authPopupUtils.js");
|
|
3799
|
+
/* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/apputils */ "webpack/sharing/consume/default/@jupyterlab/apputils");
|
|
3800
|
+
/* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__);
|
|
3801
|
+
/* harmony import */ var _requirementsUtils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./requirementsUtils */ "./lib/Extensions/AppDeploy/requirementsUtils.js");
|
|
3802
|
+
/* harmony import */ var _fileUtils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./fileUtils */ "./lib/Extensions/AppDeploy/fileUtils.js");
|
|
3803
|
+
/* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @lumino/coreutils */ "webpack/sharing/consume/default/@lumino/coreutils");
|
|
3804
|
+
/* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_lumino_coreutils__WEBPACK_IMPORTED_MODULE_1__);
|
|
3805
|
+
/* harmony import */ var _DeployAppNotification__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./DeployAppNotification */ "./lib/Extensions/AppDeploy/DeployAppNotification.js");
|
|
3806
|
+
/* harmony import */ var _auth__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./auth */ "./lib/Extensions/AppDeploy/auth.js");
|
|
3807
|
+
/* harmony import */ var _authPopupUtils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./authPopupUtils */ "./lib/Extensions/AppDeploy/authPopupUtils.js");
|
|
3643
3808
|
/*
|
|
3644
3809
|
* Copyright (c) Saga Inc.
|
|
3645
3810
|
* Distributed under the terms of the GNU Affero General Public License v3.0 License.
|
|
@@ -3651,23 +3816,23 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
3651
3816
|
|
|
3652
3817
|
|
|
3653
3818
|
|
|
3654
|
-
|
|
3655
3819
|
/*
|
|
3656
|
-
This function generates
|
|
3820
|
+
This function generates the requirements.txt file needed to host the streamlit app,
|
|
3821
|
+
and deploys it!
|
|
3657
3822
|
*/
|
|
3658
|
-
const
|
|
3659
|
-
let jwtToken = await (0,
|
|
3823
|
+
const deployStreamlitApp = async (notebookTracker, appDeployService, appManagerService) => {
|
|
3824
|
+
let jwtToken = await (0,_auth__WEBPACK_IMPORTED_MODULE_2__.getJWTToken)();
|
|
3660
3825
|
if (!jwtToken) {
|
|
3661
3826
|
// No token found, show authentication popup
|
|
3662
3827
|
console.log('User not authenticated, redirected to signup');
|
|
3663
3828
|
try {
|
|
3664
|
-
const user = await (0,
|
|
3829
|
+
const user = await (0,_authPopupUtils__WEBPACK_IMPORTED_MODULE_3__.showAuthenticationPopup)();
|
|
3665
3830
|
console.log('User authenticated successfully:', user);
|
|
3666
3831
|
// Try to get the JWT token again after successful authentication
|
|
3667
|
-
jwtToken = await (0,
|
|
3832
|
+
jwtToken = await (0,_auth__WEBPACK_IMPORTED_MODULE_2__.getJWTToken)();
|
|
3668
3833
|
if (!jwtToken) {
|
|
3669
3834
|
console.error('JWT token still not available after authentication');
|
|
3670
|
-
|
|
3835
|
+
_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.Notification.emit('Authentication failed - JWT token not found', 'error', {
|
|
3671
3836
|
autoClose: false
|
|
3672
3837
|
});
|
|
3673
3838
|
return;
|
|
@@ -3684,54 +3849,44 @@ const convertNotebookToStreamlit = async (notebookTracker, appBuilderService) =>
|
|
|
3684
3849
|
return;
|
|
3685
3850
|
}
|
|
3686
3851
|
const notebookPath = notebookPanel.context.path;
|
|
3687
|
-
const notebookName = _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_0__.PathExt.basename(notebookPath, '.ipynb');
|
|
3688
|
-
console.log('Notebook path:', notebookPath);
|
|
3689
|
-
console.log('Notebook name:', notebookName);
|
|
3690
|
-
console.log('Current working directory info:', notebookPanel.context);
|
|
3691
3852
|
// Build the requirements.txt file
|
|
3692
|
-
|
|
3693
|
-
const requirementsContent = await (0,_requirementsUtils__WEBPACK_IMPORTED_MODULE_5__.generateRequirementsTxt)(notebookTracker);
|
|
3853
|
+
const requirementsContent = await (0,_requirementsUtils__WEBPACK_IMPORTED_MODULE_4__.generateRequirementsTxt)(notebookTracker);
|
|
3694
3854
|
// Save the files to the current directory
|
|
3695
|
-
await (0,
|
|
3855
|
+
await (0,_fileUtils__WEBPACK_IMPORTED_MODULE_5__.saveFileWithKernel)(notebookTracker, './requirements.txt', requirementsContent);
|
|
3696
3856
|
// After building the files, we need to send a request to the backend to deploy the app
|
|
3697
|
-
|
|
3698
|
-
|
|
3699
|
-
|
|
3700
|
-
|
|
3701
|
-
|
|
3702
|
-
|
|
3703
|
-
|
|
3704
|
-
|
|
3705
|
-
|
|
3857
|
+
try {
|
|
3858
|
+
console.log("Sending request to deploy the app");
|
|
3859
|
+
// Use the JWT token that was already obtained or refreshed above
|
|
3860
|
+
const response = await appDeployService.client.sendMessage({
|
|
3861
|
+
type: 'deploy-app',
|
|
3862
|
+
message_id: _lumino_coreutils__WEBPACK_IMPORTED_MODULE_1__.UUID.uuid4(),
|
|
3863
|
+
notebook_path: notebookPath,
|
|
3864
|
+
jwt_token: jwtToken
|
|
3865
|
+
});
|
|
3866
|
+
if (response.error) {
|
|
3867
|
+
_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.Notification.emit(response.error.title, 'error', {
|
|
3868
|
+
autoClose: false
|
|
3706
3869
|
});
|
|
3707
|
-
if (response.error) {
|
|
3708
|
-
_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.Notification.emit(response.error.title, 'error', {
|
|
3709
|
-
autoClose: false
|
|
3710
|
-
});
|
|
3711
|
-
}
|
|
3712
|
-
else {
|
|
3713
|
-
console.log("App deployment response:", response);
|
|
3714
|
-
const url = response.url;
|
|
3715
|
-
(0,_DeployAppNotification__WEBPACK_IMPORTED_MODULE_7__.deployAppNotification)(url);
|
|
3716
|
-
}
|
|
3717
3870
|
}
|
|
3718
|
-
|
|
3719
|
-
|
|
3720
|
-
|
|
3871
|
+
else {
|
|
3872
|
+
console.log("App deployment response:", response);
|
|
3873
|
+
const url = response.url;
|
|
3874
|
+
(0,_DeployAppNotification__WEBPACK_IMPORTED_MODULE_6__.deployAppNotification)(url, appManagerService);
|
|
3721
3875
|
}
|
|
3722
3876
|
}
|
|
3723
|
-
|
|
3724
|
-
|
|
3877
|
+
catch (error) {
|
|
3878
|
+
// TODO: Do something with the error
|
|
3879
|
+
console.error("Error deploying app:", error);
|
|
3725
3880
|
}
|
|
3726
3881
|
};
|
|
3727
3882
|
|
|
3728
3883
|
|
|
3729
3884
|
/***/ }),
|
|
3730
3885
|
|
|
3731
|
-
/***/ "./lib/Extensions/
|
|
3732
|
-
|
|
3733
|
-
!*** ./lib/Extensions/
|
|
3734
|
-
|
|
3886
|
+
/***/ "./lib/Extensions/AppDeploy/auth-popup-deploy.js":
|
|
3887
|
+
/*!*******************************************************!*\
|
|
3888
|
+
!*** ./lib/Extensions/AppDeploy/auth-popup-deploy.js ***!
|
|
3889
|
+
\*******************************************************/
|
|
3735
3890
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3736
3891
|
|
|
3737
3892
|
__webpack_require__.r(__webpack_exports__);
|
|
@@ -3838,10 +3993,10 @@ const AuthPopup = ({ isOpen, onClose, onSuccess }) => {
|
|
|
3838
3993
|
|
|
3839
3994
|
/***/ }),
|
|
3840
3995
|
|
|
3841
|
-
/***/ "./lib/Extensions/
|
|
3842
|
-
|
|
3843
|
-
!*** ./lib/Extensions/
|
|
3844
|
-
|
|
3996
|
+
/***/ "./lib/Extensions/AppDeploy/auth.js":
|
|
3997
|
+
/*!******************************************!*\
|
|
3998
|
+
!*** ./lib/Extensions/AppDeploy/auth.js ***!
|
|
3999
|
+
\******************************************/
|
|
3845
4000
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3846
4001
|
|
|
3847
4002
|
__webpack_require__.r(__webpack_exports__);
|
|
@@ -3852,7 +4007,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
3852
4007
|
/* harmony export */ });
|
|
3853
4008
|
/* harmony import */ var aws_amplify_auth__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! aws-amplify/auth */ "./node_modules/@aws-amplify/core/dist/esm/singleton/apis/fetchAuthSession.mjs");
|
|
3854
4009
|
/* harmony import */ var aws_amplify_auth__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! aws-amplify/auth */ "./node_modules/@aws-amplify/auth/dist/esm/providers/cognito/apis/signOut.mjs");
|
|
3855
|
-
/* harmony import */ var _aws_config__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./aws-config */ "./lib/Extensions/
|
|
4010
|
+
/* harmony import */ var _aws_config__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./aws-config */ "./lib/Extensions/AppDeploy/aws-config.js");
|
|
3856
4011
|
/*
|
|
3857
4012
|
* Copyright (c) Saga Inc.
|
|
3858
4013
|
* Distributed under the terms of the GNU Affero General Public License v3.0 License.
|
|
@@ -3921,10 +4076,10 @@ const logoutAndClearJWTTokens = async () => {
|
|
|
3921
4076
|
|
|
3922
4077
|
/***/ }),
|
|
3923
4078
|
|
|
3924
|
-
/***/ "./lib/Extensions/
|
|
3925
|
-
|
|
3926
|
-
!*** ./lib/Extensions/
|
|
3927
|
-
|
|
4079
|
+
/***/ "./lib/Extensions/AppDeploy/authPopupUtils.js":
|
|
4080
|
+
/*!****************************************************!*\
|
|
4081
|
+
!*** ./lib/Extensions/AppDeploy/authPopupUtils.js ***!
|
|
4082
|
+
\****************************************************/
|
|
3928
4083
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3929
4084
|
|
|
3930
4085
|
__webpack_require__.r(__webpack_exports__);
|
|
@@ -3934,7 +4089,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
3934
4089
|
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
|
|
3935
4090
|
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
|
3936
4091
|
/* harmony import */ var react_dom_client__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom/client */ "./node_modules/react-dom/client.js");
|
|
3937
|
-
/* harmony import */ var _auth_popup_deploy__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./auth-popup-deploy */ "./lib/Extensions/
|
|
4092
|
+
/* harmony import */ var _auth_popup_deploy__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./auth-popup-deploy */ "./lib/Extensions/AppDeploy/auth-popup-deploy.js");
|
|
3938
4093
|
/*
|
|
3939
4094
|
* Copyright (c) Saga Inc.
|
|
3940
4095
|
* Distributed under the terms of the GNU Affero General Public License v3.0 License.
|
|
@@ -3973,10 +4128,10 @@ const showAuthenticationPopup = () => {
|
|
|
3973
4128
|
|
|
3974
4129
|
/***/ }),
|
|
3975
4130
|
|
|
3976
|
-
/***/ "./lib/Extensions/
|
|
3977
|
-
|
|
3978
|
-
!*** ./lib/Extensions/
|
|
3979
|
-
|
|
4131
|
+
/***/ "./lib/Extensions/AppDeploy/aws-config.js":
|
|
4132
|
+
/*!************************************************!*\
|
|
4133
|
+
!*** ./lib/Extensions/AppDeploy/aws-config.js ***!
|
|
4134
|
+
\************************************************/
|
|
3980
4135
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3981
4136
|
|
|
3982
4137
|
__webpack_require__.r(__webpack_exports__);
|
|
@@ -4016,10 +4171,10 @@ configureAmplify();
|
|
|
4016
4171
|
|
|
4017
4172
|
/***/ }),
|
|
4018
4173
|
|
|
4019
|
-
/***/ "./lib/Extensions/
|
|
4020
|
-
|
|
4021
|
-
!*** ./lib/Extensions/
|
|
4022
|
-
|
|
4174
|
+
/***/ "./lib/Extensions/AppDeploy/fileUtils.js":
|
|
4175
|
+
/*!***********************************************!*\
|
|
4176
|
+
!*** ./lib/Extensions/AppDeploy/fileUtils.js ***!
|
|
4177
|
+
\***********************************************/
|
|
4023
4178
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
4024
4179
|
|
|
4025
4180
|
__webpack_require__.r(__webpack_exports__);
|
|
@@ -4084,10 +4239,10 @@ print(f"File saved successfully to ${filePath}")
|
|
|
4084
4239
|
|
|
4085
4240
|
/***/ }),
|
|
4086
4241
|
|
|
4087
|
-
/***/ "./lib/Extensions/
|
|
4088
|
-
|
|
4089
|
-
!*** ./lib/Extensions/
|
|
4090
|
-
|
|
4242
|
+
/***/ "./lib/Extensions/AppDeploy/requirementsUtils.js":
|
|
4243
|
+
/*!*******************************************************!*\
|
|
4244
|
+
!*** ./lib/Extensions/AppDeploy/requirementsUtils.js ***!
|
|
4245
|
+
\*******************************************************/
|
|
4091
4246
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
4092
4247
|
|
|
4093
4248
|
__webpack_require__.r(__webpack_exports__);
|
|
@@ -4240,7 +4395,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
4240
4395
|
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
|
4241
4396
|
/* harmony import */ var _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @jupyterlab/ui-components */ "webpack/sharing/consume/default/@jupyterlab/ui-components");
|
|
4242
4397
|
/* harmony import */ var _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_1__);
|
|
4243
|
-
/* harmony import */ var
|
|
4398
|
+
/* harmony import */ var _AppDeploy_auth__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../AppDeploy/auth */ "./lib/Extensions/AppDeploy/auth.js");
|
|
4244
4399
|
/* harmony import */ var _ListAppsAPI__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ListAppsAPI */ "./lib/Extensions/AppManager/ListAppsAPI.js");
|
|
4245
4400
|
/* harmony import */ var _style_AppsList_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../style/AppsList.css */ "./style/AppsList.css");
|
|
4246
4401
|
/*
|
|
@@ -4337,7 +4492,7 @@ const AppsList = ({ appManagerService }) => {
|
|
|
4337
4492
|
react__WEBPACK_IMPORTED_MODULE_0__.createElement("button", { onClick: refreshApps, disabled: loading, className: "apps-list-button", title: "Refresh apps" }, loading ? 'Loading...' : 'Refresh'),
|
|
4338
4493
|
react__WEBPACK_IMPORTED_MODULE_0__.createElement("button", { onClick: () => {
|
|
4339
4494
|
console.log('Logout clicked');
|
|
4340
|
-
void (0,
|
|
4495
|
+
void (0,_AppDeploy_auth__WEBPACK_IMPORTED_MODULE_4__.logoutAndClearJWTTokens)();
|
|
4341
4496
|
}, className: "apps-list-button", title: "Logout" }, "Logout"))),
|
|
4342
4497
|
loading ? (react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "apps-list-loading" }, "Loading apps...")) : error ? (react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "apps-list-error" },
|
|
4343
4498
|
"Error: ",
|
|
@@ -4360,6 +4515,49 @@ const AppsList = ({ appManagerService }) => {
|
|
|
4360
4515
|
};
|
|
4361
4516
|
|
|
4362
4517
|
|
|
4518
|
+
/***/ }),
|
|
4519
|
+
|
|
4520
|
+
/***/ "./lib/Extensions/AppManager/CheckAppStatusAPI.js":
|
|
4521
|
+
/*!********************************************************!*\
|
|
4522
|
+
!*** ./lib/Extensions/AppManager/CheckAppStatusAPI.js ***!
|
|
4523
|
+
\********************************************************/
|
|
4524
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
4525
|
+
|
|
4526
|
+
__webpack_require__.r(__webpack_exports__);
|
|
4527
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
4528
|
+
/* harmony export */ checkAppStatus: () => (/* binding */ checkAppStatus)
|
|
4529
|
+
/* harmony export */ });
|
|
4530
|
+
/*
|
|
4531
|
+
* Copyright (c) Saga Inc.
|
|
4532
|
+
* Distributed under the terms of the GNU Affero General Public License v3.0 License.
|
|
4533
|
+
*/
|
|
4534
|
+
/**
|
|
4535
|
+
* Check if an app URL is accessible through the backend.
|
|
4536
|
+
*/
|
|
4537
|
+
const checkAppStatus = async (appUrl, appManagerService) => {
|
|
4538
|
+
try {
|
|
4539
|
+
// Create the request message with proper typing
|
|
4540
|
+
const request = {
|
|
4541
|
+
type: 'check-app-status',
|
|
4542
|
+
app_url: appUrl
|
|
4543
|
+
};
|
|
4544
|
+
// Using websocket service
|
|
4545
|
+
const response = await appManagerService.client.sendMessage(request);
|
|
4546
|
+
// Check if the response indicates an error
|
|
4547
|
+
if (response.error) {
|
|
4548
|
+
console.error('Error checking app status:', response.error.title);
|
|
4549
|
+
return false;
|
|
4550
|
+
}
|
|
4551
|
+
console.log('App is accessible:', response.is_accessible);
|
|
4552
|
+
return response.is_accessible;
|
|
4553
|
+
}
|
|
4554
|
+
catch (error) {
|
|
4555
|
+
console.error('Error checking app status:', error);
|
|
4556
|
+
return false;
|
|
4557
|
+
}
|
|
4558
|
+
};
|
|
4559
|
+
|
|
4560
|
+
|
|
4363
4561
|
/***/ }),
|
|
4364
4562
|
|
|
4365
4563
|
/***/ "./lib/Extensions/AppManager/ListAppsAPI.js":
|
|
@@ -4374,7 +4572,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
4374
4572
|
/* harmony export */ isGetAppsFailure: () => (/* binding */ isGetAppsFailure),
|
|
4375
4573
|
/* harmony export */ isGetAppsSuccess: () => (/* binding */ isGetAppsSuccess)
|
|
4376
4574
|
/* harmony export */ });
|
|
4377
|
-
/* harmony import */ var
|
|
4575
|
+
/* harmony import */ var _AppDeploy_auth__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../AppDeploy/auth */ "./lib/Extensions/AppDeploy/auth.js");
|
|
4378
4576
|
/*
|
|
4379
4577
|
* Copyright (c) Saga Inc.
|
|
4380
4578
|
* Distributed under the terms of the GNU Affero General Public License v3.0 License.
|
|
@@ -4389,7 +4587,7 @@ const isGetAppsFailure = (response) => {
|
|
|
4389
4587
|
};
|
|
4390
4588
|
const fetchUserApps = async (appManagerService) => {
|
|
4391
4589
|
try {
|
|
4392
|
-
const jwtToken = await (0,
|
|
4590
|
+
const jwtToken = await (0,_AppDeploy_auth__WEBPACK_IMPORTED_MODULE_0__.getJWTToken)();
|
|
4393
4591
|
if (!jwtToken) {
|
|
4394
4592
|
return {
|
|
4395
4593
|
success: false,
|
|
@@ -4530,6 +4728,211 @@ const ManageAppsPlugin = {
|
|
|
4530
4728
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ManageAppsPlugin);
|
|
4531
4729
|
|
|
4532
4730
|
|
|
4731
|
+
/***/ }),
|
|
4732
|
+
|
|
4733
|
+
/***/ "./lib/Extensions/AppPreview/StreamlitPreviewPlugin.js":
|
|
4734
|
+
/*!*************************************************************!*\
|
|
4735
|
+
!*** ./lib/Extensions/AppPreview/StreamlitPreviewPlugin.js ***!
|
|
4736
|
+
\*************************************************************/
|
|
4737
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
4738
|
+
|
|
4739
|
+
__webpack_require__.r(__webpack_exports__);
|
|
4740
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
4741
|
+
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
4742
|
+
/* harmony export */ });
|
|
4743
|
+
/* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/notebook */ "webpack/sharing/consume/default/@jupyterlab/notebook");
|
|
4744
|
+
/* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__);
|
|
4745
|
+
/* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @jupyterlab/apputils */ "webpack/sharing/consume/default/@jupyterlab/apputils");
|
|
4746
|
+
/* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__);
|
|
4747
|
+
/* harmony import */ var _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @jupyterlab/coreutils */ "webpack/sharing/consume/default/@jupyterlab/coreutils");
|
|
4748
|
+
/* harmony import */ var _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_2__);
|
|
4749
|
+
/* harmony import */ var _lumino_widgets__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @lumino/widgets */ "webpack/sharing/consume/default/@lumino/widgets");
|
|
4750
|
+
/* harmony import */ var _lumino_widgets__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_lumino_widgets__WEBPACK_IMPORTED_MODULE_3__);
|
|
4751
|
+
/* harmony import */ var _restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../restAPI/RestAPI */ "./lib/restAPI/RestAPI.js");
|
|
4752
|
+
/* harmony import */ var _AppDeploy_DeployStreamlitApp__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../AppDeploy/DeployStreamlitApp */ "./lib/Extensions/AppDeploy/DeployStreamlitApp.js");
|
|
4753
|
+
/* harmony import */ var _AppDeploy_AppDeployPlugin__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../AppDeploy/AppDeployPlugin */ "./lib/Extensions/AppDeploy/AppDeployPlugin.js");
|
|
4754
|
+
/* harmony import */ var _AppManager_ManageAppsPlugin__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../AppManager/ManageAppsPlugin */ "./lib/Extensions/AppManager/ManageAppsPlugin.js");
|
|
4755
|
+
/* harmony import */ var _commands__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../commands */ "./lib/commands.js");
|
|
4756
|
+
/* harmony import */ var _icons__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../icons */ "./lib/icons/index.js");
|
|
4757
|
+
/* harmony import */ var _style_StreamlitPreviewPlugin_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../style/StreamlitPreviewPlugin.css */ "./style/StreamlitPreviewPlugin.css");
|
|
4758
|
+
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils */ "./lib/Extensions/AppPreview/utils.js");
|
|
4759
|
+
/*
|
|
4760
|
+
* Copyright (c) Saga Inc.
|
|
4761
|
+
* Distributed under the terms of the GNU Affero General Public License v3.0 License.
|
|
4762
|
+
*/
|
|
4763
|
+
|
|
4764
|
+
|
|
4765
|
+
|
|
4766
|
+
|
|
4767
|
+
|
|
4768
|
+
|
|
4769
|
+
|
|
4770
|
+
|
|
4771
|
+
|
|
4772
|
+
|
|
4773
|
+
|
|
4774
|
+
|
|
4775
|
+
|
|
4776
|
+
|
|
4777
|
+
/**
|
|
4778
|
+
* Simple HTML widget for displaying iframe content.
|
|
4779
|
+
*/
|
|
4780
|
+
class IFrameWidget extends _lumino_widgets__WEBPACK_IMPORTED_MODULE_3__.Widget {
|
|
4781
|
+
constructor(url) {
|
|
4782
|
+
super();
|
|
4783
|
+
this.addClass('jp-iframe-widget');
|
|
4784
|
+
const iframe = document.createElement('iframe');
|
|
4785
|
+
iframe.src = url;
|
|
4786
|
+
iframe.style.width = '100%';
|
|
4787
|
+
iframe.style.height = '100%';
|
|
4788
|
+
iframe.style.border = 'none';
|
|
4789
|
+
this.node.appendChild(iframe);
|
|
4790
|
+
}
|
|
4791
|
+
setUrl(url) {
|
|
4792
|
+
const iframe = this.node.querySelector('iframe');
|
|
4793
|
+
if (iframe) {
|
|
4794
|
+
iframe.src = url;
|
|
4795
|
+
}
|
|
4796
|
+
}
|
|
4797
|
+
}
|
|
4798
|
+
/**
|
|
4799
|
+
* The streamlit preview plugin.
|
|
4800
|
+
*/
|
|
4801
|
+
const StreamlitPreviewPlugin = {
|
|
4802
|
+
id: 'mito-ai:streamlit-preview',
|
|
4803
|
+
autoStart: true,
|
|
4804
|
+
requires: [_jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__.INotebookTracker, _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.ICommandPalette, _AppDeploy_AppDeployPlugin__WEBPACK_IMPORTED_MODULE_5__.IAppDeployService, _AppManager_ManageAppsPlugin__WEBPACK_IMPORTED_MODULE_6__.IAppManagerService],
|
|
4805
|
+
activate: (app, notebookTracker, palette, appDeployService, appManagerService) => {
|
|
4806
|
+
console.log('mito-ai: StreamlitPreviewPlugin activated');
|
|
4807
|
+
// Add command to command palette
|
|
4808
|
+
app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_7__.COMMAND_MITO_AI_PREVIEW_AS_STREAMLIT, {
|
|
4809
|
+
label: 'Preview as Streamlit',
|
|
4810
|
+
caption: 'Convert current notebook to Streamlit app and preview it',
|
|
4811
|
+
execute: async () => {
|
|
4812
|
+
await previewNotebookAsStreamlit(app, notebookTracker, appDeployService, appManagerService);
|
|
4813
|
+
}
|
|
4814
|
+
});
|
|
4815
|
+
// Add to command palette
|
|
4816
|
+
palette.addItem({
|
|
4817
|
+
command: _commands__WEBPACK_IMPORTED_MODULE_7__.COMMAND_MITO_AI_PREVIEW_AS_STREAMLIT,
|
|
4818
|
+
category: 'Mito AI'
|
|
4819
|
+
});
|
|
4820
|
+
}
|
|
4821
|
+
};
|
|
4822
|
+
/**
|
|
4823
|
+
* Preview the current notebook as a Streamlit app.
|
|
4824
|
+
*/
|
|
4825
|
+
async function previewNotebookAsStreamlit(app, notebookTracker, appDeployService, appManagerService) {
|
|
4826
|
+
const notebookPanel = notebookTracker.currentWidget;
|
|
4827
|
+
if (!notebookPanel) {
|
|
4828
|
+
_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.Notification.error('No notebook is currently active');
|
|
4829
|
+
return;
|
|
4830
|
+
}
|
|
4831
|
+
// First save the notebook to ensure the app is up to date
|
|
4832
|
+
await notebookPanel.context.save();
|
|
4833
|
+
const notebookPath = notebookPanel.context.path;
|
|
4834
|
+
const notebookName = _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_2__.PathExt.basename(notebookPath, '.ipynb');
|
|
4835
|
+
let globalNotificationId;
|
|
4836
|
+
try {
|
|
4837
|
+
const { previewData, notificationId } = await (0,_utils__WEBPACK_IMPORTED_MODULE_8__.startStreamlitPreviewAndNotify)(notebookPath);
|
|
4838
|
+
globalNotificationId = notificationId;
|
|
4839
|
+
// Create iframe widget
|
|
4840
|
+
// TODO: Instead of having this widget creation code in the previewNotebookAsStreamlit function,
|
|
4841
|
+
// I wonder if we can make it part of the StreamlitPreviewPlugin. What we want is the following:
|
|
4842
|
+
// a react component that takes the app, notebookTracker, and appDeployService as a prop and is
|
|
4843
|
+
// already set up with this layout. Each time it opens, we're just deciding which notebook to display.
|
|
4844
|
+
const iframeWidget = new IFrameWidget(previewData.url);
|
|
4845
|
+
// Create main area widget
|
|
4846
|
+
const widget = new _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.MainAreaWidget({ content: iframeWidget });
|
|
4847
|
+
widget.title.label = `App Preview (${notebookName})`;
|
|
4848
|
+
widget.title.closable = true;
|
|
4849
|
+
// Add toolbar button to the MainAreaWidget's toolbar
|
|
4850
|
+
const deployButton = new _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.ToolbarButton({
|
|
4851
|
+
className: 'text-button-mito-ai button-base button-small jp-ToolbarButton mito-deploy-button',
|
|
4852
|
+
onClick: () => {
|
|
4853
|
+
void (0,_AppDeploy_DeployStreamlitApp__WEBPACK_IMPORTED_MODULE_9__.deployStreamlitApp)(notebookTracker, appDeployService, appManagerService);
|
|
4854
|
+
},
|
|
4855
|
+
tooltip: 'Deploy Streamlit App',
|
|
4856
|
+
label: 'Deploy App',
|
|
4857
|
+
icon: _icons__WEBPACK_IMPORTED_MODULE_10__.DeployLabIcon,
|
|
4858
|
+
iconClass: 'mito-ai-deploy-icon'
|
|
4859
|
+
});
|
|
4860
|
+
// Add toolbar button to the MainAreaWidget's toolbar
|
|
4861
|
+
const refreshButton = new _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.ToolbarButton({
|
|
4862
|
+
className: 'text-button-mito-ai button-base button-small jp-ToolbarButton mito-deploy-button',
|
|
4863
|
+
onClick: () => {
|
|
4864
|
+
void (0,_utils__WEBPACK_IMPORTED_MODULE_8__.startStreamlitPreviewAndNotify)(notebookPath, true);
|
|
4865
|
+
},
|
|
4866
|
+
tooltip: 'Rebuild Streamlit App',
|
|
4867
|
+
label: 'Rebuild App',
|
|
4868
|
+
icon: _icons__WEBPACK_IMPORTED_MODULE_10__.DeployLabIcon,
|
|
4869
|
+
iconClass: 'mito-ai-deploy-icon'
|
|
4870
|
+
});
|
|
4871
|
+
// Insert the button into the toolbar
|
|
4872
|
+
widget.toolbar.insertAfter('spacer', 'refresh-app-button', refreshButton);
|
|
4873
|
+
widget.toolbar.insertAfter('spacer', 'deploy-app-button', deployButton);
|
|
4874
|
+
// Handle widget disposal
|
|
4875
|
+
widget.disposed.connect(() => {
|
|
4876
|
+
console.log('Widget disposed, stopping preview');
|
|
4877
|
+
void (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_11__.stopStreamlitPreview)(previewData.id);
|
|
4878
|
+
});
|
|
4879
|
+
// Add widget to main area with split-right mode
|
|
4880
|
+
app.shell.add(widget, 'main', {
|
|
4881
|
+
mode: 'split-right',
|
|
4882
|
+
ref: notebookPanel.id
|
|
4883
|
+
});
|
|
4884
|
+
}
|
|
4885
|
+
catch (error) {
|
|
4886
|
+
console.error('Error starting streamlit preview:', error);
|
|
4887
|
+
// Update notification to error
|
|
4888
|
+
if (globalNotificationId) {
|
|
4889
|
+
_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.Notification.update({
|
|
4890
|
+
id: globalNotificationId,
|
|
4891
|
+
message: `Failed to start preview: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
4892
|
+
type: 'error',
|
|
4893
|
+
autoClose: false
|
|
4894
|
+
});
|
|
4895
|
+
}
|
|
4896
|
+
}
|
|
4897
|
+
}
|
|
4898
|
+
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (StreamlitPreviewPlugin);
|
|
4899
|
+
|
|
4900
|
+
|
|
4901
|
+
/***/ }),
|
|
4902
|
+
|
|
4903
|
+
/***/ "./lib/Extensions/AppPreview/utils.js":
|
|
4904
|
+
/*!********************************************!*\
|
|
4905
|
+
!*** ./lib/Extensions/AppPreview/utils.js ***!
|
|
4906
|
+
\********************************************/
|
|
4907
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
4908
|
+
|
|
4909
|
+
__webpack_require__.r(__webpack_exports__);
|
|
4910
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
4911
|
+
/* harmony export */ startStreamlitPreviewAndNotify: () => (/* binding */ startStreamlitPreviewAndNotify)
|
|
4912
|
+
/* harmony export */ });
|
|
4913
|
+
/* harmony import */ var _restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../restAPI/RestAPI */ "./lib/restAPI/RestAPI.js");
|
|
4914
|
+
/* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/apputils */ "webpack/sharing/consume/default/@jupyterlab/apputils");
|
|
4915
|
+
/* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__);
|
|
4916
|
+
/*
|
|
4917
|
+
* Copyright (c) Saga Inc.
|
|
4918
|
+
* Distributed under the terms of the GNU Affero General Public License v3.0 License.
|
|
4919
|
+
*/
|
|
4920
|
+
|
|
4921
|
+
|
|
4922
|
+
const startStreamlitPreviewAndNotify = async (notebookPath, force_recreate = false) => {
|
|
4923
|
+
const notificationId = _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.Notification.emit('Building App Preview...', 'in-progress', { autoClose: false });
|
|
4924
|
+
const previewData = await (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_1__.startStreamlitPreview)(notebookPath, force_recreate);
|
|
4925
|
+
// Update notification to success
|
|
4926
|
+
_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.Notification.update({
|
|
4927
|
+
id: notificationId,
|
|
4928
|
+
message: 'Streamlit preview started successfully!',
|
|
4929
|
+
type: 'default',
|
|
4930
|
+
autoClose: false
|
|
4931
|
+
});
|
|
4932
|
+
return { previewData, notificationId };
|
|
4933
|
+
};
|
|
4934
|
+
|
|
4935
|
+
|
|
4533
4936
|
/***/ }),
|
|
4534
4937
|
|
|
4535
4938
|
/***/ "./lib/Extensions/ContextManager/ContextManagerPlugin.js":
|
|
@@ -4560,42 +4963,36 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
4560
4963
|
|
|
4561
4964
|
|
|
4562
4965
|
// The provides field in JupyterLab's JupyterFrontEndPlugin expects a token
|
|
4563
|
-
// that can be used to look up the service in the dependency injection system,
|
|
4564
|
-
// so we define a new token for the ContextManager
|
|
4565
|
-
const IContextManager = new _lumino_coreutils__WEBPACK_IMPORTED_MODULE_1__.Token('mito-ai:IContextManager');
|
|
4566
|
-
class ContextManager {
|
|
4567
|
-
constructor(app, notebookTracker) {
|
|
4568
|
-
this.
|
|
4569
|
-
this.
|
|
4570
|
-
|
|
4571
|
-
this.setupKernelListener(app, notebookTracker);
|
|
4572
|
-
}
|
|
4573
|
-
get variables() {
|
|
4574
|
-
return this._variables;
|
|
4575
|
-
}
|
|
4576
|
-
setVariables(newVars) {
|
|
4577
|
-
this._variables = newVars;
|
|
4578
|
-
}
|
|
4579
|
-
get files() {
|
|
4580
|
-
return this._files;
|
|
4581
|
-
}
|
|
4582
|
-
setFiles(newFiles) {
|
|
4583
|
-
this._files = newFiles;
|
|
4584
|
-
}
|
|
4585
|
-
// Setup kernel execution listener
|
|
4586
|
-
setupKernelListener(app, notebookTracker) {
|
|
4587
|
-
notebookTracker.currentChanged.connect(async (tracker, notebookPanel) => {
|
|
4588
|
-
if (!notebookPanel) {
|
|
4966
|
+
// that can be used to look up the service in the dependency injection system,
|
|
4967
|
+
// so we define a new token for the ContextManager
|
|
4968
|
+
const IContextManager = new _lumino_coreutils__WEBPACK_IMPORTED_MODULE_1__.Token('mito-ai:IContextManager');
|
|
4969
|
+
class ContextManager {
|
|
4970
|
+
constructor(app, notebookTracker) {
|
|
4971
|
+
this.notebookContexts = new Map();
|
|
4972
|
+
this._startKernelListener = async (app, notebookPanel) => {
|
|
4973
|
+
if (notebookPanel === null) {
|
|
4589
4974
|
return;
|
|
4590
4975
|
}
|
|
4591
|
-
//
|
|
4976
|
+
// Initialize context for this notebook if it doesn't exist
|
|
4977
|
+
if (!this.notebookContexts.has(notebookPanel.id)) {
|
|
4978
|
+
this.notebookContexts.set(notebookPanel.id, { variables: [], files: [] });
|
|
4979
|
+
}
|
|
4980
|
+
// As soon as the notebook is opened, fetch the files since these are not related to the kernel,
|
|
4981
|
+
// but to the notebook itself. This is useful so we can tell the agent which files are available
|
|
4982
|
+
// or let the user select a file from the dropdown menu before the kernel is started.
|
|
4983
|
+
// We use the notebookPanel.id to identify the notebook because we might need to access
|
|
4984
|
+
// NotebookContext even before the kernel is started. For example, to figure out
|
|
4985
|
+
// which files are available.
|
|
4986
|
+
const updatedFiles = await (0,_FileInspector__WEBPACK_IMPORTED_MODULE_2__.getFiles)(app, notebookPanel);
|
|
4987
|
+
this.updateNotebookFiles(notebookPanel.id, updatedFiles);
|
|
4988
|
+
// Listen for kernel restart or shut down events and clear the variables for this notebook
|
|
4592
4989
|
notebookPanel.context.sessionContext.statusChanged.connect((sender, status) => {
|
|
4593
|
-
if (status === 'restarting') {
|
|
4594
|
-
|
|
4990
|
+
if (status === 'restarting' || status === 'terminating' || status === 'unknown') {
|
|
4991
|
+
// Clear the variables for this specific notebook, but don't clear the files
|
|
4992
|
+
// as they have not changed.
|
|
4993
|
+
this.updateNotebookVariables(notebookPanel.id, []); // Clear variables for this specific notebook
|
|
4595
4994
|
}
|
|
4596
4995
|
});
|
|
4597
|
-
// As soon as the notebook is opened, fetch the files so we don't have to wait for the first message.
|
|
4598
|
-
await (0,_FileInspector__WEBPACK_IMPORTED_MODULE_2__.fetchFilesAndUpdateState)(app, notebookTracker, this.setFiles.bind(this));
|
|
4599
4996
|
// Listen to kernel messages
|
|
4600
4997
|
notebookPanel.context.sessionContext.iopubMessage.connect(async (sender, msg) => {
|
|
4601
4998
|
// Watch for execute_input messages, which indicate is a request to execute code.
|
|
@@ -4603,11 +5000,46 @@ class ContextManager {
|
|
|
4603
5000
|
// from the kernel when a code cell prints a value to the output cell, which is not what we want.
|
|
4604
5001
|
// TODO: Check if there is a race condition where we might end up fetching variables before the
|
|
4605
5002
|
// code is executed. I don't think this is the case because the kernel runs in one thread I believe.
|
|
5003
|
+
// TODO: Eventually we should create a document manager listener so if the user uploads a new file
|
|
5004
|
+
// to jupyter, we can update the available files even if they have not executed a kernel message.
|
|
4606
5005
|
if (msg.header.msg_type === 'execute_input') {
|
|
4607
|
-
|
|
4608
|
-
await (0,_FileInspector__WEBPACK_IMPORTED_MODULE_2__.
|
|
5006
|
+
void (0,_VariableInspector__WEBPACK_IMPORTED_MODULE_3__.fetchVariablesAndUpdateState)(notebookPanel, this.updateNotebookVariables.bind(this, notebookPanel.id));
|
|
5007
|
+
const updatedFiles = await (0,_FileInspector__WEBPACK_IMPORTED_MODULE_2__.getFiles)(app, notebookPanel);
|
|
5008
|
+
this.updateNotebookFiles(notebookPanel.id, updatedFiles);
|
|
4609
5009
|
}
|
|
4610
5010
|
});
|
|
5011
|
+
};
|
|
5012
|
+
this.notebookTracker = notebookTracker;
|
|
5013
|
+
// Setup the kernel listener to update context as kernel messages are received
|
|
5014
|
+
this.setupKernelListener(app, notebookTracker);
|
|
5015
|
+
}
|
|
5016
|
+
getNotebookContext(notebookId) {
|
|
5017
|
+
return this.notebookContexts.get(notebookId);
|
|
5018
|
+
}
|
|
5019
|
+
getActiveNotebookContext() {
|
|
5020
|
+
const activeNotebook = this.notebookTracker.currentWidget;
|
|
5021
|
+
if (!activeNotebook)
|
|
5022
|
+
return undefined;
|
|
5023
|
+
return this.getNotebookContext(activeNotebook.id);
|
|
5024
|
+
}
|
|
5025
|
+
updateNotebookVariables(notebookID, variables) {
|
|
5026
|
+
const context = this.notebookContexts.get(notebookID) || { variables: [], files: [] };
|
|
5027
|
+
context.variables = variables;
|
|
5028
|
+
this.notebookContexts.set(notebookID, context);
|
|
5029
|
+
}
|
|
5030
|
+
updateNotebookFiles(notebookID, files) {
|
|
5031
|
+
const context = this.notebookContexts.get(notebookID) || { variables: [], files: [] };
|
|
5032
|
+
context.files = files;
|
|
5033
|
+
this.notebookContexts.set(notebookID, context);
|
|
5034
|
+
}
|
|
5035
|
+
// Setup kernel execution listener
|
|
5036
|
+
setupKernelListener(app, notebookTracker) {
|
|
5037
|
+
// Start the kernel listener for the currently active notebook
|
|
5038
|
+
const notebookPanel = notebookTracker.currentWidget;
|
|
5039
|
+
void this._startKernelListener(app, notebookPanel);
|
|
5040
|
+
// Update the kernel listener whenever the active notebook changes
|
|
5041
|
+
notebookTracker.currentChanged.connect(async (_, notebookPanel) => {
|
|
5042
|
+
void this._startKernelListener(app, notebookPanel);
|
|
4611
5043
|
});
|
|
4612
5044
|
}
|
|
4613
5045
|
}
|
|
@@ -4634,7 +5066,7 @@ const ContextManagerPlugin = {
|
|
|
4634
5066
|
|
|
4635
5067
|
__webpack_require__.r(__webpack_exports__);
|
|
4636
5068
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
4637
|
-
/* harmony export */
|
|
5069
|
+
/* harmony export */ getFiles: () => (/* binding */ getFiles)
|
|
4638
5070
|
/* harmony export */ });
|
|
4639
5071
|
/* harmony import */ var _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/coreutils */ "webpack/sharing/consume/default/@jupyterlab/coreutils");
|
|
4640
5072
|
/* harmony import */ var _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_0__);
|
|
@@ -4646,15 +5078,9 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
4646
5078
|
/*
|
|
4647
5079
|
Fetches all files in the current directory and updates the state of the files.
|
|
4648
5080
|
*/
|
|
4649
|
-
const
|
|
5081
|
+
const getFiles = async (app, notebookPanel) => {
|
|
4650
5082
|
const fileManager = app.serviceManager.contents;
|
|
4651
|
-
|
|
4652
|
-
const currentNotebook = notebookTracker.currentWidget;
|
|
4653
|
-
if (!currentNotebook) {
|
|
4654
|
-
return;
|
|
4655
|
-
}
|
|
4656
|
-
// Get the directory path using PathExt.dirname from @jupyterlab/coreutils
|
|
4657
|
-
const relativeNotebookPath = currentNotebook.context.path;
|
|
5083
|
+
const relativeNotebookPath = notebookPanel.context.path;
|
|
4658
5084
|
const relativeDirectoryPath = _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_0__.PathExt.dirname(relativeNotebookPath);
|
|
4659
5085
|
try {
|
|
4660
5086
|
const contents = await fileManager.get(relativeDirectoryPath);
|
|
@@ -4673,16 +5099,16 @@ const fetchFilesAndUpdateState = async (app, notebookTracker, setFiles) => {
|
|
|
4673
5099
|
file_name: file.name
|
|
4674
5100
|
}));
|
|
4675
5101
|
// Update the state of the files
|
|
4676
|
-
|
|
5102
|
+
return files;
|
|
4677
5103
|
}
|
|
4678
5104
|
else {
|
|
4679
5105
|
// If the contents are not a directory, set the files to an empty array
|
|
4680
|
-
|
|
5106
|
+
return [];
|
|
4681
5107
|
}
|
|
4682
5108
|
}
|
|
4683
5109
|
catch (error) {
|
|
4684
5110
|
console.error('Error listing directory contents:', error);
|
|
4685
|
-
return;
|
|
5111
|
+
return [];
|
|
4686
5112
|
}
|
|
4687
5113
|
};
|
|
4688
5114
|
|
|
@@ -4819,7 +5245,9 @@ def structured_globals():
|
|
|
4819
5245
|
|
|
4820
5246
|
print(structured_globals())
|
|
4821
5247
|
`;
|
|
4822
|
-
|
|
5248
|
+
/*
|
|
5249
|
+
Function to fetch variables and sync with the frontend
|
|
5250
|
+
*/
|
|
4823
5251
|
function fetchVariablesAndUpdateState(notebookPanel, setVariables) {
|
|
4824
5252
|
var _a;
|
|
4825
5253
|
const kernel = (_a = notebookPanel.context.sessionContext.session) === null || _a === void 0 ? void 0 : _a.kernel;
|
|
@@ -4835,7 +5263,7 @@ function fetchVariablesAndUpdateState(notebookPanel, setVariables) {
|
|
|
4835
5263
|
// Listen for the output from the kernel
|
|
4836
5264
|
future.onIOPub = (msg) => {
|
|
4837
5265
|
// A 'stream' message represents standard output (stdout) or standard error (stderr) produced
|
|
4838
|
-
// during the execution of code in the kernel.
|
|
5266
|
+
// during the execution of code in the kernel.
|
|
4839
5267
|
if (_jupyterlab_services__WEBPACK_IMPORTED_MODULE_0__.KernelMessage.isStreamMsg(msg)) {
|
|
4840
5268
|
if (msg.content.name === 'stdout') {
|
|
4841
5269
|
try {
|
|
@@ -6214,10 +6642,11 @@ const ContextManagerSection = ({ contextManager }) => {
|
|
|
6214
6642
|
// Force a re-render by toggling the state
|
|
6215
6643
|
setRefreshKey(prev => prev + 1);
|
|
6216
6644
|
};
|
|
6645
|
+
const activeNotebookContext = contextManager.getActiveNotebookContext();
|
|
6217
6646
|
const copyContextManagerToClipboard = async () => {
|
|
6218
6647
|
const jsonContent = JSON.stringify({
|
|
6219
|
-
variables:
|
|
6220
|
-
files:
|
|
6648
|
+
variables: activeNotebookContext === null || activeNotebookContext === void 0 ? void 0 : activeNotebookContext.variables,
|
|
6649
|
+
files: activeNotebookContext === null || activeNotebookContext === void 0 ? void 0 : activeNotebookContext.files
|
|
6221
6650
|
}, null, 2);
|
|
6222
6651
|
try {
|
|
6223
6652
|
await navigator.clipboard.writeText(jsonContent);
|
|
@@ -6234,8 +6663,8 @@ const ContextManagerSection = ({ contextManager }) => {
|
|
|
6234
6663
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { className: "button-base", onClick: copyContextManagerToClipboard }, "Copy")),
|
|
6235
6664
|
refreshKey > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "settings-option" },
|
|
6236
6665
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("pre", { className: "json-container" }, JSON.stringify({
|
|
6237
|
-
variables:
|
|
6238
|
-
files:
|
|
6666
|
+
variables: activeNotebookContext === null || activeNotebookContext === void 0 ? void 0 : activeNotebookContext.variables,
|
|
6667
|
+
files: activeNotebookContext === null || activeNotebookContext === void 0 ? void 0 : activeNotebookContext.files
|
|
6239
6668
|
}, null, 2))))));
|
|
6240
6669
|
};
|
|
6241
6670
|
|
|
@@ -6516,142 +6945,6 @@ const SupportPage = () => {
|
|
|
6516
6945
|
};
|
|
6517
6946
|
|
|
6518
6947
|
|
|
6519
|
-
/***/ }),
|
|
6520
|
-
|
|
6521
|
-
/***/ "./lib/Extensions/StreamlitPreview/StreamlitPreviewPlugin.js":
|
|
6522
|
-
/*!*******************************************************************!*\
|
|
6523
|
-
!*** ./lib/Extensions/StreamlitPreview/StreamlitPreviewPlugin.js ***!
|
|
6524
|
-
\*******************************************************************/
|
|
6525
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
6526
|
-
|
|
6527
|
-
__webpack_require__.r(__webpack_exports__);
|
|
6528
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
6529
|
-
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
6530
|
-
/* harmony export */ });
|
|
6531
|
-
/* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/notebook */ "webpack/sharing/consume/default/@jupyterlab/notebook");
|
|
6532
|
-
/* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__);
|
|
6533
|
-
/* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @jupyterlab/apputils */ "webpack/sharing/consume/default/@jupyterlab/apputils");
|
|
6534
|
-
/* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__);
|
|
6535
|
-
/* harmony import */ var _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @jupyterlab/coreutils */ "webpack/sharing/consume/default/@jupyterlab/coreutils");
|
|
6536
|
-
/* harmony import */ var _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_2__);
|
|
6537
|
-
/* harmony import */ var _lumino_widgets__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @lumino/widgets */ "webpack/sharing/consume/default/@lumino/widgets");
|
|
6538
|
-
/* harmony import */ var _lumino_widgets__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_lumino_widgets__WEBPACK_IMPORTED_MODULE_3__);
|
|
6539
|
-
/* harmony import */ var _AiChat_token__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../AiChat/token */ "./lib/Extensions/AiChat/token.js");
|
|
6540
|
-
/* harmony import */ var _restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../restAPI/RestAPI */ "./lib/restAPI/RestAPI.js");
|
|
6541
|
-
/* harmony import */ var _commands__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../commands */ "./lib/commands.js");
|
|
6542
|
-
/*
|
|
6543
|
-
* Copyright (c) Saga Inc.
|
|
6544
|
-
* Distributed under the terms of the GNU Affero General Public License v3.0 License.
|
|
6545
|
-
*/
|
|
6546
|
-
|
|
6547
|
-
|
|
6548
|
-
|
|
6549
|
-
|
|
6550
|
-
|
|
6551
|
-
|
|
6552
|
-
|
|
6553
|
-
|
|
6554
|
-
|
|
6555
|
-
/**
|
|
6556
|
-
* Simple HTML widget for displaying iframe content.
|
|
6557
|
-
*/
|
|
6558
|
-
class IFrameWidget extends _lumino_widgets__WEBPACK_IMPORTED_MODULE_3__.Widget {
|
|
6559
|
-
constructor(url) {
|
|
6560
|
-
super();
|
|
6561
|
-
this.addClass('jp-iframe-widget');
|
|
6562
|
-
const iframe = document.createElement('iframe');
|
|
6563
|
-
iframe.src = url;
|
|
6564
|
-
iframe.style.width = '100%';
|
|
6565
|
-
iframe.style.height = '100%';
|
|
6566
|
-
iframe.style.border = 'none';
|
|
6567
|
-
this.node.appendChild(iframe);
|
|
6568
|
-
}
|
|
6569
|
-
setUrl(url) {
|
|
6570
|
-
const iframe = this.node.querySelector('iframe');
|
|
6571
|
-
if (iframe) {
|
|
6572
|
-
iframe.src = url;
|
|
6573
|
-
}
|
|
6574
|
-
}
|
|
6575
|
-
}
|
|
6576
|
-
/**
|
|
6577
|
-
* The streamlit preview plugin.
|
|
6578
|
-
*/
|
|
6579
|
-
const StreamlitPreviewPlugin = {
|
|
6580
|
-
id: 'mito-ai:streamlit-preview',
|
|
6581
|
-
autoStart: true,
|
|
6582
|
-
requires: [_jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__.INotebookTracker, _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.ICommandPalette, _AiChat_token__WEBPACK_IMPORTED_MODULE_4__.IChatTracker],
|
|
6583
|
-
activate: (app, notebookTracker, palette) => {
|
|
6584
|
-
console.log('mito-ai: StreamlitPreviewPlugin activated');
|
|
6585
|
-
// Add command to command palette
|
|
6586
|
-
app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_5__.previewAsStreamlit, {
|
|
6587
|
-
label: 'Preview as Streamlit',
|
|
6588
|
-
caption: 'Convert current notebook to Streamlit app and preview it',
|
|
6589
|
-
execute: async () => {
|
|
6590
|
-
await previewNotebookAsStreamlit(app, notebookTracker);
|
|
6591
|
-
}
|
|
6592
|
-
});
|
|
6593
|
-
// Add to command palette
|
|
6594
|
-
palette.addItem({
|
|
6595
|
-
command: _commands__WEBPACK_IMPORTED_MODULE_5__.previewAsStreamlit,
|
|
6596
|
-
category: 'Mito AI'
|
|
6597
|
-
});
|
|
6598
|
-
}
|
|
6599
|
-
};
|
|
6600
|
-
/**
|
|
6601
|
-
* Preview the current notebook as a Streamlit app.
|
|
6602
|
-
*/
|
|
6603
|
-
async function previewNotebookAsStreamlit(app, notebookTracker) {
|
|
6604
|
-
const notebookPanel = notebookTracker.currentWidget;
|
|
6605
|
-
if (!notebookPanel) {
|
|
6606
|
-
_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.Notification.error('No notebook is currently active');
|
|
6607
|
-
return;
|
|
6608
|
-
}
|
|
6609
|
-
// First save the notebook to ensure the app is up to date
|
|
6610
|
-
await notebookPanel.context.save();
|
|
6611
|
-
const notebookPath = notebookPanel.context.path;
|
|
6612
|
-
const notebookName = _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_2__.PathExt.basename(notebookPath, '.ipynb');
|
|
6613
|
-
// Show building notification
|
|
6614
|
-
const notificationId = _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.Notification.emit('Building App Preview...', 'in-progress', { autoClose: false });
|
|
6615
|
-
try {
|
|
6616
|
-
const previewData = await (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_6__.startStreamlitPreview)(notebookPath);
|
|
6617
|
-
// Create iframe widget
|
|
6618
|
-
const iframeWidget = new IFrameWidget(previewData.url);
|
|
6619
|
-
// Create main area widget
|
|
6620
|
-
const widget = new _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.MainAreaWidget({ content: iframeWidget });
|
|
6621
|
-
widget.title.label = `App Preview (${notebookName})`;
|
|
6622
|
-
widget.title.closable = true;
|
|
6623
|
-
// Handle widget disposal
|
|
6624
|
-
widget.disposed.connect(() => {
|
|
6625
|
-
console.log('Widget disposed, stopping preview');
|
|
6626
|
-
void (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_6__.stopStreamlitPreview)(previewData.id);
|
|
6627
|
-
});
|
|
6628
|
-
// Add widget to main area with split-right mode
|
|
6629
|
-
app.shell.add(widget, 'main', {
|
|
6630
|
-
mode: 'split-right',
|
|
6631
|
-
ref: notebookPanel.id
|
|
6632
|
-
});
|
|
6633
|
-
// Update notification to success
|
|
6634
|
-
_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.Notification.update({
|
|
6635
|
-
id: notificationId,
|
|
6636
|
-
message: 'Streamlit preview started successfully!',
|
|
6637
|
-
type: 'default',
|
|
6638
|
-
autoClose: false
|
|
6639
|
-
});
|
|
6640
|
-
}
|
|
6641
|
-
catch (error) {
|
|
6642
|
-
console.error('Error starting streamlit preview:', error);
|
|
6643
|
-
// Update notification to error
|
|
6644
|
-
_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.Notification.update({
|
|
6645
|
-
id: notificationId,
|
|
6646
|
-
message: `Failed to start preview: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
6647
|
-
type: 'error',
|
|
6648
|
-
autoClose: false
|
|
6649
|
-
});
|
|
6650
|
-
}
|
|
6651
|
-
}
|
|
6652
|
-
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (StreamlitPreviewPlugin);
|
|
6653
|
-
|
|
6654
|
-
|
|
6655
6948
|
/***/ }),
|
|
6656
6949
|
|
|
6657
6950
|
/***/ "./lib/Extensions/ToolbarButtons/ToolbarButtonsPlugin.js":
|
|
@@ -6666,12 +6959,10 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
6666
6959
|
/* harmony export */ });
|
|
6667
6960
|
/* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/notebook */ "webpack/sharing/consume/default/@jupyterlab/notebook");
|
|
6668
6961
|
/* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__);
|
|
6669
|
-
/* harmony import */ var
|
|
6670
|
-
/* harmony import */ var
|
|
6671
|
-
/* harmony import */ var
|
|
6672
|
-
/* harmony import */ var
|
|
6673
|
-
/* harmony import */ var _AppBuilder_AppBuilderPlugin__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../AppBuilder/AppBuilderPlugin */ "./lib/Extensions/AppBuilder/AppBuilderPlugin.js");
|
|
6674
|
-
/* harmony import */ var _restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../restAPI/RestAPI */ "./lib/restAPI/RestAPI.js");
|
|
6962
|
+
/* harmony import */ var _commands__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../commands */ "./lib/commands.js");
|
|
6963
|
+
/* harmony import */ var _icons__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../icons */ "./lib/icons/index.js");
|
|
6964
|
+
/* harmony import */ var _utils_cellMetadata__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/cellMetadata */ "./lib/utils/cellMetadata.js");
|
|
6965
|
+
/* harmony import */ var _restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../restAPI/RestAPI */ "./lib/restAPI/RestAPI.js");
|
|
6675
6966
|
/*
|
|
6676
6967
|
* Copyright (c) Saga Inc.
|
|
6677
6968
|
* Distributed under the terms of the GNU Affero General Public License v3.0 License.
|
|
@@ -6681,8 +6972,6 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
6681
6972
|
|
|
6682
6973
|
|
|
6683
6974
|
|
|
6684
|
-
|
|
6685
|
-
|
|
6686
6975
|
const ToolbarButtonsPlugin = {
|
|
6687
6976
|
// Important: The Cell Toolbar Buttons are added to the toolbar registry via the schema/toolbar-buttons.json file.
|
|
6688
6977
|
// The id here must be mito-ai:toolbar-buttons otherwise the buttons are not successfully added. My understanding is that
|
|
@@ -6691,28 +6980,27 @@ const ToolbarButtonsPlugin = {
|
|
|
6691
6980
|
description: 'Adds an "explain code cell with AI" button to the cell toolbar',
|
|
6692
6981
|
autoStart: true,
|
|
6693
6982
|
requires: [_jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__.INotebookTracker],
|
|
6694
|
-
|
|
6695
|
-
activate: (app, notebookTracker, appBuilderService) => {
|
|
6983
|
+
activate: (app, notebookTracker) => {
|
|
6696
6984
|
const { commands } = app;
|
|
6697
6985
|
// Important: To add a button to the cell toolbar, the command must start with "toolbar-button:"
|
|
6698
6986
|
// and the command must match the command in the schema/plugin.json file.
|
|
6699
6987
|
commands.addCommand('toolbar-button:explain-code', {
|
|
6700
|
-
icon:
|
|
6988
|
+
icon: _icons__WEBPACK_IMPORTED_MODULE_1__.lightBulbLabIcon,
|
|
6701
6989
|
caption: 'Explain code in AI Chat',
|
|
6702
6990
|
execute: async () => {
|
|
6703
6991
|
/*
|
|
6704
6992
|
In order to click on the cell toolbar button, that cell must be the active cell,
|
|
6705
6993
|
so the ChatHistoryManager will take care of providing the cell context.
|
|
6706
6994
|
*/
|
|
6707
|
-
await app.commands.execute(
|
|
6708
|
-
await app.commands.execute(
|
|
6995
|
+
await app.commands.execute(_commands__WEBPACK_IMPORTED_MODULE_2__.COMMAND_MITO_AI_OPEN_CHAT);
|
|
6996
|
+
await app.commands.execute(_commands__WEBPACK_IMPORTED_MODULE_2__.COMMAND_MITO_AI_SEND_EXPLAIN_CODE_MESSAGE);
|
|
6709
6997
|
},
|
|
6710
|
-
isVisible: () => { var _a; return ((_a = notebookTracker.activeCell) === null || _a === void 0 ? void 0 : _a.model.type) === 'code' && app.commands.hasCommand(
|
|
6998
|
+
isVisible: () => { var _a; return ((_a = notebookTracker.activeCell) === null || _a === void 0 ? void 0 : _a.model.type) === 'code' && app.commands.hasCommand(_commands__WEBPACK_IMPORTED_MODULE_2__.COMMAND_MITO_AI_SEND_EXPLAIN_CODE_MESSAGE); }
|
|
6711
6999
|
});
|
|
6712
7000
|
commands.addCommand('toolbar-button:toggle-include-cell-in-app', {
|
|
6713
7001
|
icon: () => {
|
|
6714
|
-
const includeCellInApp = (0,
|
|
6715
|
-
return includeCellInApp ?
|
|
7002
|
+
const includeCellInApp = (0,_utils_cellMetadata__WEBPACK_IMPORTED_MODULE_3__.getActiveCellIncludeInApp)(notebookTracker);
|
|
7003
|
+
return includeCellInApp ? _icons__WEBPACK_IMPORTED_MODULE_1__.AppBuilderIncludeCellLabIcon : _icons__WEBPACK_IMPORTED_MODULE_1__.AppBuilderExcludeCellLabIcon;
|
|
6716
7004
|
},
|
|
6717
7005
|
caption: 'Toggle cell output visibility in Streamlit app',
|
|
6718
7006
|
execute: async () => {
|
|
@@ -6731,45 +7019,31 @@ const ToolbarButtonsPlugin = {
|
|
|
6731
7019
|
- Use AI to identify and remove hanging variables
|
|
6732
7020
|
- Parse code to find and remove lone variable references and literals
|
|
6733
7021
|
*/
|
|
6734
|
-
(0,
|
|
7022
|
+
(0,_utils_cellMetadata__WEBPACK_IMPORTED_MODULE_3__.toggleActiveCellIncludeInAppMetadata)(notebookTracker);
|
|
6735
7023
|
// Force command refresh to update the icon
|
|
6736
7024
|
commands.notifyCommandChanged('toolbar-button:toggle-include-cell-in-app');
|
|
6737
7025
|
},
|
|
6738
7026
|
isVisible: () => {
|
|
6739
|
-
return app.commands.hasCommand(
|
|
6740
|
-
}
|
|
6741
|
-
});
|
|
6742
|
-
commands.addCommand('toolbar-button:convert-to-streamlit', {
|
|
6743
|
-
label: 'Deploy App',
|
|
6744
|
-
caption: 'Convert to Streamlit',
|
|
6745
|
-
className: 'text-button-mito-ai button-base button-purple button-small',
|
|
6746
|
-
execute: async () => {
|
|
6747
|
-
void (0,_AppBuilder_NotebookToStreamlit__WEBPACK_IMPORTED_MODULE_5__.convertNotebookToStreamlit)(notebookTracker, appBuilderService);
|
|
6748
|
-
},
|
|
6749
|
-
isVisible: () => {
|
|
6750
|
-
// Default to hidden, will be updated after async check since we are not allowed to
|
|
6751
|
-
// use async commands in isVisible.
|
|
6752
|
-
return app.commands.hasCommand(_commands__WEBPACK_IMPORTED_MODULE_3__.COMMAND_MITO_AI_BETA_MODE_ENABLED);
|
|
7027
|
+
return app.commands.hasCommand(_commands__WEBPACK_IMPORTED_MODULE_2__.COMMAND_MITO_AI_BETA_MODE_ENABLED);
|
|
6753
7028
|
}
|
|
6754
7029
|
});
|
|
6755
7030
|
commands.addCommand('toolbar-button:preview-as-streamlit', {
|
|
6756
|
-
label: '
|
|
6757
|
-
caption: 'Preview as
|
|
7031
|
+
label: 'App Mode',
|
|
7032
|
+
caption: 'Preview notebook as app and turn on App Mode',
|
|
6758
7033
|
className: 'text-button-mito-ai button-base button-purple button-small',
|
|
6759
7034
|
execute: async () => {
|
|
6760
7035
|
void app.commands.execute('mito-ai:preview-as-streamlit');
|
|
6761
7036
|
},
|
|
6762
7037
|
isVisible: () => {
|
|
6763
|
-
return app.commands.hasCommand(
|
|
7038
|
+
return app.commands.hasCommand(_commands__WEBPACK_IMPORTED_MODULE_2__.COMMAND_MITO_AI_BETA_MODE_ENABLED);
|
|
6764
7039
|
}
|
|
6765
7040
|
});
|
|
6766
7041
|
// Check if the beta mode is enabled. After checking, tell Jupyter to
|
|
6767
7042
|
// re-evaluate convert-to-streamlit visibility now that we have had the
|
|
6768
7043
|
// opportunity to set the mito-ai:beta-mode-enabled command if beta mode is enabled.
|
|
6769
|
-
(0,
|
|
7044
|
+
(0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_4__.getSetting)('beta_mode').then(value => {
|
|
6770
7045
|
if (value === 'true') {
|
|
6771
|
-
commands.addCommand(
|
|
6772
|
-
commands.notifyCommandChanged('toolbar-button:convert-to-streamlit');
|
|
7046
|
+
commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_2__.COMMAND_MITO_AI_BETA_MODE_ENABLED, { execute: () => { } });
|
|
6773
7047
|
commands.notifyCommandChanged('toolbar-button:toggle-include-cell-in-app');
|
|
6774
7048
|
commands.notifyCommandChanged('toolbar-button:preview-as-streamlit');
|
|
6775
7049
|
}
|
|
@@ -7264,13 +7538,13 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
7264
7538
|
/* harmony export */ COMMAND_MITO_AI_CELL_TOOLBAR_ACCEPT_CODE: () => (/* binding */ COMMAND_MITO_AI_CELL_TOOLBAR_ACCEPT_CODE),
|
|
7265
7539
|
/* harmony export */ COMMAND_MITO_AI_CELL_TOOLBAR_REJECT_CODE: () => (/* binding */ COMMAND_MITO_AI_CELL_TOOLBAR_REJECT_CODE),
|
|
7266
7540
|
/* harmony export */ COMMAND_MITO_AI_OPEN_CHAT: () => (/* binding */ COMMAND_MITO_AI_OPEN_CHAT),
|
|
7541
|
+
/* harmony export */ COMMAND_MITO_AI_PREVIEW_AS_STREAMLIT: () => (/* binding */ COMMAND_MITO_AI_PREVIEW_AS_STREAMLIT),
|
|
7267
7542
|
/* harmony export */ COMMAND_MITO_AI_PREVIEW_LATEST_CODE: () => (/* binding */ COMMAND_MITO_AI_PREVIEW_LATEST_CODE),
|
|
7268
7543
|
/* harmony export */ COMMAND_MITO_AI_REJECT_LATEST_CODE: () => (/* binding */ COMMAND_MITO_AI_REJECT_LATEST_CODE),
|
|
7269
7544
|
/* harmony export */ COMMAND_MITO_AI_SEND_AGENT_MESSAGE: () => (/* binding */ COMMAND_MITO_AI_SEND_AGENT_MESSAGE),
|
|
7270
7545
|
/* harmony export */ COMMAND_MITO_AI_SEND_DEBUG_ERROR_MESSAGE: () => (/* binding */ COMMAND_MITO_AI_SEND_DEBUG_ERROR_MESSAGE),
|
|
7271
7546
|
/* harmony export */ COMMAND_MITO_AI_SEND_EXPLAIN_CODE_MESSAGE: () => (/* binding */ COMMAND_MITO_AI_SEND_EXPLAIN_CODE_MESSAGE),
|
|
7272
|
-
/* harmony export */ COMMAND_MITO_AI_SEND_MESSAGE: () => (/* binding */ COMMAND_MITO_AI_SEND_MESSAGE)
|
|
7273
|
-
/* harmony export */ previewAsStreamlit: () => (/* binding */ previewAsStreamlit)
|
|
7547
|
+
/* harmony export */ COMMAND_MITO_AI_SEND_MESSAGE: () => (/* binding */ COMMAND_MITO_AI_SEND_MESSAGE)
|
|
7274
7548
|
/* harmony export */ });
|
|
7275
7549
|
/*
|
|
7276
7550
|
* Copyright (c) Saga Inc.
|
|
@@ -7290,7 +7564,7 @@ const COMMAND_MITO_AI_CELL_TOOLBAR_REJECT_CODE = `toolbar-button:reject-code`;
|
|
|
7290
7564
|
// Beta mode commands
|
|
7291
7565
|
const COMMAND_MITO_AI_BETA_MODE_ENABLED = `${MITO_AI}:beta-mode-enabled`;
|
|
7292
7566
|
// Streamlit commands
|
|
7293
|
-
const
|
|
7567
|
+
const COMMAND_MITO_AI_PREVIEW_AS_STREAMLIT = 'mito-ai:preview-as-streamlit';
|
|
7294
7568
|
|
|
7295
7569
|
|
|
7296
7570
|
/***/ }),
|
|
@@ -7972,9 +8246,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
7972
8246
|
|
|
7973
8247
|
|
|
7974
8248
|
const MODEL_MAPPINGS = [
|
|
7975
|
-
{ displayName: _utils_models__WEBPACK_IMPORTED_MODULE_2__.GPT_DISPLAY_NAME, fullName: _utils_models__WEBPACK_IMPORTED_MODULE_2__.GPT_MODEL_NAME },
|
|
7976
8249
|
{ displayName: 'GPT 4.1', fullName: 'gpt-4.1' },
|
|
7977
|
-
{ displayName: _utils_models__WEBPACK_IMPORTED_MODULE_2__.CLAUDE_OPUS_DISPLAY_NAME, fullName: _utils_models__WEBPACK_IMPORTED_MODULE_2__.CLAUDE_OPUS_MODEL_NAME },
|
|
7978
8250
|
{ displayName: _utils_models__WEBPACK_IMPORTED_MODULE_2__.CLAUDE_SONNET_DISPLAY_NAME, fullName: _utils_models__WEBPACK_IMPORTED_MODULE_2__.CLAUDE_SONNET_MODEL_NAME },
|
|
7979
8251
|
{ displayName: 'Gemini 2.5 Pro', fullName: 'gemini-2.5-pro-preview-03-25' }
|
|
7980
8252
|
];
|
|
@@ -8886,6 +9158,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
8886
9158
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
8887
9159
|
/* harmony export */ AppBuilderExcludeCellLabIcon: () => (/* binding */ AppBuilderExcludeCellLabIcon),
|
|
8888
9160
|
/* harmony export */ AppBuilderIncludeCellLabIcon: () => (/* binding */ AppBuilderIncludeCellLabIcon),
|
|
9161
|
+
/* harmony export */ DeployLabIcon: () => (/* binding */ DeployLabIcon),
|
|
8889
9162
|
/* harmony export */ NucleusLabIcon: () => (/* binding */ NucleusLabIcon),
|
|
8890
9163
|
/* harmony export */ OpenIndicatorLabIcon: () => (/* binding */ OpenIndicatorLabIcon),
|
|
8891
9164
|
/* harmony export */ lightBulbLabIcon: () => (/* binding */ lightBulbLabIcon)
|
|
@@ -8897,6 +9170,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
8897
9170
|
/* harmony import */ var _src_icons_OpenIndicatorIcon_svg__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../src/icons/OpenIndicatorIcon.svg */ "./src/icons/OpenIndicatorIcon.svg");
|
|
8898
9171
|
/* harmony import */ var _src_icons_AppBuilderExcludeCellIcon_svg__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../src/icons/AppBuilderExcludeCellIcon.svg */ "./src/icons/AppBuilderExcludeCellIcon.svg");
|
|
8899
9172
|
/* harmony import */ var _src_icons_AppBuilderIncludeCellIcon_svg__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../src/icons/AppBuilderIncludeCellIcon.svg */ "./src/icons/AppBuilderIncludeCellIcon.svg");
|
|
9173
|
+
/* harmony import */ var _src_icons_App_DeployIcon_svg__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../src/icons/App/DeployIcon.svg */ "./src/icons/App/DeployIcon.svg");
|
|
8900
9174
|
/*
|
|
8901
9175
|
* Copyright (c) Saga Inc.
|
|
8902
9176
|
* Distributed under the terms of the GNU Affero General Public License v3.0 License.
|
|
@@ -8907,6 +9181,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
8907
9181
|
|
|
8908
9182
|
|
|
8909
9183
|
|
|
9184
|
+
|
|
8910
9185
|
const lightBulbLabIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({
|
|
8911
9186
|
name: 'lightbulb-icon',
|
|
8912
9187
|
svgstr: _src_icons_LightbulbIcon_svg__WEBPACK_IMPORTED_MODULE_1__
|
|
@@ -8927,6 +9202,10 @@ const AppBuilderIncludeCellLabIcon = new _jupyterlab_ui_components__WEBPACK_IMPO
|
|
|
8927
9202
|
name: 'app-builder-include-cell-icon',
|
|
8928
9203
|
svgstr: _src_icons_AppBuilderIncludeCellIcon_svg__WEBPACK_IMPORTED_MODULE_5__
|
|
8929
9204
|
});
|
|
9205
|
+
const DeployLabIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({
|
|
9206
|
+
name: 'deploy-icon',
|
|
9207
|
+
svgstr: _src_icons_App_DeployIcon_svg__WEBPACK_IMPORTED_MODULE_6__
|
|
9208
|
+
});
|
|
8930
9209
|
|
|
8931
9210
|
|
|
8932
9211
|
/***/ }),
|
|
@@ -8945,8 +9224,8 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
8945
9224
|
/* harmony import */ var _Extensions_ContextManager_ContextManagerPlugin__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Extensions/ContextManager/ContextManagerPlugin */ "./lib/Extensions/ContextManager/ContextManagerPlugin.js");
|
|
8946
9225
|
/* harmony import */ var _Extensions_ErrorMimeRenderer_ErrorMimeRendererPlugin__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Extensions/ErrorMimeRenderer/ErrorMimeRendererPlugin */ "./lib/Extensions/ErrorMimeRenderer/ErrorMimeRendererPlugin.js");
|
|
8947
9226
|
/* harmony import */ var _Extensions_ToolbarButtons_ToolbarButtonsPlugin__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Extensions/ToolbarButtons/ToolbarButtonsPlugin */ "./lib/Extensions/ToolbarButtons/ToolbarButtonsPlugin.js");
|
|
8948
|
-
/* harmony import */ var
|
|
8949
|
-
/* harmony import */ var
|
|
9227
|
+
/* harmony import */ var _Extensions_AppDeploy_AppDeployPlugin__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Extensions/AppDeploy/AppDeployPlugin */ "./lib/Extensions/AppDeploy/AppDeployPlugin.js");
|
|
9228
|
+
/* harmony import */ var _Extensions_AppPreview_StreamlitPreviewPlugin__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Extensions/AppPreview/StreamlitPreviewPlugin */ "./lib/Extensions/AppPreview/StreamlitPreviewPlugin.js");
|
|
8950
9229
|
/* harmony import */ var _Extensions_emptyCell_EmptyCellPlugin__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Extensions/emptyCell/EmptyCellPlugin */ "./lib/Extensions/emptyCell/EmptyCellPlugin.js");
|
|
8951
9230
|
/* harmony import */ var _Extensions_status__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Extensions/status */ "./lib/Extensions/status/index.js");
|
|
8952
9231
|
/* harmony import */ var _Extensions_SettingsManager_SettingsManagerPlugin__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Extensions/SettingsManager/SettingsManagerPlugin */ "./lib/Extensions/SettingsManager/SettingsManagerPlugin.js");
|
|
@@ -8975,8 +9254,8 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
8975
9254
|
_Extensions_AiChat_AiChatPlugin__WEBPACK_IMPORTED_MODULE_0__["default"],
|
|
8976
9255
|
_Extensions_ErrorMimeRenderer_ErrorMimeRendererPlugin__WEBPACK_IMPORTED_MODULE_1__["default"],
|
|
8977
9256
|
_Extensions_ContextManager_ContextManagerPlugin__WEBPACK_IMPORTED_MODULE_2__["default"],
|
|
8978
|
-
|
|
8979
|
-
|
|
9257
|
+
_Extensions_AppDeploy_AppDeployPlugin__WEBPACK_IMPORTED_MODULE_3__["default"],
|
|
9258
|
+
_Extensions_AppPreview_StreamlitPreviewPlugin__WEBPACK_IMPORTED_MODULE_4__["default"],
|
|
8980
9259
|
_Extensions_ToolbarButtons_ToolbarButtonsPlugin__WEBPACK_IMPORTED_MODULE_5__["default"],
|
|
8981
9260
|
_Extensions_emptyCell_EmptyCellPlugin__WEBPACK_IMPORTED_MODULE_6__.emptyCellPlaceholder,
|
|
8982
9261
|
_Extensions_status__WEBPACK_IMPORTED_MODULE_7__.statusItem,
|
|
@@ -9100,10 +9379,10 @@ const getDatabaseConnections = async () => {
|
|
|
9100
9379
|
STREAMLIT PREVIEW ENDPOINTS
|
|
9101
9380
|
|
|
9102
9381
|
************************************/
|
|
9103
|
-
const startStreamlitPreview = async (notebookPath) => {
|
|
9382
|
+
const startStreamlitPreview = async (notebookPath, force_recreate = false) => {
|
|
9104
9383
|
const response = await (0,_utils__WEBPACK_IMPORTED_MODULE_0__.requestAPI)('streamlit-preview', {
|
|
9105
9384
|
method: 'POST',
|
|
9106
|
-
body: JSON.stringify({ notebook_path: notebookPath }),
|
|
9385
|
+
body: JSON.stringify({ notebook_path: notebookPath, force_recreate: force_recreate }),
|
|
9107
9386
|
});
|
|
9108
9387
|
if (response.error) {
|
|
9109
9388
|
throw new Error(response.error.message);
|
|
@@ -9227,13 +9506,14 @@ const getXsrfToken = () => {
|
|
|
9227
9506
|
__webpack_require__.r(__webpack_exports__);
|
|
9228
9507
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
9229
9508
|
/* harmony export */ acceptAndRunCellUpdate: () => (/* binding */ acceptAndRunCellUpdate),
|
|
9230
|
-
/* harmony export */ acceptAndRunCode: () => (/* binding */ acceptAndRunCode),
|
|
9231
9509
|
/* harmony export */ retryIfExecutionError: () => (/* binding */ retryIfExecutionError),
|
|
9232
9510
|
/* harmony export */ runAllCells: () => (/* binding */ runAllCells)
|
|
9233
9511
|
/* harmony export */ });
|
|
9234
|
-
/* harmony import */ var
|
|
9235
|
-
/* harmony import */ var
|
|
9236
|
-
/* harmony import */ var
|
|
9512
|
+
/* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/notebook */ "webpack/sharing/consume/default/@jupyterlab/notebook");
|
|
9513
|
+
/* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__);
|
|
9514
|
+
/* harmony import */ var _Extensions_ErrorMimeRenderer_errorUtils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Extensions/ErrorMimeRenderer/errorUtils */ "./lib/Extensions/ErrorMimeRenderer/errorUtils.js");
|
|
9515
|
+
/* harmony import */ var _sleep__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sleep */ "./lib/utils/sleep.js");
|
|
9516
|
+
/* harmony import */ var _notebook__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./notebook */ "./lib/utils/notebook.js");
|
|
9237
9517
|
/*
|
|
9238
9518
|
* Copyright (c) Saga Inc.
|
|
9239
9519
|
* Distributed under the terms of the GNU Affero General Public License v3.0 License.
|
|
@@ -9241,70 +9521,71 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
9241
9521
|
|
|
9242
9522
|
|
|
9243
9523
|
|
|
9244
|
-
|
|
9524
|
+
|
|
9525
|
+
|
|
9526
|
+
const acceptAndRunCellUpdate = async (cellUpdate, notebookPanel) => {
|
|
9245
9527
|
// If the cellUpdate is creating a new code cell, insert it
|
|
9246
|
-
// before previewing and accepting the code.
|
|
9528
|
+
// before previewing and accepting the code. It is safe to do this
|
|
9529
|
+
// in the background agent because it does not effect the active cell
|
|
9530
|
+
// in other notebooks.
|
|
9247
9531
|
if (cellUpdate.type === 'new') {
|
|
9248
9532
|
// makes the cell the active cell
|
|
9249
|
-
(0,
|
|
9533
|
+
(0,_notebook__WEBPACK_IMPORTED_MODULE_1__.createCodeCellAtIndexAndActivate)(notebookPanel, cellUpdate.index);
|
|
9250
9534
|
}
|
|
9251
9535
|
else {
|
|
9252
|
-
(0,
|
|
9536
|
+
(0,_notebook__WEBPACK_IMPORTED_MODULE_1__.setActiveCellByIDInNotebookPanel)(notebookPanel, cellUpdate.id);
|
|
9253
9537
|
}
|
|
9254
|
-
|
|
9255
|
-
|
|
9256
|
-
|
|
9257
|
-
|
|
9258
|
-
|
|
9259
|
-
|
|
9260
|
-
|
|
9261
|
-
this function
|
|
9262
|
-
*/
|
|
9263
|
-
previewAICodeToActiveCell();
|
|
9264
|
-
acceptAICode();
|
|
9538
|
+
const notebook = notebookPanel.content;
|
|
9539
|
+
const context = notebookPanel.context;
|
|
9540
|
+
if (notebook === undefined) {
|
|
9541
|
+
return;
|
|
9542
|
+
}
|
|
9543
|
+
const cellID = (0,_notebook__WEBPACK_IMPORTED_MODULE_1__.getActiveCellIDInNotebookPanel)(notebookPanel);
|
|
9544
|
+
(0,_notebook__WEBPACK_IMPORTED_MODULE_1__.writeCodeToCellByIDInNotebookPanel)(notebookPanel, cellUpdate.code, cellID);
|
|
9265
9545
|
// We always create code cells, and then convert to markdown if necessary.
|
|
9266
|
-
if (
|
|
9267
|
-
|
|
9546
|
+
if (cellUpdate.cell_type === 'markdown') {
|
|
9547
|
+
_jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__.NotebookActions.changeCellType(notebook, 'markdown');
|
|
9268
9548
|
}
|
|
9269
|
-
else if (
|
|
9270
|
-
|
|
9549
|
+
else if (cellUpdate.cell_type === 'code') {
|
|
9550
|
+
_jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__.NotebookActions.changeCellType(notebook, 'code');
|
|
9271
9551
|
}
|
|
9272
9552
|
// This awaits until after the execution is finished.
|
|
9273
9553
|
// Note that it is important that we just run the cell and don't run and advance the cell.
|
|
9274
9554
|
// We rely on the active cell remaining the same after running the cell in order to get the output
|
|
9275
9555
|
// of the cell to send to the agent. This is changeable in the future, but for now its an invariant we rely on.
|
|
9276
|
-
await
|
|
9556
|
+
await _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__.NotebookActions.run(notebook, context === null || context === void 0 ? void 0 : context.sessionContext);
|
|
9277
9557
|
// Scroll to the bottom of the active cell to show the output
|
|
9278
|
-
|
|
9558
|
+
// as long as we are not operating in background agent mode.
|
|
9559
|
+
const activeCellID = (0,_notebook__WEBPACK_IMPORTED_MODULE_1__.getActiveCellIDInNotebookPanel)(notebookPanel);
|
|
9279
9560
|
if (activeCellID) {
|
|
9280
|
-
(0,
|
|
9561
|
+
(0,_notebook__WEBPACK_IMPORTED_MODULE_1__.scrollToCell)(notebookPanel, activeCellID, undefined, 'end');
|
|
9281
9562
|
}
|
|
9282
9563
|
// By sleeping here, we make sure that this function returns after the variable manager
|
|
9283
9564
|
// has updated the state of the variables. This ensures that on the next Ai message
|
|
9284
9565
|
// gets the most up to date data.
|
|
9285
|
-
await (0,
|
|
9566
|
+
await (0,_sleep__WEBPACK_IMPORTED_MODULE_2__.sleep)(1000);
|
|
9286
9567
|
};
|
|
9287
|
-
const retryIfExecutionError = async (
|
|
9288
|
-
var _a
|
|
9289
|
-
const cell =
|
|
9568
|
+
const retryIfExecutionError = async (notebookPanel, app, sendAgentSmartDebugMessage, shouldContinueAgentExecution, finalizeAgentStop, chatHistoryManagerRef) => {
|
|
9569
|
+
var _a;
|
|
9570
|
+
const cell = notebookPanel.content.activeCell;
|
|
9290
9571
|
// Note: If you update the max retries, update the message we display on each failure
|
|
9291
9572
|
// attempt to ensure we don't say "third attempt" over and over again.
|
|
9292
9573
|
const MAX_RETRIES = 3;
|
|
9293
9574
|
let attempts = 0;
|
|
9294
9575
|
let runAllCellsAttempts = 0;
|
|
9295
9576
|
const MAX_RUN_ALL_CELLS_ATTEMPTS = 2; // Only allow two run_all_cells attempt per error cycle
|
|
9296
|
-
while ((0,
|
|
9577
|
+
while ((0,_notebook__WEBPACK_IMPORTED_MODULE_1__.didCellExecutionError)(cell) && attempts < MAX_RETRIES) {
|
|
9297
9578
|
if (!shouldContinueAgentExecution.current) {
|
|
9298
9579
|
finalizeAgentStop();
|
|
9299
9580
|
return 'interupted';
|
|
9300
9581
|
}
|
|
9301
9582
|
// If the code cell has an error, we need to send the error to the AI
|
|
9302
9583
|
// and get it to fix the error.
|
|
9303
|
-
const errorOutput = (
|
|
9584
|
+
const errorOutput = (_a = cell === null || cell === void 0 ? void 0 : cell.model.outputs) === null || _a === void 0 ? void 0 : _a.toJSON().find(output => output.output_type === "error");
|
|
9304
9585
|
if (!errorOutput) {
|
|
9305
9586
|
return 'success'; // If no error output, we're done
|
|
9306
9587
|
}
|
|
9307
|
-
const errorMessage = (0,
|
|
9588
|
+
const errorMessage = (0,_Extensions_ErrorMimeRenderer_errorUtils__WEBPACK_IMPORTED_MODULE_3__.getFullErrorMessageFromTraceback)(errorOutput.traceback);
|
|
9308
9589
|
await sendAgentSmartDebugMessage(errorMessage);
|
|
9309
9590
|
const aiDisplayOptimizedChatItem = chatHistoryManagerRef.current.getLastAIDisplayOptimizedChatItem();
|
|
9310
9591
|
// Handle different response types from the agent when fixing errors
|
|
@@ -9315,7 +9596,7 @@ const retryIfExecutionError = async (notebookTracker, app, getDuplicateChatHisto
|
|
|
9315
9596
|
if (agentResponse.type === 'cell_update') {
|
|
9316
9597
|
const cellUpdate = agentResponse.cell_update;
|
|
9317
9598
|
if (cellUpdate !== undefined && cellUpdate !== null) {
|
|
9318
|
-
await acceptAndRunCellUpdate(cellUpdate,
|
|
9599
|
+
await acceptAndRunCellUpdate(cellUpdate, notebookPanel);
|
|
9319
9600
|
}
|
|
9320
9601
|
}
|
|
9321
9602
|
else if (agentResponse.type === 'run_all_cells') {
|
|
@@ -9326,7 +9607,7 @@ const retryIfExecutionError = async (notebookTracker, app, getDuplicateChatHisto
|
|
|
9326
9607
|
}
|
|
9327
9608
|
runAllCellsAttempts++;
|
|
9328
9609
|
// Execute runAllCells to fix NameError issues
|
|
9329
|
-
const result = await runAllCells(app,
|
|
9610
|
+
const result = await runAllCells(app, notebookPanel);
|
|
9330
9611
|
if (!result.success) {
|
|
9331
9612
|
// If run_all_cells resulted in an error, we should continue with error handling
|
|
9332
9613
|
// The error will be caught in the main loop
|
|
@@ -9339,32 +9620,29 @@ const retryIfExecutionError = async (notebookTracker, app, getDuplicateChatHisto
|
|
|
9339
9620
|
}
|
|
9340
9621
|
attempts++;
|
|
9341
9622
|
// If this was the last attempt and it still failed
|
|
9342
|
-
if (attempts === MAX_RETRIES && (0,
|
|
9623
|
+
if (attempts === MAX_RETRIES && (0,_notebook__WEBPACK_IMPORTED_MODULE_1__.didCellExecutionError)(cell)) {
|
|
9343
9624
|
return 'failure';
|
|
9344
9625
|
}
|
|
9345
9626
|
}
|
|
9346
9627
|
return 'success';
|
|
9347
9628
|
};
|
|
9348
|
-
const runAllCells = async (app,
|
|
9629
|
+
const runAllCells = async (app, notebookPanel) => {
|
|
9349
9630
|
var _a, _b;
|
|
9350
|
-
|
|
9631
|
+
const notebook = notebookPanel.content;
|
|
9632
|
+
const sessionContext = (_a = notebookPanel.context) === null || _a === void 0 ? void 0 : _a.sessionContext;
|
|
9633
|
+
await _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__.NotebookActions.runAll(notebook, sessionContext);
|
|
9351
9634
|
// Give the execution some time to complete and update variables
|
|
9352
9635
|
// This ensures that the variable manager has time to update the state
|
|
9353
|
-
await (0,
|
|
9354
|
-
// Check all cells for errors after execution
|
|
9355
|
-
const notebook = (_a = notebookTracker.currentWidget) === null || _a === void 0 ? void 0 : _a.content;
|
|
9356
|
-
if (!notebook) {
|
|
9357
|
-
return { success: false, errorMessage: "No active notebook found" };
|
|
9358
|
-
}
|
|
9636
|
+
await (0,_sleep__WEBPACK_IMPORTED_MODULE_2__.sleep)(2000);
|
|
9359
9637
|
// Iterate through all cells to find any with errors
|
|
9360
9638
|
for (let i = 0; i < notebook.widgets.length; i++) {
|
|
9361
9639
|
const cell = notebook.widgets[i];
|
|
9362
9640
|
if (cell && cell.model.type === 'code') {
|
|
9363
9641
|
const codeCell = cell;
|
|
9364
|
-
if ((0,
|
|
9642
|
+
if ((0,_notebook__WEBPACK_IMPORTED_MODULE_1__.didCellExecutionError)(codeCell)) {
|
|
9365
9643
|
const errorOutput = (_b = codeCell.model.outputs) === null || _b === void 0 ? void 0 : _b.toJSON().find(output => output.output_type === "error");
|
|
9366
9644
|
if (errorOutput) {
|
|
9367
|
-
const errorMessage = (0,
|
|
9645
|
+
const errorMessage = (0,_Extensions_ErrorMimeRenderer_errorUtils__WEBPACK_IMPORTED_MODULE_3__.getFullErrorMessageFromTraceback)(errorOutput.traceback);
|
|
9368
9646
|
return {
|
|
9369
9647
|
success: false,
|
|
9370
9648
|
errorMessage: errorMessage,
|
|
@@ -9503,7 +9781,147 @@ const checkForBlacklistedWords = (code) => {
|
|
|
9503
9781
|
};
|
|
9504
9782
|
}
|
|
9505
9783
|
}
|
|
9506
|
-
return { safe: true };
|
|
9784
|
+
return { safe: true };
|
|
9785
|
+
};
|
|
9786
|
+
|
|
9787
|
+
|
|
9788
|
+
/***/ }),
|
|
9789
|
+
|
|
9790
|
+
/***/ "./lib/utils/cellMetadata.js":
|
|
9791
|
+
/*!***********************************!*\
|
|
9792
|
+
!*** ./lib/utils/cellMetadata.js ***!
|
|
9793
|
+
\***********************************/
|
|
9794
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
9795
|
+
|
|
9796
|
+
__webpack_require__.r(__webpack_exports__);
|
|
9797
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
9798
|
+
/* harmony export */ getActiveCellIncludeInApp: () => (/* binding */ getActiveCellIncludeInApp),
|
|
9799
|
+
/* harmony export */ getIncludeCellInApp: () => (/* binding */ getIncludeCellInApp),
|
|
9800
|
+
/* harmony export */ toggleActiveCellIncludeInAppMetadata: () => (/* binding */ toggleActiveCellIncludeInAppMetadata),
|
|
9801
|
+
/* harmony export */ toggleIncludeCellInAppMetadata: () => (/* binding */ toggleIncludeCellInAppMetadata)
|
|
9802
|
+
/* harmony export */ });
|
|
9803
|
+
/* harmony import */ var _notebook__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./notebook */ "./lib/utils/notebook.js");
|
|
9804
|
+
/*
|
|
9805
|
+
* Copyright (c) Saga Inc.
|
|
9806
|
+
* Distributed under the terms of the GNU Affero General Public License v3.0 License.
|
|
9807
|
+
*/
|
|
9808
|
+
|
|
9809
|
+
const INCLUDE_CELL_IN_APP = 'include-cell-in-app';
|
|
9810
|
+
const toggleActiveCellIncludeInAppMetadata = (notebookTracker) => {
|
|
9811
|
+
const activeCellID = (0,_notebook__WEBPACK_IMPORTED_MODULE_0__.getActiveCellID)(notebookTracker);
|
|
9812
|
+
toggleIncludeCellInAppMetadata(notebookTracker, activeCellID);
|
|
9813
|
+
};
|
|
9814
|
+
const toggleIncludeCellInAppMetadata = (notebookTracker, cellID) => {
|
|
9815
|
+
if (cellID === undefined) {
|
|
9816
|
+
return;
|
|
9817
|
+
}
|
|
9818
|
+
const cell = (0,_notebook__WEBPACK_IMPORTED_MODULE_0__.getCellByID)(notebookTracker, cellID);
|
|
9819
|
+
if (!cell) {
|
|
9820
|
+
return undefined;
|
|
9821
|
+
}
|
|
9822
|
+
if (Object.prototype.hasOwnProperty.call(cell.model.metadata, INCLUDE_CELL_IN_APP)) {
|
|
9823
|
+
const originalVisibility = cell.model.getMetadata(INCLUDE_CELL_IN_APP);
|
|
9824
|
+
cell.model.setMetadata(INCLUDE_CELL_IN_APP, !originalVisibility);
|
|
9825
|
+
}
|
|
9826
|
+
else {
|
|
9827
|
+
// If the metadata doesn't exist yet, that means the user has not yet toggled the visibility.
|
|
9828
|
+
// The default value is to show the output, so the first toggle should set the visibiltiy to false.
|
|
9829
|
+
cell.model.setMetadata(INCLUDE_CELL_IN_APP, false);
|
|
9830
|
+
}
|
|
9831
|
+
};
|
|
9832
|
+
const getActiveCellIncludeInApp = (notebookTracker) => {
|
|
9833
|
+
const activeCellID = (0,_notebook__WEBPACK_IMPORTED_MODULE_0__.getActiveCellID)(notebookTracker);
|
|
9834
|
+
return getIncludeCellInApp(notebookTracker, activeCellID);
|
|
9835
|
+
};
|
|
9836
|
+
const getIncludeCellInApp = (notebookTracker, cellID) => {
|
|
9837
|
+
/*
|
|
9838
|
+
Checks the cell metadata tag to see if the user has marked that this cell should not be included in the app.
|
|
9839
|
+
*/
|
|
9840
|
+
const cell = (0,_notebook__WEBPACK_IMPORTED_MODULE_0__.getCellByID)(notebookTracker, cellID);
|
|
9841
|
+
if (!cell) {
|
|
9842
|
+
return false;
|
|
9843
|
+
}
|
|
9844
|
+
if (!Object.prototype.hasOwnProperty.call(cell.model.metadata, INCLUDE_CELL_IN_APP)) {
|
|
9845
|
+
cell.model.setMetadata(INCLUDE_CELL_IN_APP, true);
|
|
9846
|
+
}
|
|
9847
|
+
return cell.model.getMetadata(INCLUDE_CELL_IN_APP);
|
|
9848
|
+
};
|
|
9849
|
+
|
|
9850
|
+
|
|
9851
|
+
/***/ }),
|
|
9852
|
+
|
|
9853
|
+
/***/ "./lib/utils/cellOutput.js":
|
|
9854
|
+
/*!*********************************!*\
|
|
9855
|
+
!*** ./lib/utils/cellOutput.js ***!
|
|
9856
|
+
\*********************************/
|
|
9857
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
9858
|
+
|
|
9859
|
+
__webpack_require__.r(__webpack_exports__);
|
|
9860
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
9861
|
+
/* harmony export */ getActiveCellOutput: () => (/* binding */ getActiveCellOutput),
|
|
9862
|
+
/* harmony export */ getCellOutputByID: () => (/* binding */ getCellOutputByID),
|
|
9863
|
+
/* harmony export */ getCellOutputByIDInNotebook: () => (/* binding */ getCellOutputByIDInNotebook)
|
|
9864
|
+
/* harmony export */ });
|
|
9865
|
+
/* harmony import */ var _jupyterlab_cells__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/cells */ "webpack/sharing/consume/default/@jupyterlab/cells");
|
|
9866
|
+
/* harmony import */ var _jupyterlab_cells__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_cells__WEBPACK_IMPORTED_MODULE_0__);
|
|
9867
|
+
/* harmony import */ var _notebook__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./notebook */ "./lib/utils/notebook.js");
|
|
9868
|
+
/*
|
|
9869
|
+
* Copyright (c) Saga Inc.
|
|
9870
|
+
* Distributed under the terms of the GNU Affero General Public License v3.0 License.
|
|
9871
|
+
*/
|
|
9872
|
+
|
|
9873
|
+
|
|
9874
|
+
const getActiveCellOutput = async (notebookTracker) => {
|
|
9875
|
+
const activeCellID = (0,_notebook__WEBPACK_IMPORTED_MODULE_1__.getActiveCellID)(notebookTracker);
|
|
9876
|
+
return getCellOutputByID(notebookTracker, activeCellID);
|
|
9877
|
+
};
|
|
9878
|
+
const getCellOutputByID = async (notebookTracker, codeCellID) => {
|
|
9879
|
+
const notebookPanel = notebookTracker.currentWidget;
|
|
9880
|
+
return getCellOutputByIDInNotebook(notebookPanel, codeCellID);
|
|
9881
|
+
};
|
|
9882
|
+
const getCellOutputByIDInNotebook = async (notebookPanel, codeCellID) => {
|
|
9883
|
+
// TODO: There is a bug where if the cell is not actually rendered on the screen,
|
|
9884
|
+
// then the output is not captured. This is pretty unlikely to happen currently because
|
|
9885
|
+
// the agent scrolls to the cell.
|
|
9886
|
+
var _a;
|
|
9887
|
+
if (codeCellID === undefined || notebookPanel === null) {
|
|
9888
|
+
return undefined;
|
|
9889
|
+
}
|
|
9890
|
+
const cell = notebookPanel.content.widgets.find(cell => cell.model.id === codeCellID);
|
|
9891
|
+
if (!(cell instanceof _jupyterlab_cells__WEBPACK_IMPORTED_MODULE_0__.CodeCell)) {
|
|
9892
|
+
return undefined;
|
|
9893
|
+
}
|
|
9894
|
+
const outputNode = (_a = cell.outputArea) === null || _a === void 0 ? void 0 : _a.node;
|
|
9895
|
+
if (!outputNode)
|
|
9896
|
+
return undefined;
|
|
9897
|
+
// Find the top-level Jupyter image output div
|
|
9898
|
+
// so we can check if there is a base64 encoded image
|
|
9899
|
+
// already constructed for us.
|
|
9900
|
+
const renderedImageDiv = outputNode.querySelector('.jp-RenderedImage.jp-OutputArea-output');
|
|
9901
|
+
// If the image is the top-level output, then just use that instead
|
|
9902
|
+
// of capturing the entire output node. This is much faster and handles
|
|
9903
|
+
// matplotlib graphs.
|
|
9904
|
+
if (renderedImageDiv) {
|
|
9905
|
+
const img = renderedImageDiv.querySelector('img');
|
|
9906
|
+
if (img && img.src.startsWith('data:image')) {
|
|
9907
|
+
console.log('image found in top-level output');
|
|
9908
|
+
// Remove the data URL prefix
|
|
9909
|
+
// The img is initially in the format data:image/png;base64, <base64_data>
|
|
9910
|
+
// We want to return the base64 data.
|
|
9911
|
+
const base64 = img.src.split(',')[1];
|
|
9912
|
+
return base64;
|
|
9913
|
+
}
|
|
9914
|
+
}
|
|
9915
|
+
// Fallback: (optional) handle other output types, or use captureNode if needed
|
|
9916
|
+
// Previously, we used html2canvas to capture the entire output node. This would
|
|
9917
|
+
// give us the output even if it was html, svg, text, etc. However, starting around
|
|
9918
|
+
// Chrome release 138, html2canvas became untenably slow. https://issues.chromium.org/issues/429073017
|
|
9919
|
+
if (outputNode) {
|
|
9920
|
+
// If the AI requested, a cell output that we cannot provide, we just tell it
|
|
9921
|
+
// "Cell Output is present in notebook, but not available to share with the AI right now"
|
|
9922
|
+
return "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rNkrAoqAIqAIKAKKgCKgCCgCioAioAgoAoqAIqAIKAKKgCKgjliVAUVAEVAEFAFFQBFQBBQBRUARUAQUAUVAEVAEFAFFQBFQBJqMwHDjiP3888+jUPXq1cuMPPLI0TB5+NNPP5mff/5Zfrprz549zfjjj+9+640ioAgoAoqAItAKBP7++28zbNiwpKgxxhijFUWWWsZvv/1murq6TI8ePcxoo41Wat7NzKy7495MbDTv4ROBIvZzEUTKaGvt4r1IvUf0tL/++msCAf0C/YPS8I+A2AOMx0cdddRuVeHuzHu3Ano4YlZ13HD0MptclaY5YocOHWpef/118+qrrxruJ5tsMjP11FObxRZbzIwyyiilVuubb74xvXv3juZ5xRVXmEUWWSQaJg+POOIIc9FFF8lPd11ooYXM1Vdf7X43++aLL74wL7/8snnllVfMOOOMY+aee24zxxxzmO44CG82Vp2Y//TTT5+wtdlmm5n+/ft3IovKkyLgENhuu+3Mvffem+jlBx54wD3Xm85A4PLLLzf9+vVLmBk8eLCZccYZO4OxBrmg//z222+Tfuymm25qMFX7o3V33NuPoHLQbgReeukls/baaydsDBo0yKyxxhqpLBW1n1MzbiCgaFtrJ+8NVE+jRBB47733zPLLL5+EHH744aZPnz6RWPqoVQi0atwi9sBKK61kzjzzzFZVr5RyujPvPgA4lPHLCPHuxxtvPPlZdf3hhx/Mu+++W/U89mDKKac0E088cSyoY55l6ReLMK06rgh6I17a0h2xzALsv//+5vbbb4+iOeaYY5oTTjjBrLjiitHwPA+/++47s+CCC0aTNuKIHTBggLnggguq0rfKEcuqgEMOOcRceeWVVTzw4PzzzzfLLLNMNKyshy+++KIZMmRIkt1WW21lJpxwwrKybno+ncK7GDQbbrihGThwYNPrrQV0TwQ6RV633nprgwN20kknNY899lj3BLOFXN92223mjTfeMKOPPrrp27dv00u+7LLLkn6Bgu6++24z00wzNb3MMguQwQsTit3JEdspuGPXiF2ywgormHnmmafM19PRebW6rXU0GDmYe/755816662XpDzxxBOdUzaWVVH7OZZno8+KtrV28t5oHRuJNyLJu++kOOyww8wWW2zRCEQap0kI5Bm35JHXueaay/zyyy+m3Y7Y7sx7URG48847K2zXvffeu+J3mD9250477RQ+jv4++OCDDWOKTqYs/WKRepSp4zplvFgED01bBwH76WBp9OGHH3ZZB2vXdNNNV/G36KKLVvw+9dRTSyszlpFVNq68xx9/PBal5rNll102SW8dajXjlRH4559/dtlBveMX7Oacc86K3zy75ZZbyiguNQ9rELsyrbMhNV4nBnQK7yL3diKiE2FSnjoEgU6RVzvhkrR59LNSfQR22WWXBC/0cyvo0ksvdTr5rbfeakWRpZZhJ0cT/tdaa61S8212Zp2C+5tvvunePzpjRKJWt7XhDdvnnnvOyc6NN96YqXpF7ecshZXd1lrJe5Z61os7Ism7XWHnZPPiiy+uB42GNxmBPOOWPPIq49odd9yxyTWqnX135r12zeqH7rXXXq7t8d7tlxI1E911110V8UVWYle7YKxmXp0QWKRfzMJ/mTquU8aLWeqvcbMhwB5upZBd1VnhhGXwhUPvr7/+SvK3+7B23XrrrV0MztQR+3/IfUVHR2W3JkgCf//99y67XUKFErSrjf+fsOS77tzYO4V3lPyzzz7bxYSEkiKQhkCnyOs777yTyKvdCiWNVX3uIZDHgPeSZ74t20mRmYGCCdQRWwxAdcT+b1K6GIojZmq78izR7dgjdtVoJhBa6cwsW8e1kvdMoNaJ3Oq+pQ47TQ0u00nRVEZHkMzzjFvyyKs6YtsrUH/88Ud0kZfdYzuVMXt2TpfdysD9nX766c4nceihh7rnxMnaz6QW2sSAIv1iFrbK1HGdMl7MUn+Nmw2B0hyxdgm7a6Drr79+Fw04RjgTP/jgg1hQac+KGmOtXBFrl/I73OznwVUYHHTQQS7cft5ZFV7Wg+7c2Lsz72W9P82n+yCg8tp93pXPaZ7Bh58+633ZToqs5ReNr47YYgiqI1YdscUkKF/qovZzllLL1nGt5D1LPevFbXXfUo+fZoaX6aRoJp+adzoCeeRVHbHpeLYihK+DZSWr71ewWyI2XDxf5koedp/fhtONaBHL1HE6Xhz+paeUPWItTMaugE0OmWInBDbgt5+71tkUIR7MfhiPPPJIsqH022+/bWaYYYbkwCoOG+Cwr0bIrjI1O++8cxK1kT1iwzyXW2458/7775tm7xHL4VwcXgaxJ+tTTz1lRhpppAp2eLbxxhsnz8AUbIXYSFsOE1t88cUTnCRMruwBaT9rTU4m3WabbeSx+eqrr8w111zjfttZ0WS/SB5w2NQkk0ziwriBz/nnn7/i2VlnnWXsimcz22yzJXv0WiVtnnzyScP+KPPOO2+C35prrhk9FbXdvFdUJOcP27Ele0aGyWeZZRb3XsMw/zd7A99xxx3m4YcfNnYVrfn+++/NRBNNZCaffHKz8MILm6WWWsr06tXLT1L43n/vHJjQs2fPZD9n9gi1M6ZmvvnmM0svvXRd/p944gnzzDPPJPKKXCEH1157bdJ2P/nkk6Qe7Gm4+eabJ/UJGWfTePZq4jA//v755x/DHlILLLCAWX311avaQZgeebWfXJqPP/7YcGoyh9ux1ylyB//ojTRCX91zzz2G/YJee+21pC1YI9HwZyeRUg/Hu/DCC5M9rsh75ZVXNvfff78BB9qoHK637bbbVm1+72MOT3naWlpdsjynXT744INVScYee+yk3lUB/z5gc38O9YI22WQTY1frm/vuuy/ZVxa55UBB8EBvNoPy4u7zQluzX2QYNutH3pDX2WefPfnjUBv2fQ0J+Xj00UfdY+SNfgGyn3i553KzwQYbVOlNCfvss8+SfV7Bkn1mJ5hggqRsMEPmY2QNsIo9Yn/88cfkPaBj2WuddOy3Nuuss8aSu2fo2ptvvjmRdcomLe9M0ruIKTfoOXCgrXA4DoeGofNppxzCmUb19ohFhsgTok2tssoqaVm19HlR3Omj2QvPDlgMe7uGhF2D7oCQPf+AC+lTCfvyyy9df49OC/vfaaaZpuYhTOSRlcpoa5SZVWbKbGtZ6yzxhw0blvRp9Me0c/oVDpalffHHPv0cSBISNtjXX3+d9KXo/zSir6IdQthr9LVC9H+0BfQzbRR9QR8588wzJ2Vz4Cx9Wy267rrrjP3yrCoKdoTsA1kVGHmQ1X4uwnvRthayn5V3SZ9HP0vaPNcy5T1rW8vDb1oau+AmGYO88MILiS2GDYkdxlhtySWXTA5KDg8bDvdPXHfddRN7DFuK/hm9hrxjO/bo0SNaNLYy40T6wk8//TT5w3amX6Ktrrrqqql2nGRIe2EMho290UYbJXmgu6kLh0zS1pdYYgnDmQ/0mSG1Smbsl0sGuYbWWWcdM8UUU4SsVP2m/0GXQ4wbfRsjz7ilDHn194g944wzGrafqyqX8UEn8V6GfyNj9V30I488MjlvhgfYc5zTg5xgW8he9C5yyg029O67756E7rfffsZuM5ESs9zHRdpq0X6RA9TZK/fpp59OKsXYnLEzek7OQsI2mHbaaV2li+i4do8XGS/YCdKkLtgO2LGMl7PoZxJnGXOVrePci+gmN6U4Yq333w04EE46yP/85z+ZILB7pRq7ZYE57bTTounoCI877rhkwB+N4D3Ma4xJFq1yxDIYE+coDqBjjz1WWHBXDBt/oE0DFwobe2zTe5Qligjy09Ih0Kk3SjGlK8Y9eDEQwYgKCUcBh7PVM8ZazXvIZ57fdlbRXHXVVVVJGzmsi0MmcGoxKE+jLB1kWh7hc4xMDF+IjdUZRNIZh7TPPvskm7SHEwMS7/jjjzcYUxCdOhu6x95/7KAeHGG77babc2pJnnJFnmjrsdM8Ue5sMI/Tvxb5su7Hw8A+4IADnGPRD+OeTod64UwPyTckiYfTJCT03w033JB00hJWRluTvIpccQLsueeeVVnAc63DupiwATMI/Ww/SUoGKmFGyIxMgIVhRX7nxV3KxHmI45R+KUboV+ol+kzinHfeeeaoo46Sn3Wv6NnQWUYijFd0RaydEU5b2HXXXasGnb6TgjinnHIK0auIE4jRszHCiNxhhx2SAWcsfLXVVkvqiDM+JPpk+iQOi4wRfTI8pR0kWcsRi9458MADk2yRP35PNdVUsWJa/qwo7r68xk6HRk7oT6Hrr7++wiEXymCtyuPosNsX1YqSOcznPYuOk4LyykxZbU34yHNlshnHTBoh74MGDTL2i6mKKP369XMOc7siM9p3kODkk092bThcIIB+9SfGKwr49wf9HgPfNOdUGv/1DusKy8pqPxfhvWhbK8o76fPq57DsLL/LkPe8bS0Ln7XiMqG85ZZbpvZrpEU2tt9++4ps/HELepBxkDg5/IjoN/qeUN4/+ugjg21cizjYEt1bS58yCYbNStxzzz3X0BfG+mjanOhrKbOVMgOP8Aphj8jCHOEldsVpsummmyZB6CwWMgnlGbeUIa9F+xbhP+u1E3gv07+Rtf4SX/oH7F0WAGFziiMRGRtrrLEkauq1XY7YIm1V6h1WqpF+kUNmY4suyGuPPfZI+nTuwzZWRMe1e7xYhHewgLKOucrWcf/jovv8L8URywoCOmSI1ZT9+/fPjICvFDB4OfGVlYE4eVlpJ8S9P7snz/1rVkPST8t9qxyx/oDMHvCUDJhDXvjNIFscdjjSWH0H+Q0m7fRRDIiYI5bVHv4Am8Zv9xNL8qXTDldigkm4yjk0chi4wSsrJHCUyaAGhy/OWJ/azbvPS957HG6shhSSgVQjjlj7aU/SGZKWjpHVZeOOO26yCsru2ZmsTm7GQNt3xArfOExYocP78h3LOGGYIIiR74jlnTNjCNE2WQ2BsYw8hY5YVgRi8AohU6x+YIXikCFD3ApjViJccsklEs1dWbHAwBdiFTmrEFkhwAoJdIWczo58hWS3RUlmMkUuRV4xQFjdy+pxCP2D04734ZMYkvKMejIzCvkObRzcnCAqVEZbk7yKXHn3/vtllSuO6SyOWCmfFSesYsTRJ7gRxgDAX+En8Ytc8+JOmeHXGrwzVgKw0o1+i7YGIUsPPfRQxcpY6sJMsBDGq8hO7HRYe/hZ1WoVX17Jhy8EaO8YKjjGwR/ad999q06n9Z0USST7j7ZDetoR/AiRFzj5RBm9e/d2j2ibGKWsmsOglrJZtXn22We7eHJD+5fJBtoEvPOlBH2FrOgkLrqe1eQhpTliadf0VxBtEIyQwU6horiLvKIXszpijznmGMOgDWJyk/cE8e74wsAn+l8ZbPvPi9wL75JHozpO4ueVmTLamvCQ9yrySp1pN6xwwQnEF0WshhdipRkrRYT8r5aYMGGAFhJ6SPpYdA319R1MOFkpg3aGk4l3S//Dqju/b2HCE10RI7BnghdiVY3o5UYGnH5+We3nIrwXbWs+39xn5b2Ifg7LzvK7DHnP29ay8JkWFx1FXyJ9CJNxyDf9KrYfK1XpWxl/hKvmfNtf8ke/0ebos/zxHv1S+FWBn55V5XzdQZtlBTm4suJTCAcv7S1G4tyh72E1LfzS/uCFRQC0e1anh47YVssMWMvCgEbGFtT1nHPOMQMHDkyqjR4AH6E845Yy5LVo3yL8Z712Au9l+jey1p/4dpsj98URY0+ci77/odZkvl9eux2xWdsqvOftF9FhLJYSYszDint0gjiwJayWI1biNKrj2j1e9PVrVt6Jn2fMVbaOE767zdWCVpisoej2DbECmTk/23G69BzyZT/Jq8iDA6zsgC35s58vugPAKiJ5P4ruE9WqPWLtyjtXL7tCwqtB5a3tfF08f3/dRvYhsUa7S1uZa+UvaxC7eFbRVAam/JJ3wtWusuyyn866mHYg0CU4Em4/y3Nh3LSb9wpmSvoheFines0c7ay7w5p9kzjILiQO/EKOyyb7mY4rG37ZcN06zl0xdpWDC7eDzdS2ZlesunjkYzusLtuBuHy4sZ93dtmVBu4Z5RBPcLKOaxfGDZvJ289eXLgdVFWE88NvCxxEEpJ1yHal7XmEbpKy2SOJA/F8sg4iF24nk/yg5J53JentxFMX71GIuksYV7tyV4KqrnnaWlUmJTywjsOEZ+sMr5mbr9+pm3XCVcQ/+uijXd3tCr2KsDJ+FMHdfv7ueENHIR9CyJvsdUa97OdZEhS9Slz4aYQ4vEB452odmBXJ7KCzQkdap0tFuL9/IvxZR01FOH0Gz/nr27dvRRg/rFPPhdPOfZm0DuWKsuljfbJOQJcW3sM+AaykbLviyU/q7mN7xFrHrktHX045nUZFcZd3bgfw0apZR4PDAH2bRu3YI1Z4591m1XFlyIxgkbWtSboiV3S+/bqjoj+U/Px+sU+fPvI4udpJxOQQWjBDl/r9qUT0+13aZUicHk/7ts6kMCg5BEXaEmX4/U5V5H8f+PyGeiMtjTzPaj8X4b1oWxOe5ZqF96L6Wcos45pV3stsa3n45zwL0f/oiRhhn8VsNN/2Jw+7SKOizdgJYpd3rG9hfEhbtY7SWLFd1gnp0jPGSiPGmlIHrocffnhV+6OedsLTZdEumbETbgmvjKkaIfoe6oTeqEeCQb1xi59PVnklbZG+xS+76H2reS/bv5Gn/tbR6mTdOhiTLOyWHu4ZfoJGyE66uzTk2SrK01ZjvGXpF+nnpW3YyYuK7MIxEbj4VFTH+Xm1erxYlPe8Y65m6jgfz068x3tdmE466SQnsHa2MHN+fiOzs6nR9HYGx5VRa/BC4izGWKwwcSDi9GkmYUxIQw8bsl+u3XfMxfMNG7/BYAzHqFWOWFHuPg++0sZx51O7efd5Kete3mU9g8bvANMG62XxFObjDwjhN3aonl3N6eTNrhIMs0h++45YDKxGBoc48AQjHEMx8uUiZuAz0CUPymQA3ChhQEvZOIBwwoVEfpI/ccP8fUMyNgjwcbMrRcLs3e9Wd6yu4OAmjyMWIzYk3wkdc2CH8bP+LoI7MiTv3dedwgODOgmvN2jJasD7jlA7gy5FVlx9pxxOSp98JwVO5BjZ1b2Of38ihEkGqRf4cUhmSEx0SJzQEPcN9zSD2y+biaOQxHlE/w7ZT7NdeTwbOnRomKQjfhfBnQqIvKbpdv+d17Jl2u2IzarjypAZEYCsbU3SNfMq+pI2409qUKZddeNk2355UMXGgAEDXLhdeVcVXu+B71yK5R+mzzLgDNMWtZ/D/GrxXrSthWVl4b2ofg7LLvI7q7yX2dby8O3b9mljj7R8fRuPPsLuzVwVlUUAtDP6mKyE3Sb9Gochp5E/7mSM1Qi1S2b8RQT+ZDK6ANsCh7FP0gfZFfr+4+i9YFVv3OInziqvpBWeKC9r3+KXXfS+1bz7claGfyNP/X0e/PYmvg7eTTjeiZXjt/s0uzCWrugzn/9G22qszEb7ReRT2gWHz8fIt39D/02ZOq7V48WivOcdczVTx8XeXyc9K8URaz8VdkIbCmS9yqIUROBxgsgsKlf7ubD78w2Pes7eLMZYjD9RTs12xPpO0sGDB8dYSZ7J7CY4+R2u32DSjCG/jNQCbECexi7vDWMqHJhQFoN/iRPObLeb91pY5A2TutYzaHACSlyu4Uq5vOU3ks53xNr9QqNJWBUk/KWtcPQdsXYPpmg+4UO7n6TLl5WysbZuPyXrEiMc4yAkmTWDP2S2EeOBPOznSa5sVg/GykbfYLhK3UNjUQxJ+IuR3erDpQ1XEPrx87Q1P31Z9+JYQO/WIn/2N02/C2axlZm18m4krAju4gysVUcGa8J/rQmFrAa8v/qbVRExmbOfDbqyyd8n30mBzMTI7xeRcSEco1InuxerPK64+noIQ9cnv9+wh+/5Qe6edi9lxCZsBHvy9gewGLb+1xMuww65KYI7VRB57c6O2Dw6rgyZERHI2tYkXVlXe2BF4ixggpl2xZ8/IR5OYNqtQlxb4AsBn+ijpC00sqINu4kvn+iPpGx/EgOdUY8aHXDG8iliP2flvWhbC/nPwntR/RyWXeR3Vnkvs63l4dtux+HknYltfxKwXn6+7c/kdYykrcVsQD8+4w6+LGFyQ9oKV2lvYb/mp/WdO43a4O2SGbtVlsObeyG7jVzyHJzEFqa/ln6Z9lWPJG69cYufT1Z5Ja30i3n6Fr/sovet5L0Z/o2s9efrJ3nH4Tjcbl/hwmjT9agTHLGNttVYXRrtF+1Wew6XtC8sfds7HBeVqeNaPV4syrvo3qxjrmbquJgsdNKz/wIAAP//e4wfogAAHEJJREFU7Z0FqG3F98e3XahY2BigYoLxEBHsQMEOVLDFDhQTGxW7+xnYHQ/FTuxu9Nnd3e39z2f//muzzpzZOfvEu28N3Dtnz55Y8501M2vWrJmdjLTgzj777JEFFlgg/bviiitq5fjuu+9maSWPMv+YY44pLOOuu+7K8nzyyScL44Zerrbaamn6zTffPPS6tbDjjz8+o/PWW2/NzXeHHXbI4r388stZPI3d5ZdfnoXrHwcccECWVof7v6+66qos3vjx4/3XwWdpp0033TT4nsDlllsuzXedddbpiDNo2juIaelB8DjooINKc9x7770zvEkHzx155JEj8MGnn35amr5phBdffDEr94wzzghm88EHH2RxjjvuuGCck08+OYvz1FNPBeP4gfvuu2+WRrAq87/77ruObK655pqOPOCv/fbbbwT+fe2110b++++/jvjycP3113ekKyuX9/fee68kT/0lllgizWOrrbbqCJeHG2+8MSsDnPNck76Wl1dM+Pbbb5/Su8IKKxRmo7F75plngnGln5Nn264p7n/++WfWHttuu20uWcwnwg9vv/12brw999wzjQc9VZzQLXmX+WuttVZHtldeeWVG10MPPdTxTh5uv/32LI6eQ5j3pLzzzz9fonf5lEk8v07MfZL+n3/+6UpHwD333JPFufbaa7viCE9IPuLvs88+XXGHKSAGd+oh7b7rrrsGq6XHiRdeeCEYh8A333wzw5cxox9OaG8yxrXBM1LHun1N0sX4v/322wjyK+Oh8Gqe/8MPP3QVJX0Jvtd9pkpf/Pfff0fuu+++kY033ri07AceeKCrbD8AvhLa9bjgxws915WfY2iP7Ws+/XVoF14XnMp8f3z2y455rsvvbfa1JnTTV/x+wjrg1FNPTeWmH3/8MTdbLfufc845wXhl65Yvvvhi5MQTT8x4PK/t/HWHLmyDDTbI0v/111/6Ve7vQfHMTz/9lNF63nnnpfR9/fXXWRj1f+mll9Jw3QeQicucYFdl3SJ51eVX0gl2TeYWKbcNv5+0a14XnMv8Mv1GXQxuuOGGjE9YP2n32GOPZe9OOOEE/Sr4+7bbbsviF8mVwcQRgU36aqi4qvPipZdemtUTjEJOY8Fv7XS7Nx3jJL9+rxdjaI9Zc/VyjBMsh9VP2iDslltuyZiWibiOe/jhh7O0DNQopMr+zjrrrMIi9EQ0zIrYsWPHZnVHIM1zWjj/+OOPs2i6wwxSEbvbbrtlNPk/RKlN22o3aNo1LW39lgm2ikCDghHFq6TxfRRHn3/+eVukZfloRWzepgm0CT0ILSGnFbEffvhhKEpXmJ5MV1555dJ+Du/4ilgWuBdddFEm1Amd4pPv888/31X2SSedlNWJhXLZGMN7xibtRJCMVbD0e2LVddC/myhi8wR7Ubr1UhFbF/dPPvkka/P9999fV73jNwsb4Z/HH3+8451+qCPA//LLL1me5F2F33zstJJCb8BpmlDQCu0XXHBB9mrcuHFZOIq/PLf11ltn8X7//fcsmiyyadc899xzz2VpQ5s6whNCn/aRGYbVxeBOndoaJwapiK3b16h3GzxDPrg6fe1/KeL+o1jScpbwKnWSvivtyrtvv/22q8ALL7ww6w9PP/109v6www7Lwj/66KMsXP/Qm0FStp6ndF9iA6TMVV1whvKpKz/H0B7b13z6q9Lexvjslx3zXJff2+xrTelmfBIZQnhW+0cfffTIH3/80ZV9rOxPet0XpUzpp/gSVqQ8F3m0aI7TxA+aZ1AqU6+ddtopJUsrggg/99xz03CtoNYbQrou+rdgVWXdIunq8ivppM2azC1Sbht+P2nvhX6jLgbwi7Qxaz4Ui/KHsYm8Y+1U5jTPDUIRW7Wv5tWj6ryo+1DemufBBx/MsCtSxA5CN5NX/yrhMeNz7JqrV2NclXoPMk4rili941+04A1VFKWJDARYiLbhqgpjeWXJRN5ri1itwJZJNEST0ANOLBjEVekwWAsKvpIu5DdRDkm+vgJB5y+0+wPooGnXNLb1W/CoI9Bg/YpFeUigRYj8+++/2yIvzUcrYlk4hhzWBlKXAw88MBRlRCtiQ4vSUCKUy5JvyKIolCYvDKEYnsW6TgQ8yRvfX/AiNMj7KhZFoXKlnFhBsklfC9ETGyY8x6KuyGmL2DyhRBQFRWNBURlF75rirjcU9thjj9wiTjvttIw3ENTyXB0BngWQ8FuRVU5eWYRrJYVW7Og0Whi8+uqrs1dY10n55JPntPIJyzZxIhCBfZ7T1hShsUR4AjoYE994442MJsKYA4bRxeBOfcr4VVuoFPHbhKaIbYNnhB/q9DVJE+PrzRjkPuZJ/3SF3jgNzXlskkufO/zww1NysBARfsg7OaQ3NOgzKFr9ef+OO+7I8h4mRWws7bF9zW/zqrJ/G+OzX3bMc11+b7OvxdBNWvoKazdRbEofwGcTwndVZP8ii1i9eUj+vqxHebLuqKKILYqjaR80z8iGB+MJY5NgJPKLjC/4YI+8XcVJe9VZt9TlV+iQcTBWfq5Sp6I4/aS9F/qNorr573799dds3pB2LvLfeustP4uO50ErYqv21Q6i1UNVRaxeL+ad+Lz77rszbE0R+z+QY9dcvRrjFAsM5c9WFLFaC85gqy1rymr9zTffZMyM0rANp4WxRx55pHaWMomzSO2lgzYZFHfeeedgURzxkTj42ukj5FgJhhzHQCR96L2ENVEOSb5FigaJ4yu1B0271LtNX+paR6DR5TOIsTARgYX8mvCvztP/rRWxxx57rP86fdYKkzPPPDMYp4kiVgZZ6tWmEobxhj7PJC1t4Fvm60kTRUgTJ+0SK0g26WtN6C1LM9oVsdRf+KFoLKe/Sjw2IfJcXQFe+NHfhMrL3w/XSoo777zTf50+a6UeSllxKMylTizU8pxYVvnWEMxHkl5v/ul8OPIscVAU+U4UseAgSi19tch6660XtJjy8+n3cwzu0Cr15kqhkOOomuA2mhSxbfCM4FW3r0m6pr5WbP3888/BbPRGYkgRSyI5Ms5cgTJVW6z7x0KlEObhMn7A2l3i9FMRWyZ/xNIe29cEQ/HryP6x47OU2YZfl9/b7Gtt0C95INdxxFl4FZ9Nc+1iFLF6oY/8IvOKzl8rTGnjPCeK46I4ftpB8gwygODK+knkUYwaZM758ssvszhFxj26XpJnnXVLXX6lPKE3Vn7WtDf53U/ae6HfqFNnvSEv7VzkhzbUdXkTiyJW19NXsgoeWBcLln6cmDFO8he/3+vFWNoFkyZrrl6NcYLlsPqtKGKpnCzqaQTuravjZIBmUYgFQaxjB0OYQe7TqZPnlltumaVvg568svWdGNDrW0GQDus9qYt/t97333+fvQvd5YlAIhM0eRQ5fW9d6Gh3KK3Qhc+E4ztt0eMr2QdNu09rG8+CRx2BJlSuPuLIQqVNpxWxeQp0PfDnHWtuoojViy6sLNt23JElbeBbQGrlMnfVNnEyTsUKkk36WhN6y9LImD1aLWKpvyyc4IuQFTZjpCgjicNznuO0h/BXUTxJDw9K/HfeeUeCK/u6vxx11FHBdGIVQznwuDgURVJ2nkDElSISx7ee0ZsmecoYrOUlfUihKHMPC15xLJy1EoFyyhz3adNG8pc3JpXlU/V9DO6UIUq9vPGVebwIN6FTb1b26xhgzBjXBs9I3ev2NUnX1Jd6i1WZnw+ymsSh7fIUsdddd13WthxL1SeS8tLocSJv00NvqPdaEVtHfo6lPbav+e3UlPYm47NfdsxzXX5vs6/F0J2XVmQL+oqel4gfs9Dn+xUydp5++unB4rnHXuIUKVmbKGI1v/ebZ7iqTOolym65bxULfN7pI9VVr+WTPOusW+ryKw0l42es/Bxs9BqB/aZd6o380kt9QggCbWTAfMSmiP+HFazwQJ6sKHlrBWW/ZBLKbtJXhWbtV7WI1fFQ3IecHuN6qYjt93oxZnwGp5g1V6/GuFD7DVNYa4pYbYLPgENjhhyd3p8g9K563n0a5MUi7tVXXw1l2xGmj4hxjKWu04NXVaVk3TIkvl5I66OlvGexr4/h+JdGg4cMoFjx+rvD+jgb8YqcPmaKIq6Kk7Lx9f2EklYLi/5ANWjahcY2fcGjTKBB4c7Ofp7TH+Bpar2Zl7dWxEKvr0CB57BUk7qEjn2RdxNFrB5kUdL4lhKaZvAJfbSsyGJR5+8r/v165R2xhwbuNWMTwXciUMUKkk36mk9LG88iSDBeF7kJ9WoC6iQLFvj54osv7qqm3uiSu9e6Iv1/AAs/6RdVPmiorRG4R9sfn3U5zJccI9NOKyngPV+RrJWttKFWDlOW7sehO2b1xyIvueQSXfSIvvIAXHzav/rqqwwLaPNpJ7OQIpZw+ra8A09tyct738lRS8Hep9WPH/scgztl6zvZGJO0++yzzzLcqI8//uq4KOWkzigA+uFixrg2eEbqWLevSbqmvl48YFXmO05YSFvg5ylVtcUefV7SFI0tWk7i5Ibv9Mkp8uu1IraO/BxLe2xf87GqQ3vs+OyXHfNcl9/b7GtN6GYuCt3/Knnpe5H9tWDMQl9bGIaUrMyBYpVOXwnFERqbKHcGzTPM8zKm4MtcqOUYeR+ak6Xu2pf4ZesWnaYuv5I2Zm7RZcf+7jftbes3qtafviCY08ZFSmA5BUw8ZLs8N7EoYsFOY+LL+/rEGZj5+o2YMc7Hvt/rxVjaY9dcvRjjfEyH7bk1RSwV00e3GACwDmA3FOXJE088MSJCG3diasfxez1gcMk71iB0BiZ7vmSNwCYdQ6cN/eauO70IZdcQ4ZWdUv6wbihyWsiBLo5nc0cfaf3d3aJ8qrwjX5kI8akndce6T39lnoUrePhOYw6+CCoISfpjLZK/n1Y/6wUidUYByGDz/vvvp3+hr6BKvuLz5WyO9VG+tuqkY4WsfQdJu657k9/UE77Wf4IDO2g6nN+67WRXH2Uh/UKUsigeOe6rlRQsLNp0viKWtoYGvhoLD2B9JvXwlZmajiaKWNJrvuA4NH1NFEwIANAimxN8udJ30IvFOspq6KWvkx5BVCts4H/f6V1O6khfQ1GCkokxgU0eFtyUgdWe7wgnXawitklf82mp+4wQ5vOk4AW/+e+0ED8hK2K1wlDaHH6hfvq6Ct6FlJUaZ71BgrXj/fffnyrsZYwMCbqi7CZ/NtVeeeWV9J5vxgM2OThKK5tt/iajVlKQnoUjG5mkZQwRy0vehTbP9OIM3kWgYz5ljmAOJh1/vNPtTZ19Re4hhxyS9jfKBieZi0kfUnCTh4xj0O07Poqmy4f/8pzwqcSXxWde/NjwWNz1MXLGKvgDpeqzzz47wpgn9cAvUsRSDx0fOYT4CMrkWYRZUwxixrg2eEbobtLXJG0TX+Yc2gSlNxvw8Drzg8itut3yFLGUrS2+JU3o6g6h8+abb854QsYV+IVxSo+9kldIEYsMocdw4kh8+ot+F1I0Cy34deTnWNpj+5qmuy7txI8Zn/2yY57r8nubfa0J3cw3jBVYYDJvMX/AN8xLevxD9odW7WIX+jKvwN98JJL86KvMjdpynPdtK2KpxyB5Ro9T1I8648Bf+jt+aM4lXsy6hfTi6vIr6WLmFim3Db/ftLet36iKgTaOC61ndD5aeaZPHHFqiiP48qd1EvQDCcd//fXXdZat/m6yaQIBMfOivnoL3kW/gQwHPsLL0ud6qYjt93oxdnyOXXPFjnGtMl6fMpuEcpKWnBMeE7dgS9xAV5ijU/AkTlnVEcctzBKn4EjchNIRHnp47733QsEdYU5pmmyxxRYdYfLghL9kxRVXlMeg7+53S5wpf9e7ZZddNnEdsSs8JsAJLon7qntuFtNNN13ilNrJ4osv3hXn0UcfTZxCsyucgFlmmSWZe+65E7f4T9+X4eaOvyZuQA3m5Y6hpu2jXy644IL6Mfe3u782WX311bveD5L2LmJqBrijQImzYK6cyg3iyfLLL5/Gd9aWiVtwlaalP4B7m84p+BN3/KQ0S3jnpptuSuabb75g3FNOOSVx136k79wHO5KZZ545GM8PdArfhP7v7oLxX3U9g7Gb7DvCl1xyydIxgj7qFgrJVFNN1ZGWh7FjxyZO6OgK9wPWXHPNxCmNO4Kl7LXXXjtxx3I63vEAXtJeboGaLL300l1xJKBuX5N0TX3GZHckunJyJ3Ale+21VxrfbcokBx98cPqbfELj0JgxYxKnnEhWWWWVxCnQK5dTJWIs7oxp4F3kttlmm9I4bqGZrLvuuonbGAxmRfsvs8wyHe/cRkqyyy67JG6B2hEeenDCXOIEvOwVPHzEEUekz8wBeXMj/E4dp5lmmiwtP5jaacOyvuYUfInbuOxIy4MT5JPtttsut1ziLLXUUom7+zKZdtppeexwwhPEcRsjHe94YM5j7sO5BXtah8kmmyx91v/WX3/9xG0KZkG0Je3VKxeLu7t2J6FN8tyqq66auLtD09dl44RT1CdOMRjMaqWVVkouu+yy4LumgbF9LZZnhO4mfU3SNvHpp07pnZuU/sd47jYz0jhFc16ozeDfUB8hM7dJnWyyySYdPO4Twrgj/Zg+4xRMHVEYd93GTkdY0YNT4CSTTz55bpSq8nMs7bF9LVSBqrSTNmZ8DpXdNKwJv7fV15rQjOyLfFbm3CZd4jbtOqKxDlljjTXSsLyxHDmK+RTnr1vcJkPirM3Td6F/zDduEyPtDwsttFBC/JDbcMMN07VRUZxQukHyjNuYSdfY0DXHHHMkznAhI1GvWZ3iLZPZsgjuR8y6RefThF9j5xZdfszvQdDetn6jSv21fOWschO3SZGbDPqcQUD6Xq99yvqaztBZwSfwYC9c074aMy/CJ4xPeev8zTbbLNMF+TJ07BjnYwgddXQzfvo6z23QHrPmih3j6tR1aOK2rfBl95MdeG0xI7sG+BzR8i1/hAYsdbRFnk7Hb3Zg6hzVxnqVnSC9g0o+WN2VOXZYuV9WdmKEFv+jU2X5VH3PLotvkk2Z3NmChWyRC1lNsBPMDpW+ZqEoD95RZ7dAHMFS1d/xcQqsruSCCXfuhHaJwJ2v6ha5QdFeRFOVd06g6diBFizyfHbSxMHnWJv6GEta+AA+dxOBJGnN1xaxlBGqBxZoZdZW+ngP9/3WdVgIhfgdDAjnOA9WX77DAiNvbCEtdJVZvGPp7fdrwZ42oW1CY4SMI3nHhPUOapl1Zd2+5uNQ99m/pkTqm+frDz3QtyVe3okAacu8DxTVpVfHbwN32lNolLrg0960W1WH5QknPfSJC8mPvhVyWJtjzZjX38mL+7Z8vuWqGp23WM5KGD67x0VHRJmPsSzXaeQ3/QgL3SKH1a5vkSrpudqAuuU5wTvv3jEsiDWOTnjryorrS6Q88f3j/l2JIgPawB3LVeFboZtneK3OOEFVGK+Yx33+QR5q2wnNMWNcDM/o+jTpazp93d+cQtJW5tJuhGHpV3XO01dKkAfyUZljvgVzKVN82gNrG308EUt832nLaUlb5DP/lLmq8nMM7W30tVA9qtJO2qbjc6jcmLAm/N5WX6tLN3Mdc30ejzFn+FfQSRnIdZIOi+iQK1u3MIb64yF5QhMWiDJn0XfzXJU4eWkHxTP6uxtOOdNBHvOn4IpFfMiF5H1JE/L1usXPry6/tjG3+DQ0fR4E7W3rN8rqrueyMh0CHzzW7S/zg76KQ78P/XabwmUkNX7ftK+2MS+6zcJsPKHenHJiTaSvDOJkp3ZtjHE6v36uF9uivemaK3aM07hNKL9btYj1tcvuGESC9R8WIuzezTPPPMlMM83kR+t6ZieCXUfHEMmkk06apcUqYbQ7d2wscUJkMsMMMySLLrpol5VTXv3dgjW11GInmJ3HWWedNS9qa+FiEYs1hzuqntBuWFo4U/pkkUUWSdu7SmGDoL0KXb2O45QkKZ87U/7EHaFI23yuueZKcQtZhrVBj7aIZcfUTXCJm4RTaxwnXCaLLbZYpT7aBi3k4YTm1OIBDGabbbZk9tlnT8BgkkkmKSyCfuIUMokTblLLHiy/GV98q8CiTKi3E1DSNph++unTsuedd95kiimmKEpm7yZgBL7++ut0nITXF1544WTOOecs5bW2quuEggS+ZceZ0yPC61ifV3X0F/ow/FpnfmCs+eSTTxJ37ChhHsUKqMpcLHTJGI3V8/zzz584gTTp1RglZeL7pyZ23HHH5NBDD9VR+vK7Ce5YC4I3sgy8lne6oC8VGEAhg+KZmKqK7Mm8MPXUU6fW//S1fjmn1EzlXre5ks7FjBETimuL9iZ9rQ2M2hif26CjSR6D6mvMo+74csK8ynoPGQ75jfVerx19ROQ35nHG2CmnnLLXxXbkPyHzTEdF7KFvCMgcMzHqN/oGcg8KQp5jXSonSfQJSCyHkanNdSMwyDVXNzXDGdJTRexwVtmoagsBXxHbVr6WT+8QCClie1ea5WwIGAKGQHME2ODT14C4O9XTxX7zHC2lIWAIGAKGgCFgCBgChoAh0AwBrv1yJw3TxEVXDzXL3VJNTAiYInZiau2W62qK2JYB7UN2pojtA8hWhCFgCLSCgNwNRma777574o55t5KvZWIIGAKGgCFgCBgChoAhYAiEEHAfjk+/C8Gd/5zOFqfvgd9oo40S95FneWW+IVAbAVPE1obMEggCpogVJCYc3xSxE05bGaWGwMSMAEeU9Qfv+DhNnesUJmbsrO6GgCFgCBgChoAhYAgYAs0QEB0H14fxId4ZZ5wxvX5RPoBOrnzAk+tYzBkCTREwRWxT5CxdIoOU3BFrkAw/AqaIHf42MgoNAUMgSbjXlvGKe/i4M93u4DKuMAQMAUPAEDAEDAFDwBDoNQKi4wiV4z4WmH4bh+/hmDMEYhAwRWwMehN52nHjxiXua37ph1sw3Tc3/Ajw4bwHHnggJXTMmDET3Qdkhr+FjEJDwBAwBAwBQ8AQMAQMAUPAEDAEDIFBIPDnn3+mH7IeP358wodq+TghH6tFQbvUUktlH+4aBG1W5uhBwBSxo6ctrSaGgCFgCBgChoAhYAgYAoaAIWAIGAKGgCFgCBgChoAhMKQImCJ2SBvGyDIEDAFDwBAwBAwBQ8AQMAQMAUPAEDAEDAFDwBAwBAyB0YOAKWJHT1taTQwBQ8AQMAQMAUPAEDAEDAFDwBAwBAwBQ8AQMAQMAUNgSBEwReyQNoyRZQgYAoaAIWAIGAKGgCFgCBgChoAhYAgYAoaAIWAIGAKjBwFTxI6etrSaGAKGgCFgCBgChoAhYAgYAoaAIWAIGAKGgCFgCBgChsCQImCK2CFtGCPLEDAEDAFDwBAwBAwBQ8AQMAQMAUPAEDAEDAFDwBAwBEYPAqaIHT1taTUxBAwBQ8AQMAQMAUPAEDAEDAFDwBAwBAwBQ8AQMAQMgSFFwBSxQ9owRpYhYAgYAoaAIWAIGAKGgCFgCBgChoAhYAgYAoaAIWAIjB4ETBE7etrSamIIGAKGgCFgCBgChoAhYAgYAoaAIWAIGAKGgCFgCBgCQ4qAKWKHtGGMLEPAEDAEDAFDwBAwBAwBQ8AQMAQMAUPAEDAEDAFDwBAYPQiYInb0tKXVxBAwBAwBQ8AQMAQMAUPAEDAEDAFDwBAwBAwBQ8AQMASGFAFTxA5pwxhZhoAhYAgYAoaAIWAIGAKGgCFgCBgChoAhYAgYAoaAITB6EPg/K1d9FCf8tCEAAAAASUVORK5CYII=";
|
|
9923
|
+
}
|
|
9924
|
+
return undefined;
|
|
9507
9925
|
};
|
|
9508
9926
|
|
|
9509
9927
|
|
|
@@ -9994,23 +10412,19 @@ const stripFileEnding = (rule) => {
|
|
|
9994
10412
|
|
|
9995
10413
|
__webpack_require__.r(__webpack_exports__);
|
|
9996
10414
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
9997
|
-
/* harmony export */ CLAUDE_OPUS_DISPLAY_NAME: () => (/* binding */ CLAUDE_OPUS_DISPLAY_NAME),
|
|
9998
|
-
/* harmony export */ CLAUDE_OPUS_MODEL_NAME: () => (/* binding */ CLAUDE_OPUS_MODEL_NAME),
|
|
9999
10415
|
/* harmony export */ CLAUDE_SONNET_DISPLAY_NAME: () => (/* binding */ CLAUDE_SONNET_DISPLAY_NAME),
|
|
10000
10416
|
/* harmony export */ CLAUDE_SONNET_MODEL_NAME: () => (/* binding */ CLAUDE_SONNET_MODEL_NAME),
|
|
10001
|
-
/* harmony export */
|
|
10002
|
-
/* harmony export */
|
|
10417
|
+
/* harmony export */ GPT_4_1_DISPLAY_NAME: () => (/* binding */ GPT_4_1_DISPLAY_NAME),
|
|
10418
|
+
/* harmony export */ GPT_4_1_MODEL_NAME: () => (/* binding */ GPT_4_1_MODEL_NAME)
|
|
10003
10419
|
/* harmony export */ });
|
|
10004
10420
|
/*
|
|
10005
10421
|
* Copyright (c) Saga Inc.
|
|
10006
10422
|
* Distributed under the terms of the GNU Affero General Public License v3.0 License.
|
|
10007
10423
|
*/
|
|
10008
|
-
const CLAUDE_OPUS_DISPLAY_NAME = 'Claude 4.1 Opus';
|
|
10009
|
-
const CLAUDE_OPUS_MODEL_NAME = 'claude-opus-4-1-20250805';
|
|
10010
10424
|
const CLAUDE_SONNET_DISPLAY_NAME = 'Claude 4 Sonnet';
|
|
10011
10425
|
const CLAUDE_SONNET_MODEL_NAME = 'claude-sonnet-4-20250514';
|
|
10012
|
-
const
|
|
10013
|
-
const
|
|
10426
|
+
const GPT_4_1_DISPLAY_NAME = 'GPT 4.1';
|
|
10427
|
+
const GPT_4_1_MODEL_NAME = 'gpt-4.1';
|
|
10014
10428
|
|
|
10015
10429
|
|
|
10016
10430
|
/***/ }),
|
|
@@ -10026,156 +10440,82 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
10026
10440
|
/* harmony export */ createCodeCellAtIndexAndActivate: () => (/* binding */ createCodeCellAtIndexAndActivate),
|
|
10027
10441
|
/* harmony export */ didCellExecutionError: () => (/* binding */ didCellExecutionError),
|
|
10028
10442
|
/* harmony export */ getAIOptimizedCells: () => (/* binding */ getAIOptimizedCells),
|
|
10443
|
+
/* harmony export */ getAIOptimizedCellsInNotebookPanel: () => (/* binding */ getAIOptimizedCellsInNotebookPanel),
|
|
10029
10444
|
/* harmony export */ getActiveCell: () => (/* binding */ getActiveCell),
|
|
10030
10445
|
/* harmony export */ getActiveCellCode: () => (/* binding */ getActiveCellCode),
|
|
10031
10446
|
/* harmony export */ getActiveCellID: () => (/* binding */ getActiveCellID),
|
|
10032
|
-
/* harmony export */
|
|
10033
|
-
/* harmony export */
|
|
10447
|
+
/* harmony export */ getActiveCellIDInNotebookPanel: () => (/* binding */ getActiveCellIDInNotebookPanel),
|
|
10448
|
+
/* harmony export */ getActiveCellInNotebookPanel: () => (/* binding */ getActiveCellInNotebookPanel),
|
|
10034
10449
|
/* harmony export */ getCellByID: () => (/* binding */ getCellByID),
|
|
10450
|
+
/* harmony export */ getCellByIDInNotebookPanel: () => (/* binding */ getCellByIDInNotebookPanel),
|
|
10035
10451
|
/* harmony export */ getCellCodeByID: () => (/* binding */ getCellCodeByID),
|
|
10452
|
+
/* harmony export */ getCellCodeByIDInNotebookPanel: () => (/* binding */ getCellCodeByIDInNotebookPanel),
|
|
10036
10453
|
/* harmony export */ getCellIndexByID: () => (/* binding */ getCellIndexByID),
|
|
10037
|
-
/* harmony export */
|
|
10038
|
-
/* harmony export */ getIncludeCellInApp: () => (/* binding */ getIncludeCellInApp),
|
|
10454
|
+
/* harmony export */ getCellIndexByIDInNotebookPanel: () => (/* binding */ getCellIndexByIDInNotebookPanel),
|
|
10039
10455
|
/* harmony export */ getNotebookName: () => (/* binding */ getNotebookName),
|
|
10040
10456
|
/* harmony export */ highlightCodeCell: () => (/* binding */ highlightCodeCell),
|
|
10041
10457
|
/* harmony export */ highlightLinesOfCodeInCodeCell: () => (/* binding */ highlightLinesOfCodeInCodeCell),
|
|
10042
10458
|
/* harmony export */ scrollToAndHighlightCell: () => (/* binding */ scrollToAndHighlightCell),
|
|
10043
10459
|
/* harmony export */ scrollToCell: () => (/* binding */ scrollToCell),
|
|
10044
10460
|
/* harmony export */ setActiveCellByID: () => (/* binding */ setActiveCellByID),
|
|
10045
|
-
/* harmony export */
|
|
10046
|
-
/* harmony export */
|
|
10047
|
-
/* harmony export */
|
|
10461
|
+
/* harmony export */ setActiveCellByIDInNotebookPanel: () => (/* binding */ setActiveCellByIDInNotebookPanel),
|
|
10462
|
+
/* harmony export */ writeCodeToCellByID: () => (/* binding */ writeCodeToCellByID),
|
|
10463
|
+
/* harmony export */ writeCodeToCellByIDInNotebookPanel: () => (/* binding */ writeCodeToCellByIDInNotebookPanel)
|
|
10048
10464
|
/* harmony export */ });
|
|
10049
10465
|
/* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/notebook */ "webpack/sharing/consume/default/@jupyterlab/notebook");
|
|
10050
10466
|
/* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__);
|
|
10051
|
-
/* harmony import */ var
|
|
10052
|
-
/* harmony import */ var _jupyterlab_cells__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_cells__WEBPACK_IMPORTED_MODULE_1__);
|
|
10053
|
-
/* harmony import */ var _strings__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./strings */ "./lib/utils/strings.js");
|
|
10467
|
+
/* harmony import */ var _strings__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./strings */ "./lib/utils/strings.js");
|
|
10054
10468
|
/*
|
|
10055
10469
|
* Copyright (c) Saga Inc.
|
|
10056
10470
|
* Distributed under the terms of the GNU Affero General Public License v3.0 License.
|
|
10057
10471
|
*/
|
|
10058
10472
|
|
|
10059
10473
|
|
|
10060
|
-
|
|
10061
|
-
const INCLUDE_CELL_IN_APP = 'include-cell-in-app';
|
|
10062
10474
|
const getActiveCell = (notebookTracker) => {
|
|
10063
|
-
|
|
10064
|
-
|
|
10065
|
-
|
|
10475
|
+
const notebookPanel = notebookTracker.currentWidget;
|
|
10476
|
+
return getActiveCellInNotebookPanel(notebookPanel);
|
|
10477
|
+
};
|
|
10478
|
+
const getActiveCellInNotebookPanel = (notebookPanel) => {
|
|
10479
|
+
const activeCell = notebookPanel === null || notebookPanel === void 0 ? void 0 : notebookPanel.content.activeCell;
|
|
10066
10480
|
return activeCell || undefined;
|
|
10067
10481
|
};
|
|
10068
10482
|
const getCellByID = (notebookTracker, cellID) => {
|
|
10069
|
-
|
|
10070
|
-
|
|
10071
|
-
return undefined;
|
|
10072
|
-
}
|
|
10073
|
-
const notebook = (_a = notebookTracker.currentWidget) === null || _a === void 0 ? void 0 : _a.content;
|
|
10074
|
-
return notebook === null || notebook === void 0 ? void 0 : notebook.widgets.find(cell => cell.model.id === cellID);
|
|
10075
|
-
};
|
|
10076
|
-
const toggleActiveCellIncludeInAppMetadata = (notebookTracker) => {
|
|
10077
|
-
const activeCellID = getActiveCellID(notebookTracker);
|
|
10078
|
-
toggleIncludeCellInAppMetadata(notebookTracker, activeCellID);
|
|
10483
|
+
const notebook = notebookTracker.currentWidget;
|
|
10484
|
+
return getCellByIDInNotebookPanel(notebook, cellID);
|
|
10079
10485
|
};
|
|
10080
|
-
const
|
|
10486
|
+
const getCellByIDInNotebookPanel = (notebookPanel, cellID) => {
|
|
10081
10487
|
if (cellID === undefined) {
|
|
10082
|
-
return;
|
|
10083
|
-
}
|
|
10084
|
-
const cell = getCellByID(notebookTracker, cellID);
|
|
10085
|
-
if (!cell) {
|
|
10086
10488
|
return undefined;
|
|
10087
10489
|
}
|
|
10088
|
-
|
|
10089
|
-
const originalVisibility = cell.model.getMetadata(INCLUDE_CELL_IN_APP);
|
|
10090
|
-
cell.model.setMetadata(INCLUDE_CELL_IN_APP, !originalVisibility);
|
|
10091
|
-
}
|
|
10092
|
-
else {
|
|
10093
|
-
// If the metadata doesn't exist yet, that means the user has not yet toggled the visibility.
|
|
10094
|
-
// The default value is to show the output, so the first toggle should set the visibiltiy to false.
|
|
10095
|
-
cell.model.setMetadata(INCLUDE_CELL_IN_APP, false);
|
|
10096
|
-
}
|
|
10097
|
-
};
|
|
10098
|
-
const getActiveCellIncludeInApp = (notebookTracker) => {
|
|
10099
|
-
const activeCellID = getActiveCellID(notebookTracker);
|
|
10100
|
-
return getIncludeCellInApp(notebookTracker, activeCellID);
|
|
10101
|
-
};
|
|
10102
|
-
const getIncludeCellInApp = (notebookTracker, cellID) => {
|
|
10103
|
-
/*
|
|
10104
|
-
Checks the cell metadata tag to see if the user has marked that this cell should not be included in the app.
|
|
10105
|
-
*/
|
|
10106
|
-
const cell = getCellByID(notebookTracker, cellID);
|
|
10107
|
-
if (!cell) {
|
|
10108
|
-
return false;
|
|
10109
|
-
}
|
|
10110
|
-
if (!Object.prototype.hasOwnProperty.call(cell.model.metadata, INCLUDE_CELL_IN_APP)) {
|
|
10111
|
-
cell.model.setMetadata(INCLUDE_CELL_IN_APP, true);
|
|
10112
|
-
}
|
|
10113
|
-
return cell.model.getMetadata(INCLUDE_CELL_IN_APP);
|
|
10490
|
+
return notebookPanel === null || notebookPanel === void 0 ? void 0 : notebookPanel.content.widgets.find(cell => cell.model.id === cellID);
|
|
10114
10491
|
};
|
|
10115
10492
|
const getActiveCellID = (notebookTracker) => {
|
|
10493
|
+
const notebookPanel = notebookTracker.currentWidget;
|
|
10494
|
+
return getActiveCellIDInNotebookPanel(notebookPanel);
|
|
10495
|
+
};
|
|
10496
|
+
const getActiveCellIDInNotebookPanel = (notebookPanel) => {
|
|
10116
10497
|
var _a;
|
|
10117
|
-
return (_a =
|
|
10498
|
+
return (_a = getActiveCellInNotebookPanel(notebookPanel)) === null || _a === void 0 ? void 0 : _a.model.id;
|
|
10118
10499
|
};
|
|
10119
10500
|
const getActiveCellCode = (notebookTracker) => {
|
|
10120
10501
|
const activeCell = getActiveCell(notebookTracker);
|
|
10121
10502
|
return activeCell === null || activeCell === void 0 ? void 0 : activeCell.model.sharedModel.source;
|
|
10122
10503
|
};
|
|
10123
10504
|
const getCellCodeByID = (notebookTracker, codeCellID) => {
|
|
10124
|
-
const
|
|
10125
|
-
return
|
|
10126
|
-
};
|
|
10127
|
-
const getActiveCellOutput = async (notebookTracker) => {
|
|
10128
|
-
const activeCellID = getActiveCellID(notebookTracker);
|
|
10129
|
-
return getCellOutputByID(notebookTracker, activeCellID);
|
|
10505
|
+
const notebookPanel = notebookTracker.currentWidget;
|
|
10506
|
+
return getCellCodeByIDInNotebookPanel(notebookPanel, codeCellID);
|
|
10130
10507
|
};
|
|
10131
|
-
const
|
|
10132
|
-
|
|
10133
|
-
|
|
10134
|
-
// the agent scrolls to the cell.
|
|
10135
|
-
var _a, _b;
|
|
10136
|
-
if (codeCellID === undefined) {
|
|
10137
|
-
return undefined;
|
|
10138
|
-
}
|
|
10139
|
-
const notebook = (_a = notebookTracker.currentWidget) === null || _a === void 0 ? void 0 : _a.content;
|
|
10140
|
-
const cell = notebook === null || notebook === void 0 ? void 0 : notebook.widgets.find(cell => cell.model.id === codeCellID);
|
|
10141
|
-
if (!(cell instanceof _jupyterlab_cells__WEBPACK_IMPORTED_MODULE_1__.CodeCell)) {
|
|
10142
|
-
return undefined;
|
|
10143
|
-
}
|
|
10144
|
-
const outputNode = (_b = cell.outputArea) === null || _b === void 0 ? void 0 : _b.node;
|
|
10145
|
-
if (!outputNode)
|
|
10146
|
-
return undefined;
|
|
10147
|
-
// Find the top-level Jupyter image output div
|
|
10148
|
-
// so we can check if there is a base64 encoded image
|
|
10149
|
-
// already constructed for us.
|
|
10150
|
-
const renderedImageDiv = outputNode.querySelector('.jp-RenderedImage.jp-OutputArea-output');
|
|
10151
|
-
// If the image is the top-level output, then just use that instead
|
|
10152
|
-
// of capturing the entire output node. This is much faster and handles
|
|
10153
|
-
// matplotlib graphs.
|
|
10154
|
-
if (renderedImageDiv) {
|
|
10155
|
-
const img = renderedImageDiv.querySelector('img');
|
|
10156
|
-
if (img && img.src.startsWith('data:image')) {
|
|
10157
|
-
console.log('image found in top-level output');
|
|
10158
|
-
// Remove the data URL prefix
|
|
10159
|
-
// The img is initially in the format data:image/png;base64, <base64_data>
|
|
10160
|
-
// We want to return the base64 data.
|
|
10161
|
-
const base64 = img.src.split(',')[1];
|
|
10162
|
-
return base64;
|
|
10163
|
-
}
|
|
10164
|
-
}
|
|
10165
|
-
// Fallback: (optional) handle other output types, or use captureNode if needed
|
|
10166
|
-
// Previously, we used html2canvas to capture the entire output node. This would
|
|
10167
|
-
// give us the output even if it was html, svg, text, etc. However, starting around
|
|
10168
|
-
// Chrome release 138, html2canvas became untenably slow. https://issues.chromium.org/issues/429073017
|
|
10169
|
-
if (outputNode) {
|
|
10170
|
-
// If the AI requested, a cell output that we cannot provide, we just tell it
|
|
10171
|
-
// "Cell Output is present in notebook, but not available to share with the AI right now"
|
|
10172
|
-
return "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rNkrAoqAIqAIKAKKgCKgCCgCioAioAgoAoqAIqAIKAKKgCKgjliVAUVAEVAEFAFFQBFQBBQBRUARUAQUAUVAEVAEFAFFQBFQBJqMwHDjiP3888+jUPXq1cuMPPLI0TB5+NNPP5mff/5Zfrprz549zfjjj+9+640ioAgoAoqAItAKBP7++28zbNiwpKgxxhijFUWWWsZvv/1murq6TI8ePcxoo41Wat7NzKy7495MbDTv4ROBIvZzEUTKaGvt4r1IvUf0tL/++msCAf0C/YPS8I+A2AOMx0cdddRuVeHuzHu3Ano4YlZ13HD0MptclaY5YocOHWpef/118+qrrxruJ5tsMjP11FObxRZbzIwyyiilVuubb74xvXv3juZ5xRVXmEUWWSQaJg+POOIIc9FFF8lPd11ooYXM1Vdf7X43++aLL74wL7/8snnllVfMOOOMY+aee24zxxxzmO44CG82Vp2Y//TTT5+wtdlmm5n+/ft3IovKkyLgENhuu+3Mvffem+jlBx54wD3Xm85A4PLLLzf9+vVLmBk8eLCZccYZO4OxBrmg//z222+Tfuymm25qMFX7o3V33NuPoHLQbgReeukls/baaydsDBo0yKyxxhqpLBW1n1MzbiCgaFtrJ+8NVE+jRBB47733zPLLL5+EHH744aZPnz6RWPqoVQi0atwi9sBKK61kzjzzzFZVr5RyujPvPgA4lPHLCPHuxxtvPPlZdf3hhx/Mu+++W/U89mDKKac0E088cSyoY55l6ReLMK06rgh6I17a0h2xzALsv//+5vbbb4+iOeaYY5oTTjjBrLjiitHwPA+/++47s+CCC0aTNuKIHTBggLnggguq0rfKEcuqgEMOOcRceeWVVTzw4PzzzzfLLLNMNKyshy+++KIZMmRIkt1WW21lJpxwwrKybno+ncK7GDQbbrihGThwYNPrrQV0TwQ6RV633nprgwN20kknNY899lj3BLOFXN92223mjTfeMKOPPrrp27dv00u+7LLLkn6Bgu6++24z00wzNb3MMguQwQsTit3JEdspuGPXiF2ywgormHnmmafM19PRebW6rXU0GDmYe/755816662XpDzxxBOdUzaWVVH7OZZno8+KtrV28t5oHRuJNyLJu++kOOyww8wWW2zRCEQap0kI5Bm35JHXueaay/zyyy+m3Y7Y7sx7URG48847K2zX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";
|
|
10173
|
-
}
|
|
10174
|
-
return undefined;
|
|
10508
|
+
const getCellCodeByIDInNotebookPanel = (notebookPanel, codeCellID) => {
|
|
10509
|
+
const cell = getCellByIDInNotebookPanel(notebookPanel, codeCellID);
|
|
10510
|
+
return cell === null || cell === void 0 ? void 0 : cell.model.sharedModel.source;
|
|
10175
10511
|
};
|
|
10176
10512
|
const getCellIndexByID = (notebookTracker, cellID) => {
|
|
10177
|
-
|
|
10178
|
-
|
|
10513
|
+
const notebookPanel = notebookTracker.currentWidget;
|
|
10514
|
+
return getCellIndexByIDInNotebookPanel(notebookPanel, cellID);
|
|
10515
|
+
};
|
|
10516
|
+
const getCellIndexByIDInNotebookPanel = (notebookPanel, cellID) => {
|
|
10517
|
+
var _a;
|
|
10518
|
+
const cellList = (_a = notebookPanel === null || notebookPanel === void 0 ? void 0 : notebookPanel.model) === null || _a === void 0 ? void 0 : _a.cells;
|
|
10179
10519
|
if (cellList === undefined) {
|
|
10180
10520
|
return undefined;
|
|
10181
10521
|
}
|
|
@@ -10190,28 +10530,38 @@ const getCellIndexByID = (notebookTracker, cellID) => {
|
|
|
10190
10530
|
return undefined;
|
|
10191
10531
|
};
|
|
10192
10532
|
const setActiveCellByID = (notebookTracker, cellID) => {
|
|
10193
|
-
const cellIndex = getCellIndexByID(notebookTracker, cellID);
|
|
10194
10533
|
const notebookPanel = notebookTracker.currentWidget;
|
|
10195
|
-
|
|
10534
|
+
setActiveCellByIDInNotebookPanel(notebookPanel, cellID);
|
|
10535
|
+
};
|
|
10536
|
+
const setActiveCellByIDInNotebookPanel = (notebookPanel, cellID) => {
|
|
10537
|
+
const cellIndex = getCellIndexByIDInNotebookPanel(notebookPanel, cellID);
|
|
10538
|
+
if (cellIndex !== undefined && notebookPanel !== null) {
|
|
10196
10539
|
notebookPanel.content.activeCellIndex = cellIndex;
|
|
10197
10540
|
}
|
|
10198
10541
|
};
|
|
10199
10542
|
const writeCodeToCellByID = (notebookTracker, code, codeCellID) => {
|
|
10200
|
-
|
|
10201
|
-
|
|
10543
|
+
const notebookPanel = notebookTracker.currentWidget;
|
|
10544
|
+
writeCodeToCellByIDInNotebookPanel(notebookPanel, code, codeCellID);
|
|
10545
|
+
};
|
|
10546
|
+
const writeCodeToCellByIDInNotebookPanel = (notebookPanel, code, codeCellID) => {
|
|
10547
|
+
if (code === undefined || codeCellID === undefined) {
|
|
10202
10548
|
return;
|
|
10203
10549
|
}
|
|
10204
|
-
const codeMirrorValidCode = (0,
|
|
10205
|
-
const notebook =
|
|
10550
|
+
const codeMirrorValidCode = (0,_strings__WEBPACK_IMPORTED_MODULE_1__.removeMarkdownCodeFormatting)(code);
|
|
10551
|
+
const notebook = notebookPanel === null || notebookPanel === void 0 ? void 0 : notebookPanel.content;
|
|
10206
10552
|
const cell = notebook === null || notebook === void 0 ? void 0 : notebook.widgets.find(cell => cell.model.id === codeCellID);
|
|
10207
10553
|
if (cell) {
|
|
10208
10554
|
cell.model.sharedModel.source = codeMirrorValidCode;
|
|
10209
10555
|
}
|
|
10210
10556
|
};
|
|
10211
10557
|
const getAIOptimizedCells = (notebookTracker) => {
|
|
10212
|
-
|
|
10213
|
-
|
|
10214
|
-
|
|
10558
|
+
const notebookPanel = notebookTracker.currentWidget;
|
|
10559
|
+
return getAIOptimizedCellsInNotebookPanel(notebookPanel);
|
|
10560
|
+
};
|
|
10561
|
+
const getAIOptimizedCellsInNotebookPanel = (notebookPanel) => {
|
|
10562
|
+
var _a;
|
|
10563
|
+
const cellList = (_a = notebookPanel === null || notebookPanel === void 0 ? void 0 : notebookPanel.model) === null || _a === void 0 ? void 0 : _a.cells;
|
|
10564
|
+
if (cellList == undefined || cellList == null) {
|
|
10215
10565
|
return [];
|
|
10216
10566
|
}
|
|
10217
10567
|
// In order to get the cell index, we need to iterate over the cells and call the `get` method
|
|
@@ -10228,12 +10578,11 @@ const getAIOptimizedCells = (notebookTracker) => {
|
|
|
10228
10578
|
}
|
|
10229
10579
|
return cells;
|
|
10230
10580
|
};
|
|
10231
|
-
function createCodeCellAtIndexAndActivate(
|
|
10581
|
+
function createCodeCellAtIndexAndActivate(notebookPanel, index) {
|
|
10232
10582
|
/*
|
|
10233
10583
|
Create a new code cell at index and make it the active cell.
|
|
10234
10584
|
*/
|
|
10235
|
-
|
|
10236
|
-
const notebook = (_a = notebookTracker.currentWidget) === null || _a === void 0 ? void 0 : _a.content;
|
|
10585
|
+
const notebook = notebookPanel.content;
|
|
10237
10586
|
if (notebook === undefined) {
|
|
10238
10587
|
return;
|
|
10239
10588
|
}
|
|
@@ -10280,7 +10629,7 @@ const highlightCodeCell = (notebookTracker, codeCellID) => {
|
|
|
10280
10629
|
}, 500);
|
|
10281
10630
|
}
|
|
10282
10631
|
};
|
|
10283
|
-
const highlightLinesOfCodeInCodeCell = (
|
|
10632
|
+
const highlightLinesOfCodeInCodeCell = (notebookPanel, codeCellID, startLine, endLine) => {
|
|
10284
10633
|
/*
|
|
10285
10634
|
Briefly highlights a range of lines in a code cell, to draw the user's attention to it.
|
|
10286
10635
|
|
|
@@ -10293,7 +10642,7 @@ const highlightLinesOfCodeInCodeCell = (notebookTracker, codeCellID, startLine,
|
|
|
10293
10642
|
endLine: The 0-indexed end line number to highlight (inclusive).
|
|
10294
10643
|
*/
|
|
10295
10644
|
// Get the cell with the given ID
|
|
10296
|
-
const cell =
|
|
10645
|
+
const cell = getCellByIDInNotebookPanel(notebookPanel, codeCellID);
|
|
10297
10646
|
if (!cell) {
|
|
10298
10647
|
return;
|
|
10299
10648
|
}
|
|
@@ -10337,42 +10686,44 @@ const highlightLinesOfCodeInCodeCell = (notebookTracker, codeCellID, startLine,
|
|
|
10337
10686
|
});
|
|
10338
10687
|
}, 2000);
|
|
10339
10688
|
};
|
|
10340
|
-
const scrollToAndHighlightCell = (
|
|
10689
|
+
const scrollToAndHighlightCell = (notebookPanel, cellID, startLine, endLine, position = 'center') => {
|
|
10690
|
+
if (notebookPanel === null) {
|
|
10691
|
+
return;
|
|
10692
|
+
}
|
|
10341
10693
|
// Scroll to the cell
|
|
10342
|
-
scrollToCell(
|
|
10694
|
+
scrollToCell(notebookPanel, cellID, startLine, position);
|
|
10343
10695
|
// Wait for the scroll animation to complete before highlighting the lines
|
|
10344
10696
|
// The default smooth scroll takes about 300-500ms to complete
|
|
10345
10697
|
setTimeout(() => {
|
|
10346
10698
|
if (startLine !== undefined) {
|
|
10347
10699
|
// If no end line was provided, then we just highlight the single line
|
|
10348
10700
|
endLine = endLine || startLine;
|
|
10349
|
-
highlightLinesOfCodeInCodeCell(
|
|
10701
|
+
highlightLinesOfCodeInCodeCell(notebookPanel, cellID, startLine, endLine);
|
|
10350
10702
|
}
|
|
10351
10703
|
else {
|
|
10352
10704
|
// If no start line was provided, then we just highlight the entire cell
|
|
10353
|
-
highlightLinesOfCodeInCodeCell(
|
|
10705
|
+
highlightLinesOfCodeInCodeCell(notebookPanel, cellID, undefined, undefined);
|
|
10354
10706
|
}
|
|
10355
10707
|
}, 500);
|
|
10356
10708
|
};
|
|
10357
|
-
const scrollToCell = (
|
|
10358
|
-
var _a;
|
|
10709
|
+
const scrollToCell = (notebookPanel, cellID, startLine, position = 'center') => {
|
|
10359
10710
|
// Get the cell
|
|
10360
|
-
const cell =
|
|
10361
|
-
if (!cell) {
|
|
10711
|
+
const cell = getCellByIDInNotebookPanel(notebookPanel, cellID);
|
|
10712
|
+
if (!cell || notebookPanel === null) {
|
|
10362
10713
|
return;
|
|
10363
10714
|
}
|
|
10364
10715
|
// If line numbers are provided, figure out what position to scroll to
|
|
10365
10716
|
// based on the start line's position in the cell
|
|
10366
|
-
const code =
|
|
10717
|
+
const code = getCellCodeByIDInNotebookPanel(notebookPanel, cellID);
|
|
10367
10718
|
startLine = startLine || 0;
|
|
10368
10719
|
const relativeLinePosition = startLine / ((code === null || code === void 0 ? void 0 : code.split('\n').length) || 1);
|
|
10369
10720
|
// These positions must be of type BaseScrollToAlignment defined in @jupyterlab/ui-components
|
|
10370
10721
|
position = relativeLinePosition < 0.5 ? 'start' : 'end';
|
|
10371
10722
|
// If the cell is not the active cell, the scrolling does not work.
|
|
10372
10723
|
// It scrolls to the cell and then flashes back to the active cell.
|
|
10373
|
-
|
|
10724
|
+
setActiveCellByIDInNotebookPanel(notebookPanel, cellID);
|
|
10374
10725
|
// Use the new JupyterLab scrollToCell method instead of DOM node scrollIntoView
|
|
10375
|
-
void
|
|
10726
|
+
void notebookPanel.content.scrollToCell(cell, position);
|
|
10376
10727
|
};
|
|
10377
10728
|
|
|
10378
10729
|
|
|
@@ -10683,7 +11034,8 @@ const STRIPE_PAYMENT_LINK = "https://jl76z192i0.execute-api.us-east-1.amazonaws.
|
|
|
10683
11034
|
__webpack_require__.r(__webpack_exports__);
|
|
10684
11035
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
10685
11036
|
/* harmony export */ getOperatingSystem: () => (/* binding */ getOperatingSystem),
|
|
10686
|
-
/* harmony export */ isChromeBasedBrowser: () => (/* binding */ isChromeBasedBrowser)
|
|
11037
|
+
/* harmony export */ isChromeBasedBrowser: () => (/* binding */ isChromeBasedBrowser),
|
|
11038
|
+
/* harmony export */ isElectronBasedFrontend: () => (/* binding */ isElectronBasedFrontend)
|
|
10687
11039
|
/* harmony export */ });
|
|
10688
11040
|
/*
|
|
10689
11041
|
* Copyright (c) Saga Inc.
|
|
@@ -10700,6 +11052,14 @@ const getOperatingSystem = () => {
|
|
|
10700
11052
|
const isChromeBasedBrowser = () => {
|
|
10701
11053
|
return /chrome/i.test(navigator.userAgent) && !/edge|edg/i.test(navigator.userAgent);
|
|
10702
11054
|
};
|
|
11055
|
+
const isElectronBasedFrontend = () => {
|
|
11056
|
+
/*
|
|
11057
|
+
Checks if the user is using an Electron-based browser.
|
|
11058
|
+
This tells us that they are using Mito Desktop or JupyterLab Desktop.
|
|
11059
|
+
*/
|
|
11060
|
+
const userAgent = navigator.userAgent.toLowerCase();
|
|
11061
|
+
return userAgent.includes('electron');
|
|
11062
|
+
};
|
|
10703
11063
|
|
|
10704
11064
|
|
|
10705
11065
|
/***/ }),
|
|
@@ -11272,15 +11632,15 @@ class BaseWebsocketClient {
|
|
|
11272
11632
|
|
|
11273
11633
|
/***/ }),
|
|
11274
11634
|
|
|
11275
|
-
/***/ "./lib/websockets/
|
|
11276
|
-
|
|
11277
|
-
!*** ./lib/websockets/
|
|
11278
|
-
|
|
11635
|
+
/***/ "./lib/websockets/appDeploy/appDeployWebsocketClient.js":
|
|
11636
|
+
/*!**************************************************************!*\
|
|
11637
|
+
!*** ./lib/websockets/appDeploy/appDeployWebsocketClient.js ***!
|
|
11638
|
+
\**************************************************************/
|
|
11279
11639
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
11280
11640
|
|
|
11281
11641
|
__webpack_require__.r(__webpack_exports__);
|
|
11282
11642
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
11283
|
-
/* harmony export */
|
|
11643
|
+
/* harmony export */ AppDeployWebsocketClient: () => (/* binding */ AppDeployWebsocketClient)
|
|
11284
11644
|
/* harmony export */ });
|
|
11285
11645
|
/* harmony import */ var _BaseWebsocketClient__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../BaseWebsocketClient */ "./lib/websockets/BaseWebsocketClient.js");
|
|
11286
11646
|
/*
|
|
@@ -11293,7 +11653,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
11293
11653
|
*
|
|
11294
11654
|
* It communicates with the backend over a WebSocket for app building functionality.
|
|
11295
11655
|
*/
|
|
11296
|
-
class
|
|
11656
|
+
class AppDeployWebsocketClient extends _BaseWebsocketClient__WEBPACK_IMPORTED_MODULE_0__.BaseWebsocketClient {
|
|
11297
11657
|
/**
|
|
11298
11658
|
* Create a new app builder client.
|
|
11299
11659
|
*/
|
|
@@ -11302,7 +11662,7 @@ class AppBuilderWebsocketClient extends _BaseWebsocketClient__WEBPACK_IMPORTED_M
|
|
|
11302
11662
|
/**
|
|
11303
11663
|
* The service URL for the websocket endpoint.
|
|
11304
11664
|
*/
|
|
11305
|
-
this.SERVICE_URL = 'mito-ai/app-
|
|
11665
|
+
this.SERVICE_URL = 'mito-ai/app-deploy';
|
|
11306
11666
|
}
|
|
11307
11667
|
/**
|
|
11308
11668
|
* App builder messages stream.
|
|
@@ -11467,11 +11827,13 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
11467
11827
|
/* harmony export */ CompletionWebsocketClient: () => (/* binding */ CompletionWebsocketClient)
|
|
11468
11828
|
/* harmony export */ });
|
|
11469
11829
|
/* harmony import */ var _BaseWebsocketClient__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../BaseWebsocketClient */ "./lib/websockets/BaseWebsocketClient.js");
|
|
11830
|
+
/* harmony import */ var _utils_user__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/user */ "./lib/utils/user.js");
|
|
11470
11831
|
/*
|
|
11471
11832
|
* Copyright (c) Saga Inc.
|
|
11472
11833
|
* Distributed under the terms of the GNU Affero General Public License v3.0 License.
|
|
11473
11834
|
*/
|
|
11474
11835
|
|
|
11836
|
+
|
|
11475
11837
|
/**
|
|
11476
11838
|
* Mito AI completion client
|
|
11477
11839
|
*
|
|
@@ -11487,6 +11849,7 @@ class CompletionWebsocketClient extends _BaseWebsocketClient__WEBPACK_IMPORTED_M
|
|
|
11487
11849
|
* The service URL for the websocket endpoint.
|
|
11488
11850
|
*/
|
|
11489
11851
|
this.SERVICE_URL = 'mito-ai/completions';
|
|
11852
|
+
this.isElectron = (0,_utils_user__WEBPACK_IMPORTED_MODULE_1__.isElectronBasedFrontend)();
|
|
11490
11853
|
}
|
|
11491
11854
|
/**
|
|
11492
11855
|
* Completion chunk stream.
|
|
@@ -11558,6 +11921,17 @@ class CompletionWebsocketClient extends _BaseWebsocketClient__WEBPACK_IMPORTED_M
|
|
|
11558
11921
|
// default: /* no-op */
|
|
11559
11922
|
}
|
|
11560
11923
|
}
|
|
11924
|
+
// Override sendMessage to automatically add environment info
|
|
11925
|
+
sendMessage(message) {
|
|
11926
|
+
// Add environment info to all messages
|
|
11927
|
+
const messageWithEnvironment = {
|
|
11928
|
+
...message,
|
|
11929
|
+
environment: {
|
|
11930
|
+
isElectron: this.isElectron,
|
|
11931
|
+
}
|
|
11932
|
+
};
|
|
11933
|
+
return super.sendMessage(messageWithEnvironment);
|
|
11934
|
+
}
|
|
11561
11935
|
}
|
|
11562
11936
|
|
|
11563
11937
|
|
|
@@ -12758,6 +13132,8 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
|
|
|
12758
13132
|
margin: 0;
|
|
12759
13133
|
width: 100%;
|
|
12760
13134
|
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
|
|
13135
|
+
overflow-y: auto;
|
|
13136
|
+
max-height: 350px;
|
|
12761
13137
|
}
|
|
12762
13138
|
|
|
12763
13139
|
.chat-dropdown-item {
|
|
@@ -12842,7 +13218,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
|
|
|
12842
13218
|
.chat-dropdown-search-input::placeholder {
|
|
12843
13219
|
color: var(--jp-content-font-color3);
|
|
12844
13220
|
}
|
|
12845
|
-
`, "",{"version":3,"sources":["webpack://./style/ChatDropdown.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;EACE,4CAA4C;EAC5C,kBAAkB;EAClB,aAAa;EACb,YAAY;EACZ,kBAAkB;;EAElB,uBAAuB;EACvB,aAAa;EACb,sBAAsB;EACtB,WAAW;EACX,yCAAyC;EACzC,kBAAkB;AACpB;;AAEA;EACE,kBAAkB;EAClB,WAAW;EACX,kBAAkB;EAClB,yCAAyC;EACzC,qBAAqB;EACrB,UAAU;EACV,SAAS;EACT,WAAW;EACX,wCAAwC;
|
|
13221
|
+
`, "",{"version":3,"sources":["webpack://./style/ChatDropdown.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;EACE,4CAA4C;EAC5C,kBAAkB;EAClB,aAAa;EACb,YAAY;EACZ,kBAAkB;;EAElB,uBAAuB;EACvB,aAAa;EACb,sBAAsB;EACtB,WAAW;EACX,yCAAyC;EACzC,kBAAkB;AACpB;;AAEA;EACE,kBAAkB;EAClB,WAAW;EACX,kBAAkB;EAClB,yCAAyC;EACzC,qBAAqB;EACrB,UAAU;EACV,SAAS;EACT,WAAW;EACX,wCAAwC;EACxC,gBAAgB;EAChB,iBAAiB;AACnB;;AAEA;EACE,YAAY;EACZ,eAAe;EACf,aAAa;EACb,mBAAmB;EACnB,QAAQ;EACR,oCAAoC;EACpC,gBAAgB;EAChB,uBAAuB;EACvB,mBAAmB;AACrB;;AAEA;;EAEE,yCAAyC;AAC3C;;AAEA;EACE,6BAA6B;EAC7B,uCAAuC;EACvC,eAAe;EACf,WAAW;EACX,mBAAmB;EACnB,gBAAgB;EAChB,uBAAuB;AACzB;;AAEA;EACE,eAAe;EACf,aAAa;EACb,mBAAmB;EACnB,mBAAmB;EACnB,gBAAgB;EAChB,uBAAuB;AACzB;;AAEA;EACE,8BAA8B;EAC9B,eAAe;EACf,gBAAgB;EAChB,mBAAmB;EACnB,gBAAgB;EAChB,uBAAuB;AACzB;;AAEA;EACE,YAAY;EACZ,mBAAmB;AACrB;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,YAAY;EACZ,yCAAyC;EACzC,2BAA2B;EAC3B,4BAA4B;AAC9B;;AAEA;EACE,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EACf,qCAAqC;EACrC,yCAAyC;EACzC,oCAAoC;EACpC,aAAa;EACb,YAAY;EACZ,sBAAsB;AACxB;;AAEA;EACE,aAAa;EACb,YAAY;AACd;;AAEA;EACE,oCAAoC;AACtC","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n.chat-dropdown {\n /* Position the dropdown in the right place*/\n position: absolute;\n z-index: 9999;\n bottom: 100%;\n margin-bottom: 5px;\n\n /* Style the dropdown */\n display: flex;\n flex-direction: column;\n width: 100%;\n border: 1px solid var(--jp-border-color1);\n border-radius: 5px;\n}\n\n.chat-dropdown-list {\n position: relative;\n border: 0px;\n border-radius: 5px;\n background-color: var(--jp-layout-color1);\n list-style-type: none;\n padding: 0;\n margin: 0;\n width: 100%;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n overflow-y: auto;\n max-height: 350px;\n}\n\n.chat-dropdown-item {\n padding: 8px;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--jp-content-font-color1);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.chat-dropdown-item:hover,\n.chat-dropdown-item.selected {\n background-color: var(--jp-layout-color3);\n}\n\n.chat-dropdown-item-type {\n color: var(--jp-brand-color1);\n font-family: var(--jp-code-font-family);\n min-width: 35px;\n width: 35px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.chat-dropdown-item-name {\n font-size: 15px;\n display: flex;\n align-items: center;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.chat-dropdown-item-parent-df {\n color: var(--muted-text-color);\n font-size: 12px;\n margin-left: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.dropdown-item-disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.dropdown-item-disabled:hover {\n background-color: inherit;\n}\n\n.chat-dropdown-search {\n padding: 8px;\n background-color: var(--jp-layout-color1);\n border-top-left-radius: 5px;\n border-top-right-radius: 5px;\n}\n\n.chat-dropdown-search-input {\n width: 100%;\n padding: 6px 8px;\n border-radius: 3px;\n font-size: 12px;\n font-family: var(--jp-ui-font-family);\n background-color: var(--jp-layout-color1);\n color: var(--jp-content-font-color1);\n outline: none;\n border: none;\n box-sizing: border-box;\n}\n\n.chat-dropdown-search-input:focus {\n outline: none;\n border: none;\n}\n\n.chat-dropdown-search-input::placeholder {\n color: var(--jp-content-font-color3);\n}\n"],"sourceRoot":""}]);
|
|
12846
13222
|
// Exports
|
|
12847
13223
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
|
|
12848
13224
|
|
|
@@ -15460,6 +15836,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
|
|
|
15460
15836
|
align-items: center;
|
|
15461
15837
|
gap: 4px;
|
|
15462
15838
|
padding: 8px 10px;
|
|
15839
|
+
overflow-x: hidden;
|
|
15463
15840
|
}
|
|
15464
15841
|
|
|
15465
15842
|
/* Consistent spacing for all children of context container */
|
|
@@ -15478,14 +15855,15 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
|
|
|
15478
15855
|
|
|
15479
15856
|
font-size: 12px;
|
|
15480
15857
|
height: 20px;
|
|
15481
|
-
width:
|
|
15858
|
+
max-width: 100%;
|
|
15859
|
+
min-width: 0;
|
|
15482
15860
|
|
|
15483
15861
|
border: 1px solid var(--jp-border-color1);
|
|
15484
15862
|
cursor: pointer;
|
|
15863
|
+
}
|
|
15485
15864
|
|
|
15486
|
-
|
|
15487
|
-
|
|
15488
|
-
}
|
|
15865
|
+
.selected-context-container:hover {
|
|
15866
|
+
background-color: var(--jp-layout-color3);
|
|
15489
15867
|
}
|
|
15490
15868
|
|
|
15491
15869
|
.selected-context-container .rule-name {
|
|
@@ -15504,7 +15882,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
|
|
|
15504
15882
|
width: 12px;
|
|
15505
15883
|
max-height: 14px;
|
|
15506
15884
|
color: var(--jp-content-font-color3);
|
|
15507
|
-
}`, "",{"version":3,"sources":["webpack://./style/SelectedContextContainer.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;EACE,aAAa;EACb,eAAe;EACf,mBAAmB;EACnB,QAAQ;EACR,iBAAiB;
|
|
15885
|
+
}`, "",{"version":3,"sources":["webpack://./style/SelectedContextContainer.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;EACE,aAAa;EACb,eAAe;EACf,mBAAmB;EACnB,QAAQ;EACR,iBAAiB;EACjB,kBAAkB;AACpB;;AAEA,6DAA6D;AAC7D;EACE,WAAW;AACb;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,kBAAkB;EAClB,yCAAyC;EACzC,kBAAkB;EAClB,gBAAgB;EAChB,WAAW;;EAEX,eAAe;EACf,YAAY;EACZ,eAAe;EACf,YAAY;;EAEZ,yCAAyC;EACzC,eAAe;AACjB;;AAEA;EACE,yCAAyC;AAC3C;;AAEA;EACE,gBAAgB;EAChB,oCAAoC;EACpC,mBAAmB;EACnB,gBAAgB;EAChB,uBAAuB;EACvB,gBAAgB;AAClB;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,uBAAuB;EACvB,WAAW;EACX,gBAAgB;EAChB,oCAAoC;AACtC","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n.context-container {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 4px;\n padding: 8px 10px;\n overflow-x: hidden;\n}\n\n/* Consistent spacing for all children of context container */\n.context-container>* {\n margin: 2px;\n}\n\n.selected-context-container {\n display: flex;\n align-items: center;\n text-align: center;\n background-color: var(--jp-layout-color2);\n border-radius: 3px;\n padding: 4px 8px;\n margin: 2px;\n\n font-size: 12px;\n height: 20px;\n max-width: 100%;\n min-width: 0;\n\n border: 1px solid var(--jp-border-color1);\n cursor: pointer;\n}\n\n.selected-context-container:hover {\n background-color: var(--jp-layout-color3);\n}\n\n.selected-context-container .rule-name {\n margin-left: 6px;\n color: var(--jp-content-font-color1);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 200px;\n}\n\n.selected-context-container .icon {\n display: flex;\n flex-direction: column;\n justify-content: center;\n width: 12px;\n max-height: 14px;\n color: var(--jp-content-font-color3);\n}"],"sourceRoot":""}]);
|
|
15508
15886
|
// Exports
|
|
15509
15887
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
|
|
15510
15888
|
|
|
@@ -15627,6 +16005,65 @@ a {
|
|
|
15627
16005
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
|
|
15628
16006
|
|
|
15629
16007
|
|
|
16008
|
+
/***/ }),
|
|
16009
|
+
|
|
16010
|
+
/***/ "./node_modules/css-loader/dist/cjs.js!./style/StreamlitPreviewPlugin.css":
|
|
16011
|
+
/*!********************************************************************************!*\
|
|
16012
|
+
!*** ./node_modules/css-loader/dist/cjs.js!./style/StreamlitPreviewPlugin.css ***!
|
|
16013
|
+
\********************************************************************************/
|
|
16014
|
+
/***/ ((module, __webpack_exports__, __webpack_require__) => {
|
|
16015
|
+
|
|
16016
|
+
__webpack_require__.r(__webpack_exports__);
|
|
16017
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
16018
|
+
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
16019
|
+
/* harmony export */ });
|
|
16020
|
+
/* 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");
|
|
16021
|
+
/* 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__);
|
|
16022
|
+
/* 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");
|
|
16023
|
+
/* 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__);
|
|
16024
|
+
// Imports
|
|
16025
|
+
|
|
16026
|
+
|
|
16027
|
+
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()));
|
|
16028
|
+
// Module
|
|
16029
|
+
___CSS_LOADER_EXPORT___.push([module.id, `/*
|
|
16030
|
+
* Copyright (c) Saga Inc.
|
|
16031
|
+
* Distributed under the terms of the GNU Affero General Public License v3.0 License.
|
|
16032
|
+
*/
|
|
16033
|
+
|
|
16034
|
+
.mito-deploy-button {
|
|
16035
|
+
display: flex !important;
|
|
16036
|
+
align-items: center !important;
|
|
16037
|
+
gap: 6px !important;
|
|
16038
|
+
padding: 4px 8px !important;
|
|
16039
|
+
color: var(--jp-ui-font-color1) !important;
|
|
16040
|
+
background-color: var(--jp-layout-color2) !important;
|
|
16041
|
+
}
|
|
16042
|
+
|
|
16043
|
+
.mito-deploy-button:hover {
|
|
16044
|
+
background-color: var(--jp-layout-color3) !important;
|
|
16045
|
+
}
|
|
16046
|
+
|
|
16047
|
+
.mito-deploy-button .mito-ai-deploy-icon {
|
|
16048
|
+
display: flex !important;
|
|
16049
|
+
align-items: center !important;
|
|
16050
|
+
height: 10px !important;
|
|
16051
|
+
width: 10px !important;
|
|
16052
|
+
font-size: 12px !important;
|
|
16053
|
+
}
|
|
16054
|
+
|
|
16055
|
+
.mito-deploy-button::slotted(svg),
|
|
16056
|
+
.mito-deploy-button svg {
|
|
16057
|
+
width: 12px !important;
|
|
16058
|
+
height: 12px !important;
|
|
16059
|
+
max-width: 12px !important;
|
|
16060
|
+
max-height: 12px !important;
|
|
16061
|
+
margin-right: 4px !important;
|
|
16062
|
+
}`, "",{"version":3,"sources":["webpack://./style/StreamlitPreviewPlugin.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;IACI,wBAAwB;IACxB,8BAA8B;IAC9B,mBAAmB;IACnB,2BAA2B;IAC3B,0CAA0C;IAC1C,oDAAoD;AACxD;;AAEA;IACI,oDAAoD;AACxD;;AAEA;IACI,wBAAwB;IACxB,8BAA8B;IAC9B,uBAAuB;IACvB,sBAAsB;IACtB,0BAA0B;AAC9B;;AAEA;;IAEI,sBAAsB;IACtB,uBAAuB;IACvB,0BAA0B;IAC1B,2BAA2B;IAC3B,4BAA4B;AAChC","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n.mito-deploy-button {\n display: flex !important;\n align-items: center !important;\n gap: 6px !important;\n padding: 4px 8px !important;\n color: var(--jp-ui-font-color1) !important;\n background-color: var(--jp-layout-color2) !important;\n}\n\n.mito-deploy-button:hover {\n background-color: var(--jp-layout-color3) !important;\n}\n\n.mito-deploy-button .mito-ai-deploy-icon {\n display: flex !important;\n align-items: center !important;\n height: 10px !important;\n width: 10px !important;\n font-size: 12px !important;\n}\n\n.mito-deploy-button::slotted(svg),\n.mito-deploy-button svg {\n width: 12px !important;\n height: 12px !important;\n max-width: 12px !important;\n max-height: 12px !important;\n margin-right: 4px !important;\n}"],"sourceRoot":""}]);
|
|
16063
|
+
// Exports
|
|
16064
|
+
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
|
|
16065
|
+
|
|
16066
|
+
|
|
15630
16067
|
/***/ }),
|
|
15631
16068
|
|
|
15632
16069
|
/***/ "./node_modules/css-loader/dist/cjs.js!./style/TextAndIconButton.css":
|
|
@@ -15904,6 +16341,16 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
|
|
|
15904
16341
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
|
|
15905
16342
|
|
|
15906
16343
|
|
|
16344
|
+
/***/ }),
|
|
16345
|
+
|
|
16346
|
+
/***/ "./src/icons/App/DeployIcon.svg":
|
|
16347
|
+
/*!**************************************!*\
|
|
16348
|
+
!*** ./src/icons/App/DeployIcon.svg ***!
|
|
16349
|
+
\**************************************/
|
|
16350
|
+
/***/ ((module) => {
|
|
16351
|
+
|
|
16352
|
+
module.exports = "<svg width=\"1298\" height=\"1286\" viewBox=\"0 0 1298 1286\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g fill=\"currentColor\">\n <path d=\"M689.8 1007.36C644.524 1028.32 598.8 1047.93 552.76 1066.2L569.733 1285.77C638.785 1254.45 799 1157.24 926.04 893.279C871.201 922.393 816.352 948.581 769.52 970.929C743.254 983.518 716.602 995.58 689.806 1007.36L689.8 1007.36Z\" />\n <path d=\"M815.76 382.387C791.224 382.387 766.698 391.626 748.02 410.084C729.994 427.923 720.056 451.62 720.056 476.824C720.056 502.021 729.983 525.725 748.029 543.564C785.379 580.501 846.166 580.491 883.496 543.564C883.496 543.554 883.507 543.554 883.507 543.554C901.533 525.715 911.48 502.018 911.48 476.814C911.48 451.616 901.542 427.912 883.507 410.073C864.84 391.615 840.304 382.385 815.761 382.385L815.76 382.387Z\" />\n <path d=\"M349.453 462.747C364.328 432.924 380.213 401.747 397.229 370.408C130.563 495.835 32.0558 654.008 0.21582 722.461L220.562 739.112C243.614 682.175 268.75 625.664 296.073 569.925C312.661 535.961 330.401 499.685 349.448 462.748L349.453 462.747Z\" />\n <path d=\"M914.027 33.9479L1263.4 379.428C1280.5 311.901 1289.8 244.215 1294.2 180.815C1294.57 175.502 1294.94 170.2 1295.24 164.841C1295.7 156.815 1296.08 148.893 1296.39 141.029C1296.74 132.003 1297.02 122.915 1297.19 113.789C1297.32 107.513 1297.42 101.3 1297.45 95.1639C1297.53 82.6117 1297.5 70.0025 1297.27 57.2892C1297.21 54.4143 1297.14 51.6017 1297.07 48.7632C1296.68 33.4872 1296.14 18.1379 1295.28 2.66453C1193.44 -3.4552 1054.16 -1.29387 914.028 33.9565L914.027 33.9479Z\" />\n <path d=\"M1106.33 687.12C1113.39 679.36 1120.28 671.423 1126.96 663.235C1127.83 662.162 1128.78 661.11 1129.65 660.021C1136.68 651.261 1143.42 642.172 1150.03 632.933C1152.32 629.735 1154.57 626.506 1156.79 623.272C1161.92 615.824 1166.89 608.209 1171.74 600.46C1174.87 595.46 1177.89 590.408 1180.87 585.345C1184.4 579.345 1187.85 573.272 1191.24 567.105C1194.19 561.694 1197.13 556.282 1199.93 550.802C1202.02 546.729 1203.99 542.542 1206.02 538.401C1211.38 527.391 1216.53 516.287 1221.32 505.079C1222.07 503.318 1222.81 501.542 1223.56 499.766C1232.09 479.354 1239.68 458.667 1246.47 437.829L855.11 50.802C755.386 82.99 670.87 130.214 602.99 191.362C601.24 192.935 599.49 194.523 597.751 196.122C588.876 204.31 580.215 212.685 571.939 221.362C569.001 224.461 566.163 227.748 563.277 230.951C497.903 303.211 443.179 397.524 396.451 488.218C386.039 509.119 376.139 529.354 366.951 548.182C330.524 622.468 297.377 699.395 268.399 776.848C266.362 782.312 262.612 786.697 257.961 789.734C237.472 842.307 218.81 895.171 202.3 948.107L340.153 1084.43C395.164 1067.65 450.101 1048.65 504.7 1027.74C507.538 1024.61 510.887 1021.9 515.075 1020.37C566.689 1001.51 618.023 980.661 668.621 958.427C678.861 953.677 689.111 948.953 699.299 944.062C828.601 882.912 975.019 813.661 1075.33 718.903C1083.84 710.892 1092.02 702.491 1100.07 693.929C1102.19 691.669 1104.26 689.393 1106.34 687.122L1106.33 687.12ZM921.187 581.344C892.114 610.104 853.911 624.48 815.723 624.48C777.535 624.48 739.348 610.105 710.275 581.355C682.051 553.443 666.515 516.328 666.515 476.828C666.515 437.328 682.067 400.213 710.264 372.301C768.426 314.791 863.038 314.812 921.171 372.291C949.411 400.203 964.947 437.318 964.947 476.818C964.947 516.307 949.406 553.432 921.182 581.344L921.187 581.344Z\" />\n <path d=\"M147.088 1138.72L198.905 982.058L302.981 1084.64L147.088 1138.72Z\" />\n </g>\n</svg>\n";
|
|
16353
|
+
|
|
15907
16354
|
/***/ }),
|
|
15908
16355
|
|
|
15909
16356
|
/***/ "./src/icons/AppBuilderExcludeCellIcon.svg":
|
|
@@ -17530,6 +17977,60 @@ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js
|
|
|
17530
17977
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_SettingsWidget_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_SettingsWidget_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_SettingsWidget_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined);
|
|
17531
17978
|
|
|
17532
17979
|
|
|
17980
|
+
/***/ }),
|
|
17981
|
+
|
|
17982
|
+
/***/ "./style/StreamlitPreviewPlugin.css":
|
|
17983
|
+
/*!******************************************!*\
|
|
17984
|
+
!*** ./style/StreamlitPreviewPlugin.css ***!
|
|
17985
|
+
\******************************************/
|
|
17986
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
17987
|
+
|
|
17988
|
+
__webpack_require__.r(__webpack_exports__);
|
|
17989
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
17990
|
+
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
17991
|
+
/* harmony export */ });
|
|
17992
|
+
/* 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");
|
|
17993
|
+
/* 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__);
|
|
17994
|
+
/* 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");
|
|
17995
|
+
/* 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__);
|
|
17996
|
+
/* 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");
|
|
17997
|
+
/* 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__);
|
|
17998
|
+
/* 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");
|
|
17999
|
+
/* 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__);
|
|
18000
|
+
/* 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");
|
|
18001
|
+
/* 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__);
|
|
18002
|
+
/* 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");
|
|
18003
|
+
/* 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__);
|
|
18004
|
+
/* harmony import */ var _node_modules_css_loader_dist_cjs_js_StreamlitPreviewPlugin_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../node_modules/css-loader/dist/cjs.js!./StreamlitPreviewPlugin.css */ "./node_modules/css-loader/dist/cjs.js!./style/StreamlitPreviewPlugin.css");
|
|
18005
|
+
|
|
18006
|
+
|
|
18007
|
+
|
|
18008
|
+
|
|
18009
|
+
|
|
18010
|
+
|
|
18011
|
+
|
|
18012
|
+
|
|
18013
|
+
|
|
18014
|
+
|
|
18015
|
+
|
|
18016
|
+
var options = {};
|
|
18017
|
+
|
|
18018
|
+
options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default());
|
|
18019
|
+
options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default());
|
|
18020
|
+
|
|
18021
|
+
options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head");
|
|
18022
|
+
|
|
18023
|
+
options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());
|
|
18024
|
+
options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());
|
|
18025
|
+
|
|
18026
|
+
var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_StreamlitPreviewPlugin_css__WEBPACK_IMPORTED_MODULE_6__["default"], options);
|
|
18027
|
+
|
|
18028
|
+
|
|
18029
|
+
|
|
18030
|
+
|
|
18031
|
+
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_StreamlitPreviewPlugin_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_StreamlitPreviewPlugin_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_StreamlitPreviewPlugin_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined);
|
|
18032
|
+
|
|
18033
|
+
|
|
17533
18034
|
/***/ }),
|
|
17534
18035
|
|
|
17535
18036
|
/***/ "./style/TextAndIconButton.css":
|
|
@@ -17749,4 +18250,4 @@ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js
|
|
|
17749
18250
|
/***/ })
|
|
17750
18251
|
|
|
17751
18252
|
}]);
|
|
17752
|
-
//# sourceMappingURL=lib_index_js.
|
|
18253
|
+
//# sourceMappingURL=lib_index_js.cf2e3ad2797fbb53826b.js.map
|