From 2ec0b4118bd092a528a1171df6ae4ffcd7cfb33b Mon Sep 17 00:00:00 2001
From: Nate Sesti <sestinj@gmail.com>
Date: Tue, 4 Jul 2023 12:47:28 -0700
Subject: better control over context

---
 extension/react-app/src/components/PillButton.tsx | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

(limited to 'extension/react-app/src/components/PillButton.tsx')

diff --git a/extension/react-app/src/components/PillButton.tsx b/extension/react-app/src/components/PillButton.tsx
index 33451db5..55fe1ac6 100644
--- a/extension/react-app/src/components/PillButton.tsx
+++ b/extension/react-app/src/components/PillButton.tsx
@@ -1,6 +1,7 @@
 import { useState } from "react";
 import styled from "styled-components";
 import { defaultBorderRadius } from ".";
+import { XMark } from "@styled-icons/heroicons-outline";
 
 const Button = styled.button`
   border: none;
@@ -42,13 +43,12 @@ const PillButton = (props: PillButtonProps) => {
       <div
         style={{ display: "grid", gridTemplateColumns: "1fr auto", gap: "4px" }}
       >
-        <span>{props.title}</span>
         <span
           style={{
             cursor: "pointer",
             color: "red",
-            borderLeft: "1px solid black",
-            paddingLeft: "4px",
+            borderRight: "1px solid black",
+            paddingRight: "4px",
           }}
           hidden={!isHovered}
           onClick={() => {
@@ -56,8 +56,9 @@ const PillButton = (props: PillButtonProps) => {
             props.onHover?.(false);
           }}
         >
-          X
+          <XMark style={{ padding: "0px" }} size="1.2em" strokeWidth="2px" />
         </span>
+        <span>{props.title}</span>
       </div>
     </Button>
   );
-- 
cgit v1.2.3-70-g09d2


From 4b1d10f3bae1f1c80ecf74993f18f318c7b22b7f Mon Sep 17 00:00:00 2001
From: Nate Sesti <sestinj@gmail.com>
Date: Tue, 4 Jul 2023 13:43:09 -0700
Subject: many fixes

---
 continuedev/src/continuedev/core/autopilot.py             | 11 ++++++++---
 continuedev/src/continuedev/core/main.py                  |  7 +++----
 continuedev/src/continuedev/core/sdk.py                   | 13 ++++++++++++-
 continuedev/src/continuedev/steps/chat.py                 |  1 +
 extension/package-lock.json                               |  4 ++--
 extension/package.json                                    |  4 ++--
 extension/react-app/src/components/ComboBox.tsx           | 10 +++-------
 extension/react-app/src/components/PillButton.tsx         |  1 -
 extension/react-app/src/components/UserInputContainer.tsx |  6 ++++--
 extension/react-app/src/tabs/gui.tsx                      |  5 ++---
 10 files changed, 37 insertions(+), 25 deletions(-)

(limited to 'extension/react-app/src/components/PillButton.tsx')

diff --git a/continuedev/src/continuedev/core/autopilot.py b/continuedev/src/continuedev/core/autopilot.py
index 05e48f40..313ceded 100644
--- a/continuedev/src/continuedev/core/autopilot.py
+++ b/continuedev/src/continuedev/core/autopilot.py
@@ -144,9 +144,7 @@ class Autopilot(ContinueBaseModel):
     async def handle_highlighted_code(self, range_in_files: List[RangeInFileWithContents]):
         workspace_path = self.continue_sdk.ide.workspace_directory
         for rif in range_in_files:
-            rif.filepath = os.path.relpath(rif.filepath, workspace_path)
-            if rif.filepath.startswith(".."):
-                rif.filepath = os.path.basename(rif.filepath)
+            rif.filepath = os.path.basename(rif.filepath)
 
         # If current range overlaps with any others, delete them and only keep the new range
         new_ranges = []
@@ -156,6 +154,13 @@ class Autopilot(ContinueBaseModel):
                 if rif.filepath == new_rif.filepath and rif.range.overlaps_with(new_rif.range):
                     found_overlap = True
                     break
+
+                # Also don't allow multiple ranges in same file with same content. This is useless to the model, and avoids
+                # the bug where cmd+f causes repeated highlights
+                if rif.filepath == new_rif.filepath and rif.contents == new_rif.contents:
+                    found_overlap = True
+                    break
+
             if not found_overlap:
                 new_ranges.append(rif)
 
diff --git a/continuedev/src/continuedev/core/main.py b/continuedev/src/continuedev/core/main.py
index 9a6617f4..8bad09d1 100644
--- a/continuedev/src/continuedev/core/main.py
+++ b/continuedev/src/continuedev/core/main.py
@@ -107,11 +107,9 @@ class HistoryNode(ContinueBaseModel):
             return self.step.chat_context
         return self.step.chat_context + [
             ChatMessage(
-                role="function",
+                role="assistant",
                 name=self.step.__class__.__name__,
-                content=json.dumps({
-                    "description": self.step.description or "Function complete",
-                }),
+                content=self.step.description or f"Ran function {self.step.name}",
                 summary=f"Called function {self.step.name}"
             )]
 
@@ -200,6 +198,7 @@ class SlashCommandDescription(ContinueBaseModel):
     name: str
     description: str
 
+
 class FullState(ContinueBaseModel):
     """A full state of the program, including the history"""
     history: History
diff --git a/continuedev/src/continuedev/core/sdk.py b/continuedev/src/continuedev/core/sdk.py
index 988ac6b0..fe975b99 100644
--- a/continuedev/src/continuedev/core/sdk.py
+++ b/continuedev/src/continuedev/core/sdk.py
@@ -97,7 +97,18 @@ class ContinueSDK(AbstractContinueSDK):
     async def _ensure_absolute_path(self, path: str) -> str:
         if os.path.isabs(path):
             return path
-        return os.path.join(self.ide.workspace_directory, path)
+
+        # Else if in workspace
+        workspace_path = os.path.join(self.ide.workspace_directory, path)
+        if os.path.exists(workspace_path):
+            return workspace_path
+        else:
+            # Check if it matches any of the open files, then use that absolute path
+            open_files = await self.ide.getOpenFiles()
+            for open_file in open_files:
+                if os.path.basename(open_file) == os.path.basename(path):
+                    return open_file
+            raise Exception(f"Path {path} does not exist")
 
     async def run_step(self, step: Step) -> Coroutine[Observation, None, None]:
         return await self.__autopilot._run_singular_step(step)
diff --git a/continuedev/src/continuedev/steps/chat.py b/continuedev/src/continuedev/steps/chat.py
index 49dd98e4..db3f9d7f 100644
--- a/continuedev/src/continuedev/steps/chat.py
+++ b/continuedev/src/continuedev/steps/chat.py
@@ -149,6 +149,7 @@ class ChatWithFunctions(Step):
     name: str = "Input"
     manage_own_chat_context: bool = True
     description: str = ""
+    hide: bool = True
 
     async def run(self, sdk: ContinueSDK):
         await sdk.update_ui()
diff --git a/extension/package-lock.json b/extension/package-lock.json
index c9b8b757..94823004 100644
--- a/extension/package-lock.json
+++ b/extension/package-lock.json
@@ -1,12 +1,12 @@
 {
   "name": "continue",
-  "version": "0.0.106",
+  "version": "0.0.107",
   "lockfileVersion": 2,
   "requires": true,
   "packages": {
     "": {
       "name": "continue",
-      "version": "0.0.106",
+      "version": "0.0.107",
       "license": "Apache-2.0",
       "dependencies": {
         "@electron/rebuild": "^3.2.10",
diff --git a/extension/package.json b/extension/package.json
index 184d16e2..6434efc3 100644
--- a/extension/package.json
+++ b/extension/package.json
@@ -14,7 +14,7 @@
   "displayName": "Continue",
   "pricing": "Free",
   "description": "The open-source coding autopilot",
-  "version": "0.0.106",
+  "version": "0.0.107",
   "publisher": "Continue",
   "engines": {
     "vscode": "^1.67.0"
@@ -55,7 +55,7 @@
         },
         "continue.OPENAI_API_KEY": {
           "type": "password",
-          "default": "",
+          "default": null,
           "description": "The OpenAI API key to use for code generation."
         },
         "continue.dataSwitch": {
diff --git a/extension/react-app/src/components/ComboBox.tsx b/extension/react-app/src/components/ComboBox.tsx
index bdb8850d..3e1f3e16 100644
--- a/extension/react-app/src/components/ComboBox.tsx
+++ b/extension/react-app/src/components/ComboBox.tsx
@@ -279,13 +279,9 @@ const ComboBox = React.forwardRef((props: ComboBoxProps, ref) => {
         )}
         {highlightedCodeSections.map((section, idx) => (
           <PillButton
-            title={
-              hoveringButton
-                ? `${section.filepath} (${section.range.start.line + 1}-${
-                    section.range.end.line + 1
-                  })`
-                : section.filepath
-            }
+            title={`${section.filepath} (${section.range.start.line + 1}-${
+              section.range.end.line + 1
+            })`}
             onDelete={() => {
               if (props.deleteContextItems) {
                 props.deleteContextItems([idx]);
diff --git a/extension/react-app/src/components/PillButton.tsx b/extension/react-app/src/components/PillButton.tsx
index 55fe1ac6..2352c3ad 100644
--- a/extension/react-app/src/components/PillButton.tsx
+++ b/extension/react-app/src/components/PillButton.tsx
@@ -50,7 +50,6 @@ const PillButton = (props: PillButtonProps) => {
             borderRight: "1px solid black",
             paddingRight: "4px",
           }}
-          hidden={!isHovered}
           onClick={() => {
             props.onDelete?.();
             props.onHover?.(false);
diff --git a/extension/react-app/src/components/UserInputContainer.tsx b/extension/react-app/src/components/UserInputContainer.tsx
index 59453169..44fdba38 100644
--- a/extension/react-app/src/components/UserInputContainer.tsx
+++ b/extension/react-app/src/components/UserInputContainer.tsx
@@ -6,10 +6,12 @@ import HeaderButtonWithText from "./HeaderButtonWithText";
 import { Play, XMark } from "@styled-icons/heroicons-outline";
 import { RootStore } from "../redux/store";
 import { useSelector } from "react-redux";
+import { HistoryNode } from "../../../schema/HistoryNode";
 
 interface UserInputContainerProps {
   onDelete: () => void;
   children: string;
+  historyNode: HistoryNode;
 }
 
 const StyledDiv = styled.div`
@@ -26,7 +28,7 @@ const StyledDiv = styled.div`
 
 const UserInputContainer = (props: UserInputContainerProps) => {
   return (
-    <StyledDiv>
+    <StyledDiv hidden={props.historyNode.step.hide as any}>
       {props.children}
       <div style={{ marginLeft: "auto" }}>
         <HeaderButtonWithText
@@ -36,7 +38,7 @@ const UserInputContainer = (props: UserInputContainerProps) => {
           }}
           text="Delete"
         >
-          <XMark size="1.6em" onClick={props.onDelete} />
+          <XMark size="1.6em" />
         </HeaderButtonWithText>
       </div>
     </StyledDiv>
diff --git a/extension/react-app/src/tabs/gui.tsx b/extension/react-app/src/tabs/gui.tsx
index c2ff101a..8bfadc05 100644
--- a/extension/react-app/src/tabs/gui.tsx
+++ b/extension/react-app/src/tabs/gui.tsx
@@ -70,9 +70,7 @@ function GUI(props: GUIProps) {
   const [usingFastModel, setUsingFastModel] = useState(false);
   const [waitingForSteps, setWaitingForSteps] = useState(false);
   const [userInputQueue, setUserInputQueue] = useState<string[]>([]);
-  const [highlightedRanges, setHighlightedRanges] = useState([
-    { filepath: "abc.txt", range: { start: { line: 2 }, end: { line: 4 } } },
-  ]);
+  const [highlightedRanges, setHighlightedRanges] = useState([]);
   const [availableSlashCommands, setAvailableSlashCommands] = useState<
     { name: string; description: string }[]
   >([]);
@@ -296,6 +294,7 @@ function GUI(props: GUIProps) {
               onDelete={() => {
                 client?.deleteAtIndex(index);
               }}
+              historyNode={node}
             >
               {node.step.description as string}
             </UserInputContainer>
-- 
cgit v1.2.3-70-g09d2

