mito-ai 0.1.49__py3-none-any.whl → 0.1.51__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. mito_ai/_version.py +1 -1
  2. {mito_ai-0.1.49.data → mito_ai-0.1.51.data}/data/share/jupyter/labextensions/mito_ai/build_log.json +1 -1
  3. {mito_ai-0.1.49.data → mito_ai-0.1.51.data}/data/share/jupyter/labextensions/mito_ai/package.json +2 -2
  4. {mito_ai-0.1.49.data → mito_ai-0.1.51.data}/data/share/jupyter/labextensions/mito_ai/schemas/mito_ai/package.json.orig +1 -1
  5. mito_ai-0.1.49.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.8f1845da6bf2b128c049.js → mito_ai-0.1.51.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.c0b356ea4ace64bf1f03.js +261 -17
  6. mito_ai-0.1.51.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.c0b356ea4ace64bf1f03.js.map +1 -0
  7. mito_ai-0.1.49.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.8b24b5b3b93f95205b56.js → mito_ai-0.1.51.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.d467572621b790a8240e.js +3 -3
  8. mito_ai-0.1.49.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.8b24b5b3b93f95205b56.js.map → mito_ai-0.1.51.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.d467572621b790a8240e.js.map +1 -1
  9. {mito_ai-0.1.49.dist-info → mito_ai-0.1.51.dist-info}/METADATA +1 -1
  10. {mito_ai-0.1.49.dist-info → mito_ai-0.1.51.dist-info}/RECORD +34 -34
  11. mito_ai-0.1.49.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.8f1845da6bf2b128c049.js.map +0 -1
  12. {mito_ai-0.1.49.data → mito_ai-0.1.51.data}/data/etc/jupyter/jupyter_server_config.d/mito_ai.json +0 -0
  13. {mito_ai-0.1.49.data → mito_ai-0.1.51.data}/data/share/jupyter/labextensions/mito_ai/schemas/mito_ai/toolbar-buttons.json +0 -0
  14. {mito_ai-0.1.49.data → mito_ai-0.1.51.data}/data/share/jupyter/labextensions/mito_ai/static/node_modules_process_browser_js.4b128e94d31a81ebd209.js +0 -0
  15. {mito_ai-0.1.49.data → mito_ai-0.1.51.data}/data/share/jupyter/labextensions/mito_ai/static/node_modules_process_browser_js.4b128e94d31a81ebd209.js.map +0 -0
  16. {mito_ai-0.1.49.data → mito_ai-0.1.51.data}/data/share/jupyter/labextensions/mito_ai/static/style.js +0 -0
  17. {mito_ai-0.1.49.data → mito_ai-0.1.51.data}/data/share/jupyter/labextensions/mito_ai/static/style_index_js.5876024bb17dbd6a3ee6.js +0 -0
  18. {mito_ai-0.1.49.data → mito_ai-0.1.51.data}/data/share/jupyter/labextensions/mito_ai/static/style_index_js.5876024bb17dbd6a3ee6.js.map +0 -0
  19. {mito_ai-0.1.49.data → mito_ai-0.1.51.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
  20. {mito_ai-0.1.49.data → mito_ai-0.1.51.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
  21. {mito_ai-0.1.49.data → mito_ai-0.1.51.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
  22. {mito_ai-0.1.49.data → mito_ai-0.1.51.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
  23. {mito_ai-0.1.49.data → mito_ai-0.1.51.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_dist_esm_index_mjs.6bac1a8c4cc93f15f6b7.js +0 -0
  24. {mito_ai-0.1.49.data → mito_ai-0.1.51.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_dist_esm_index_mjs.6bac1a8c4cc93f15f6b7.js.map +0 -0
  25. {mito_ai-0.1.49.data → mito_ai-0.1.51.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_ui-react_dist_esm_index_mjs.4fcecd65bef9e9847609.js +0 -0
  26. {mito_ai-0.1.49.data → mito_ai-0.1.51.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_ui-react_dist_esm_index_mjs.4fcecd65bef9e9847609.js.map +0 -0
  27. {mito_ai-0.1.49.data → mito_ai-0.1.51.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
  28. {mito_ai-0.1.49.data → mito_ai-0.1.51.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
  29. {mito_ai-0.1.49.data → mito_ai-0.1.51.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_semver_index_js.3f6754ac5116d47de76b.js +0 -0
  30. {mito_ai-0.1.49.data → mito_ai-0.1.51.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_semver_index_js.3f6754ac5116d47de76b.js.map +0 -0
  31. {mito_ai-0.1.49.data → mito_ai-0.1.51.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_vscode-diff_dist_index_js.ea55f1f9346638aafbcf.js +0 -0
  32. {mito_ai-0.1.49.data → mito_ai-0.1.51.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_vscode-diff_dist_index_js.ea55f1f9346638aafbcf.js.map +0 -0
  33. {mito_ai-0.1.49.dist-info → mito_ai-0.1.51.dist-info}/WHEEL +0 -0
  34. {mito_ai-0.1.49.dist-info → mito_ai-0.1.51.dist-info}/entry_points.txt +0 -0
  35. {mito_ai-0.1.49.dist-info → mito_ai-0.1.51.dist-info}/licenses/LICENSE +0 -0
mito_ai/_version.py CHANGED
@@ -1,4 +1,4 @@
1
1
  # This file is auto-generated by Hatchling. As such, do not:
2
2
  # - modify
3
3
  # - track in version control e.g. be sure to add to .gitignore
4
- __version__ = VERSION = '0.1.49'
4
+ __version__ = VERSION = '0.1.51'
@@ -712,7 +712,7 @@
712
712
  "semver": {},
713
713
  "vscode-diff": {},
714
714
  "mito_ai": {
715
- "version": "0.1.49",
715
+ "version": "0.1.51",
716
716
  "singleton": true,
717
717
  "import": "/home/runner/work/mito/mito/mito-ai/lib/index.js"
718
718
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mito_ai",
3
- "version": "0.1.49",
3
+ "version": "0.1.51",
4
4
  "description": "AI chat for JupyterLab",
5
5
  "keywords": [
6
6
  "jupyter",
@@ -140,7 +140,7 @@
140
140
  "outputDir": "mito_ai/labextension",
141
141
  "schemaDir": "schema",
142
142
  "_build": {
143
- "load": "static/remoteEntry.8b24b5b3b93f95205b56.js",
143
+ "load": "static/remoteEntry.d467572621b790a8240e.js",
144
144
  "extension": "./extension",
145
145
  "style": "./style"
146
146
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mito_ai",
3
- "version": "0.1.49",
3
+ "version": "0.1.51",
4
4
  "description": "AI chat for JupyterLab",
5
5
  "keywords": [
6
6
  "jupyter",
@@ -653,9 +653,10 @@ __webpack_require__.r(__webpack_exports__);
653
653
  /* harmony export */ });
654
654
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
655
655
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
656
- /* harmony import */ var _utils_checkpoint__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../utils/checkpoint */ "./lib/utils/checkpoint.js");
656
+ /* harmony import */ var _utils_checkpoint__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../utils/checkpoint */ "./lib/utils/checkpoint.js");
657
657
  /* harmony import */ var _utils_scroll__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../utils/scroll */ "./lib/utils/scroll.js");
658
- /* harmony import */ var _components_TextButton__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../components/TextButton */ "./lib/components/TextButton.js");
658
+ /* harmony import */ var _components_TextButton__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../components/TextButton */ "./lib/components/TextButton.js");
659
+ /* harmony import */ var _style_AgentChangeControls_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../style/AgentChangeControls.css */ "./style/AgentChangeControls.css");
659
660
  /*
660
661
  * Copyright (c) Saga Inc.
661
662
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -664,10 +665,53 @@ __webpack_require__.r(__webpack_exports__);
664
665
 
665
666
 
666
667
 
667
- const AgentChangeControls = ({ reviewAgentChanges, app, notebookTracker, setHasCheckpoint, setDisplayedNextStepsIfAvailable, setShowRevertQuestionnaire, chatTaskpaneMessagesRef, acceptAllAICode, rejectAllAICode, setAgentReviewStatus, agentReviewStatus, }) => {
668
+
669
+ const AgentChangeControls = ({ reviewAgentChanges, app, notebookTracker, setHasCheckpoint, setDisplayedNextStepsIfAvailable, setShowRevertQuestionnaire, chatTaskpaneMessagesRef, acceptAllAICode, rejectAllAICode, getChangeCounts, getReviewProgress, setAgentReviewStatus, agentReviewStatus, }) => {
670
+ const [changeCounts, setChangeCounts] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);
671
+ const [reviewProgress, setReviewProgress] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);
672
+ // Update counts when review starts
673
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
674
+ if (agentReviewStatus === 'in-agent-code-review') {
675
+ const counts = getChangeCounts();
676
+ setChangeCounts(counts);
677
+ const progress = getReviewProgress();
678
+ setReviewProgress(progress);
679
+ }
680
+ else {
681
+ setChangeCounts(null);
682
+ setReviewProgress(null);
683
+ }
684
+ }, [agentReviewStatus, getChangeCounts, getReviewProgress]);
685
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
686
+ // Update progress periodically during review to reflect when cells are reviewed.
687
+ // We use polling here instead of event-driven updates because it's simpler and more robust -
688
+ // cells can be reviewed through multiple paths (toolbar buttons, keyboard shortcuts, etc.)
689
+ // and polling ensures we catch all updates without having to wire up triggers everywhere.
690
+ if (agentReviewStatus !== 'in-agent-code-review') {
691
+ return;
692
+ }
693
+ const updateProgress = () => {
694
+ const progress = getReviewProgress();
695
+ setReviewProgress(progress);
696
+ };
697
+ // Update immediately
698
+ updateProgress();
699
+ // Set up interval to update progress
700
+ const interval = setInterval(updateProgress, 500);
701
+ return () => clearInterval(interval);
702
+ }, [agentReviewStatus]);
668
703
  const handleReviewChanges = () => {
669
- setAgentReviewStatus('in-agent-code-review');
670
704
  reviewAgentChanges();
705
+ // reviewAgentChanges populates changedCellsRef synchronously, so we can get counts immediately
706
+ const counts = getChangeCounts();
707
+ // Only set status if there are actually changes to review
708
+ if (counts.total > 0) {
709
+ setAgentReviewStatus('in-agent-code-review');
710
+ // Scroll to show the new review controls after the UI updates
711
+ setTimeout(() => {
712
+ (0,_utils_scroll__WEBPACK_IMPORTED_MODULE_2__.scrollToDiv)(chatTaskpaneMessagesRef);
713
+ }, 0);
714
+ }
671
715
  };
672
716
  const handleAcceptAll = () => {
673
717
  acceptAllAICode();
@@ -678,7 +722,7 @@ const AgentChangeControls = ({ reviewAgentChanges, app, notebookTracker, setHasC
678
722
  setAgentReviewStatus('post-agent-code-review');
679
723
  };
680
724
  const handleUndoAll = async () => {
681
- await (0,_utils_checkpoint__WEBPACK_IMPORTED_MODULE_1__.restoreCheckpoint)(app, notebookTracker, setHasCheckpoint);
725
+ await (0,_utils_checkpoint__WEBPACK_IMPORTED_MODULE_3__.restoreCheckpoint)(app, notebookTracker, setHasCheckpoint);
682
726
  setDisplayedNextStepsIfAvailable(false);
683
727
  setHasCheckpoint(false);
684
728
  setAgentReviewStatus('post-agent-code-review');
@@ -687,19 +731,41 @@ const AgentChangeControls = ({ reviewAgentChanges, app, notebookTracker, setHasC
687
731
  };
688
732
  if (agentReviewStatus === 'pre-agent-code-review') {
689
733
  return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: 'message message-assistant-chat' },
690
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { style: { display: 'flex', gap: '8px', alignItems: 'center' } },
691
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_TextButton__WEBPACK_IMPORTED_MODULE_3__["default"], { text: "Review Changes", title: "Review the changes made by the agent", onClick: handleReviewChanges, variant: "gray", width: "fit-contents" }),
692
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_TextButton__WEBPACK_IMPORTED_MODULE_3__["default"], { text: "Undo All", title: "Undo all of the most recent changes made by the agent", onClick: handleUndoAll, variant: "gray", width: "fit-contents" }))));
734
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "agent-change-controls-buttons" },
735
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_TextButton__WEBPACK_IMPORTED_MODULE_4__["default"], { text: "Review Changes", title: "Review the changes made by the agent", onClick: handleReviewChanges, variant: "gray", width: "fit-contents" }),
736
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_TextButton__WEBPACK_IMPORTED_MODULE_4__["default"], { text: "Undo All", title: "Undo all of the most recent changes made by the agent", onClick: handleUndoAll, variant: "gray", width: "fit-contents" }))));
693
737
  }
694
738
  if (agentReviewStatus === 'in-agent-code-review') {
695
739
  return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: 'message message-assistant-chat' },
696
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { style: { display: 'flex', gap: '8px', alignItems: 'center' } },
697
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { className: "button-base button-green", title: "Accept all changes", onClick: handleAcceptAll }, "Accept all"),
698
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { className: "button-base button-red", onClick: handleRejectAll }, "Reject All"))));
740
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "agent-change-controls-container" },
741
+ changeCounts && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "agent-change-counts" },
742
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "agent-change-count" },
743
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "agent-change-count-number agent-change-count-added" },
744
+ changeCounts.added,
745
+ " \u00A0"),
746
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "agent-change-count-text" }, changeCounts.added === 1 ? 'cell added' : 'cells added')),
747
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "agent-change-count" },
748
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "agent-change-count-number agent-change-count-modified" },
749
+ changeCounts.modified,
750
+ " \u00A0"),
751
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "agent-change-count-text" }, changeCounts.modified === 1 ? 'cell modified' : 'cells modified')),
752
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "agent-change-count" },
753
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "agent-change-count-number agent-change-count-removed" },
754
+ changeCounts.removed,
755
+ " \u00A0"),
756
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "agent-change-count-text" }, changeCounts.removed === 1 ? 'cell removed' : 'cells removed')))),
757
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "agent-change-controls-buttons" },
758
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { className: "button-base button-green", title: "Accept all changes", onClick: handleAcceptAll }, "Accept all"),
759
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { className: "button-base button-red", onClick: handleRejectAll }, "Reject All")),
760
+ reviewProgress && reviewProgress.total > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "agent-review-progress" },
761
+ reviewProgress.reviewed,
762
+ "/",
763
+ reviewProgress.total,
764
+ " changes reviewed")))));
699
765
  }
700
766
  if (agentReviewStatus === 'post-agent-code-review') {
701
767
  return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: 'message message-assistant-chat' },
702
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_TextButton__WEBPACK_IMPORTED_MODULE_3__["default"], { text: "Undo All", onClick: handleUndoAll, variant: "gray", width: "fit-contents", title: "Undo all of the most recent changes made by the agent" })));
768
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_TextButton__WEBPACK_IMPORTED_MODULE_4__["default"], { text: "Undo All", onClick: handleUndoAll, variant: "gray", width: "fit-contents", title: "Undo all of the most recent changes made by the agent" })));
703
769
  }
704
770
  return null;
705
771
  };
@@ -2975,7 +3041,7 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, str
2975
3041
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "chat-loading-message" },
2976
3042
  "Thinking ",
2977
3043
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_LoadingDots__WEBPACK_IMPORTED_MODULE_37__["default"], null)),
2978
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_AgentReviewPanel__WEBPACK_IMPORTED_MODULE_38__["default"], { hasCheckpoint: hasCheckpoint, agentModeEnabled: agentModeEnabled, agentExecutionStatus: agentExecution.agentExecutionStatus, displayOptimizedChatHistoryLength: displayOptimizedChatHistory.length, showRevertQuestionnaire: showRevertQuestionnaire, reviewAgentChanges: agentReview.reviewAgentChanges, acceptAllAICode: agentReview.acceptAllAICode, rejectAllAICode: agentReview.rejectAllAICode, setHasCheckpoint: setHasCheckpoint, setDisplayedNextStepsIfAvailable: setDisplayedNextStepsIfAvailable, setShowRevertQuestionnaire: setShowRevertQuestionnaire, getDuplicateChatHistoryManager: getDuplicateChatHistoryManager, setChatHistoryManager: setChatHistoryManager, app: app, notebookTracker: notebookTracker, chatTaskpaneMessagesRef: chatTaskpaneMessagesRef, agentReviewStatus: agentReviewStatus, setAgentReviewStatus: setAgentReviewStatus })),
3044
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_AgentReviewPanel__WEBPACK_IMPORTED_MODULE_38__["default"], { hasCheckpoint: hasCheckpoint, agentModeEnabled: agentModeEnabled, agentExecutionStatus: agentExecution.agentExecutionStatus, displayOptimizedChatHistoryLength: displayOptimizedChatHistory.length, showRevertQuestionnaire: showRevertQuestionnaire, reviewAgentChanges: agentReview.reviewAgentChanges, acceptAllAICode: agentReview.acceptAllAICode, rejectAllAICode: agentReview.rejectAllAICode, getChangeCounts: agentReview.getChangeCounts, getReviewProgress: agentReview.getReviewProgress, setHasCheckpoint: setHasCheckpoint, setDisplayedNextStepsIfAvailable: setDisplayedNextStepsIfAvailable, setShowRevertQuestionnaire: setShowRevertQuestionnaire, getDuplicateChatHistoryManager: getDuplicateChatHistoryManager, setChatHistoryManager: setChatHistoryManager, app: app, notebookTracker: notebookTracker, chatTaskpaneMessagesRef: chatTaskpaneMessagesRef, agentReviewStatus: agentReviewStatus, setAgentReviewStatus: setAgentReviewStatus })),
2979
3045
  displayOptimizedChatHistory.length === 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "suggestions-container" },
2980
3046
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ChatMessage_ScrollableSuggestions__WEBPACK_IMPORTED_MODULE_39__["default"], { onSelectSuggestion: (prompt) => {
2981
3047
  if (agentModeEnabled) {
@@ -3500,12 +3566,12 @@ __webpack_require__.r(__webpack_exports__);
3500
3566
 
3501
3567
 
3502
3568
 
3503
- const AgentReviewPanel = ({ agentReviewStatus, setAgentReviewStatus, hasCheckpoint, agentModeEnabled, agentExecutionStatus, displayOptimizedChatHistoryLength, showRevertQuestionnaire, reviewAgentChanges, acceptAllAICode, rejectAllAICode, setHasCheckpoint, setDisplayedNextStepsIfAvailable, setShowRevertQuestionnaire, getDuplicateChatHistoryManager, setChatHistoryManager, app, notebookTracker, chatTaskpaneMessagesRef }) => {
3569
+ const AgentReviewPanel = ({ agentReviewStatus, setAgentReviewStatus, hasCheckpoint, agentModeEnabled, agentExecutionStatus, displayOptimizedChatHistoryLength, showRevertQuestionnaire, reviewAgentChanges, acceptAllAICode, rejectAllAICode, getChangeCounts, getReviewProgress, setHasCheckpoint, setDisplayedNextStepsIfAvailable, setShowRevertQuestionnaire, getDuplicateChatHistoryManager, setChatHistoryManager, app, notebookTracker, chatTaskpaneMessagesRef }) => {
3504
3570
  return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
3505
3571
  hasCheckpoint &&
3506
3572
  agentModeEnabled &&
3507
3573
  agentExecutionStatus === 'idle' &&
3508
- displayOptimizedChatHistoryLength > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ChatMessage_AgentChangeControls__WEBPACK_IMPORTED_MODULE_1__["default"], { reviewAgentChanges: reviewAgentChanges, app: app, notebookTracker: notebookTracker, setHasCheckpoint: setHasCheckpoint, setDisplayedNextStepsIfAvailable: setDisplayedNextStepsIfAvailable, setShowRevertQuestionnaire: setShowRevertQuestionnaire, chatTaskpaneMessagesRef: chatTaskpaneMessagesRef, acceptAllAICode: acceptAllAICode, rejectAllAICode: rejectAllAICode, agentReviewStatus: agentReviewStatus, setAgentReviewStatus: setAgentReviewStatus })),
3574
+ displayOptimizedChatHistoryLength > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ChatMessage_AgentChangeControls__WEBPACK_IMPORTED_MODULE_1__["default"], { reviewAgentChanges: reviewAgentChanges, app: app, notebookTracker: notebookTracker, setHasCheckpoint: setHasCheckpoint, setDisplayedNextStepsIfAvailable: setDisplayedNextStepsIfAvailable, setShowRevertQuestionnaire: setShowRevertQuestionnaire, chatTaskpaneMessagesRef: chatTaskpaneMessagesRef, acceptAllAICode: acceptAllAICode, rejectAllAICode: rejectAllAICode, getChangeCounts: getChangeCounts, getReviewProgress: getReviewProgress, agentReviewStatus: agentReviewStatus, setAgentReviewStatus: setAgentReviewStatus })),
3509
3575
  showRevertQuestionnaire && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ChatMessage_RevertQuestionnaire__WEBPACK_IMPORTED_MODULE_2__["default"], { onDestroy: () => setShowRevertQuestionnaire(false), getDuplicateChatHistoryManager: getDuplicateChatHistoryManager, setChatHistoryManager: setChatHistoryManager }))));
3510
3576
  };
3511
3577
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AgentReviewPanel);
@@ -3835,9 +3901,27 @@ const useAgentReview = ({ app, agentTargetNotebookPanelRef, codeDiffStripesCompa
3835
3901
  // Store notebook snapshots for comparison
3836
3902
  const notebookSnapshotPreAgentExecutionRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);
3837
3903
  const notebookSnapshotAfterAgentExecutionRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);
3904
+ // Store change counts (calculated in reviewAgentChanges)
3905
+ const changeCountsRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)({
3906
+ added: 0,
3907
+ modified: 0,
3908
+ removed: 0,
3909
+ total: 0
3910
+ });
3838
3911
  const hasUnreviewedChanges = (cellId) => {
3839
3912
  return changedCellsRef.current.some(cell => cell.cellId === cellId && !cell.reviewed);
3840
3913
  };
3914
+ const getChangeCounts = () => {
3915
+ return changeCountsRef.current;
3916
+ };
3917
+ const getReviewProgress = () => {
3918
+ const cells = changedCellsRef.current;
3919
+ const reviewed = cells.filter(cell => cell.reviewed).length;
3920
+ return {
3921
+ reviewed,
3922
+ total: cells.length
3923
+ };
3924
+ };
3841
3925
  const acceptAICodeInAgentMode = () => {
3842
3926
  var _a, _b;
3843
3927
  const activeCellId = (_b = (_a = agentTargetNotebookPanelRef === null || agentTargetNotebookPanelRef === void 0 ? void 0 : agentTargetNotebookPanelRef.current) === null || _a === void 0 ? void 0 : _a.content.activeCell) === null || _b === void 0 ? void 0 : _b.model.id;
@@ -3879,6 +3963,10 @@ const useAgentReview = ({ app, agentTargetNotebookPanelRef, codeDiffStripesCompa
3879
3963
  // Clear and populate the changed cells array
3880
3964
  const changedCells = [];
3881
3965
  changedCellsRef.current = changedCells;
3966
+ // Initialize counters
3967
+ let added = 0;
3968
+ let modified = 0;
3969
+ let removed = 0;
3882
3970
  // Compare each cell in the current snapshot with the original snapshot
3883
3971
  currentNotebookSnapshot.forEach(currentCell => {
3884
3972
  var _a;
@@ -3892,6 +3980,7 @@ const useAgentReview = ({ app, agentTargetNotebookPanelRef, codeDiffStripesCompa
3892
3980
  currentCode: currentCell.code,
3893
3981
  reviewed: false
3894
3982
  });
3983
+ modified++;
3895
3984
  }
3896
3985
  }
3897
3986
  else {
@@ -3902,6 +3991,7 @@ const useAgentReview = ({ app, agentTargetNotebookPanelRef, codeDiffStripesCompa
3902
3991
  currentCode: currentCell.code,
3903
3992
  reviewed: false
3904
3993
  });
3994
+ added++;
3905
3995
  }
3906
3996
  });
3907
3997
  // Check for cells that were removed (exist in original but not in current)
@@ -3915,8 +4005,16 @@ const useAgentReview = ({ app, agentTargetNotebookPanelRef, codeDiffStripesCompa
3915
4005
  currentCode: '',
3916
4006
  reviewed: false
3917
4007
  });
4008
+ removed++;
3918
4009
  }
3919
4010
  });
4011
+ // Update the change counts ref
4012
+ changeCountsRef.current = {
4013
+ added,
4014
+ modified,
4015
+ removed,
4016
+ total: changedCells.length
4017
+ };
3920
4018
  if (changedCells.length === 0) {
3921
4019
  console.log('No changes detected between snapshots');
3922
4020
  return;
@@ -3961,7 +4059,9 @@ const useAgentReview = ({ app, agentTargetNotebookPanelRef, codeDiffStripesCompa
3961
4059
  reviewAgentChanges,
3962
4060
  clearAgentReviewDiffs,
3963
4061
  setNotebookSnapshotPreAgentExecution,
3964
- hasUnreviewedChanges
4062
+ hasUnreviewedChanges,
4063
+ getChangeCounts,
4064
+ getReviewProgress
3965
4065
  };
3966
4066
  };
3967
4067
 
@@ -14312,6 +14412,96 @@ class CompletionWebsocketClient extends _BaseWebsocketClient__WEBPACK_IMPORTED_M
14312
14412
  }
14313
14413
 
14314
14414
 
14415
+ /***/ }),
14416
+
14417
+ /***/ "./node_modules/css-loader/dist/cjs.js!./style/AgentChangeControls.css":
14418
+ /*!*****************************************************************************!*\
14419
+ !*** ./node_modules/css-loader/dist/cjs.js!./style/AgentChangeControls.css ***!
14420
+ \*****************************************************************************/
14421
+ /***/ ((module, __webpack_exports__, __webpack_require__) => {
14422
+
14423
+ __webpack_require__.r(__webpack_exports__);
14424
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
14425
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
14426
+ /* harmony export */ });
14427
+ /* 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");
14428
+ /* 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__);
14429
+ /* 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");
14430
+ /* 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__);
14431
+ // Imports
14432
+
14433
+
14434
+ 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()));
14435
+ // Module
14436
+ ___CSS_LOADER_EXPORT___.push([module.id, `/*
14437
+ * Copyright (c) Saga Inc.
14438
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
14439
+ */
14440
+
14441
+ .agent-change-counts {
14442
+ font-size: 12px;
14443
+ margin-bottom: 4px;
14444
+ display: flex;
14445
+ flex-direction: column;
14446
+ gap: 8px;
14447
+ align-items: start;
14448
+ }
14449
+
14450
+ .agent-change-count {
14451
+ display: inline-flex;
14452
+ align-items: center;
14453
+ }
14454
+
14455
+ .agent-change-count-number {
14456
+ font-weight: 500;
14457
+ display: inline-block;
14458
+ min-width: 24px;
14459
+ text-align: left;
14460
+ }
14461
+
14462
+ .agent-change-count-text {
14463
+ color: var(--muted-text-color);
14464
+ }
14465
+
14466
+ .agent-change-count-added {
14467
+ color: var(--green-700);
14468
+ }
14469
+
14470
+ .agent-change-count-modified {
14471
+ color: var(--yellow-600);
14472
+ }
14473
+
14474
+ .agent-change-count-removed {
14475
+ color: var(--red-700);
14476
+ }
14477
+
14478
+ .agent-change-count-separator {
14479
+ color: var(--muted-text-color);
14480
+ margin: 0 4px;
14481
+ }
14482
+
14483
+ .agent-review-progress {
14484
+ font-size: 12px;
14485
+ color: var(--muted-text-color);
14486
+ }
14487
+
14488
+ .agent-change-controls-container {
14489
+ display: flex;
14490
+ flex-direction: column;
14491
+ gap: 8px;
14492
+ }
14493
+
14494
+ .agent-change-controls-buttons {
14495
+ display: flex;
14496
+ gap: 8px;
14497
+ align-items: center;
14498
+ }
14499
+
14500
+ `, "",{"version":3,"sources":["webpack://./style/AgentChangeControls.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;IACI,eAAe;IACf,kBAAkB;IAClB,aAAa;IACb,sBAAsB;IACtB,QAAQ;IACR,kBAAkB;AACtB;;AAEA;IACI,oBAAoB;IACpB,mBAAmB;AACvB;;AAEA;IACI,gBAAgB;IAChB,qBAAqB;IACrB,eAAe;IACf,gBAAgB;AACpB;;AAEA;IACI,8BAA8B;AAClC;;AAEA;IACI,uBAAuB;AAC3B;;AAEA;IACI,wBAAwB;AAC5B;;AAEA;IACI,qBAAqB;AACzB;;AAEA;IACI,8BAA8B;IAC9B,aAAa;AACjB;;AAEA;IACI,eAAe;IACf,8BAA8B;AAClC;;AAEA;IACI,aAAa;IACb,sBAAsB;IACtB,QAAQ;AACZ;;AAEA;IACI,aAAa;IACb,QAAQ;IACR,mBAAmB;AACvB","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n.agent-change-counts {\n font-size: 12px;\n margin-bottom: 4px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n align-items: start;\n}\n\n.agent-change-count {\n display: inline-flex;\n align-items: center;\n}\n\n.agent-change-count-number {\n font-weight: 500;\n display: inline-block;\n min-width: 24px;\n text-align: left;\n}\n\n.agent-change-count-text {\n color: var(--muted-text-color);\n}\n\n.agent-change-count-added {\n color: var(--green-700);\n}\n\n.agent-change-count-modified {\n color: var(--yellow-600);\n}\n\n.agent-change-count-removed {\n color: var(--red-700);\n}\n\n.agent-change-count-separator {\n color: var(--muted-text-color);\n margin: 0 4px;\n}\n\n.agent-review-progress {\n font-size: 12px;\n color: var(--muted-text-color);\n}\n\n.agent-change-controls-container {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.agent-change-controls-buttons {\n display: flex;\n gap: 8px;\n align-items: center;\n}\n\n"],"sourceRoot":""}]);
14501
+ // Exports
14502
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
14503
+
14504
+
14315
14505
  /***/ }),
14316
14506
 
14317
14507
  /***/ "./node_modules/css-loader/dist/cjs.js!./style/AgentComponentHeader.css":
@@ -19436,6 +19626,60 @@ module.exports = "<svg width=\"14\" height=\"14\" viewBox=\"0 0 10 10\" fill=\"n
19436
19626
 
19437
19627
  module.exports = "<svg width=\"33\" height=\"33\" viewBox=\"0 0 33 33\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g fill=\"currentColor\">\n <path d=\"M27.8204 5.193C24.7983 2.1709 20.7805 0.506836 16.5068 0.506836C7.78625 0.506836 0.506836 7.78625 0.506836 16.5068C0.506836 25.2274 7.78625 32.5068 16.5068 32.5068C25.2274 32.5068 32.5068 25.2274 32.5068 16.5068C32.5068 12.2332 30.8426 8.2151 27.8207 5.19329L27.8204 5.193ZM23.627 21.5962L21.7553 17.7403L23.4737 16.9062L24.3955 18.8053L24.4401 18.6209C24.608 17.9267 24.6932 17.2155 24.6932 16.5068C24.6932 11.6336 20.7854 7.66893 15.9819 7.66893C11.1788 7.66893 7.27066 11.6336 7.27066 16.5068C7.27066 21.3572 11.1414 25.3073 15.9137 25.3444V27.2546C10.0885 27.217 5.36066 22.41 5.36066 16.5067C5.36066 10.5804 10.1253 5.75855 15.9819 5.75855C21.8385 5.75855 26.6032 10.5801 26.6032 16.5067C26.6032 17.2903 26.5175 18.0775 26.3484 18.8468L26.315 18.999L27.9027 18.0676L28.8693 19.7151L24.9693 22.003C24.3869 22.4896 23.6689 21.9597 23.6268 21.5962L23.627 21.5962Z\"/>\n </g>\n</svg>\n";
19438
19628
 
19629
+ /***/ }),
19630
+
19631
+ /***/ "./style/AgentChangeControls.css":
19632
+ /*!***************************************!*\
19633
+ !*** ./style/AgentChangeControls.css ***!
19634
+ \***************************************/
19635
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
19636
+
19637
+ __webpack_require__.r(__webpack_exports__);
19638
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
19639
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
19640
+ /* harmony export */ });
19641
+ /* 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");
19642
+ /* 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__);
19643
+ /* 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");
19644
+ /* 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__);
19645
+ /* 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");
19646
+ /* 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__);
19647
+ /* 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");
19648
+ /* 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__);
19649
+ /* 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");
19650
+ /* 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__);
19651
+ /* 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");
19652
+ /* 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__);
19653
+ /* harmony import */ var _node_modules_css_loader_dist_cjs_js_AgentChangeControls_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../node_modules/css-loader/dist/cjs.js!./AgentChangeControls.css */ "./node_modules/css-loader/dist/cjs.js!./style/AgentChangeControls.css");
19654
+
19655
+
19656
+
19657
+
19658
+
19659
+
19660
+
19661
+
19662
+
19663
+
19664
+
19665
+ var options = {};
19666
+
19667
+ options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default());
19668
+ options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default());
19669
+
19670
+ options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head");
19671
+
19672
+ options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());
19673
+ options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());
19674
+
19675
+ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_AgentChangeControls_css__WEBPACK_IMPORTED_MODULE_6__["default"], options);
19676
+
19677
+
19678
+
19679
+
19680
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_AgentChangeControls_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_AgentChangeControls_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_AgentChangeControls_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined);
19681
+
19682
+
19439
19683
  /***/ }),
19440
19684
 
19441
19685
  /***/ "./style/AgentComponentHeader.css":
@@ -21599,4 +21843,4 @@ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js
21599
21843
  /***/ })
21600
21844
 
21601
21845
  }]);
21602
- //# sourceMappingURL=lib_index_js.8f1845da6bf2b128c049.js.map
21846
+ //# sourceMappingURL=lib_index_js.c0b356ea4ace64bf1f03.js.map