summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--continuedev/src/continuedev/core/context.py11
-rw-r--r--continuedev/src/continuedev/plugins/context_providers/file.py22
-rw-r--r--extension/manual-testing-sandbox/nested-folder/helloNested.py2
-rw-r--r--extension/react-app/src/App.tsx2
-rw-r--r--extension/react-app/src/components/ComboBox.tsx18
-rw-r--r--extension/react-app/src/redux/slices/configSlice.ts8
-rw-r--r--extension/react-app/src/redux/store.ts2
7 files changed, 44 insertions, 21 deletions
diff --git a/continuedev/src/continuedev/core/context.py b/continuedev/src/continuedev/core/context.py
index b1f68b50..48c14ed6 100644
--- a/continuedev/src/continuedev/core/context.py
+++ b/continuedev/src/continuedev/core/context.py
@@ -176,14 +176,21 @@ class ContextManager:
"id": item.description.id.to_string(),
"name": item.description.name,
"description": item.description.description,
- "content": item.content
+ "content": item.content,
+ "workspace_dir": workspace_dir,
}
for item in context_items
]
if len(documents) > 0:
try:
async with Client('http://localhost:7700') as search_client:
- await asyncio.wait_for(search_client.index(SEARCH_INDEX_NAME).add_documents(documents), timeout=5)
+ # The index is currently shared by all workspaces
+ globalSearchIndex = await search_client.get_index(SEARCH_INDEX_NAME)
+ await asyncio.wait_for(asyncio.gather(
+ # Ensure that the index has the correct filterable attributes
+ globalSearchIndex.update_filterable_attributes(["workspace_dir"]),
+ globalSearchIndex.add_documents(documents)
+ ), timeout=5)
except Exception as e:
logger.debug(f"Error loading meilisearch index: {e}")
diff --git a/continuedev/src/continuedev/plugins/context_providers/file.py b/continuedev/src/continuedev/plugins/context_providers/file.py
index 31aa5423..b40092af 100644
--- a/continuedev/src/continuedev/plugins/context_providers/file.py
+++ b/continuedev/src/continuedev/plugins/context_providers/file.py
@@ -54,33 +54,37 @@ class FileContextProvider(ContextProvider):
list(filter(lambda d: f"**/{d}", DEFAULT_IGNORE_DIRS))
async def provide_context_items(self, workspace_dir: str) -> List[ContextItem]:
- filepaths = []
+ absolute_filepaths: List[str] = []
for root, dir_names, file_names in os.walk(workspace_dir):
dir_names[:] = [d for d in dir_names if not any(
fnmatch(d, pattern) for pattern in self.ignore_patterns)]
for file_name in file_names:
- filepaths.append(os.path.join(root, file_name))
+ absolute_filepaths.append(os.path.join(root, file_name))
- if len(filepaths) > 1000:
+ if len(absolute_filepaths) > 1000:
break
- if len(filepaths) > 1000:
+ if len(absolute_filepaths) > 1000:
break
items = []
- for file in filepaths:
- content = get_file_contents(file)
+ for absolute_filepath in absolute_filepaths:
+ content = get_file_contents(absolute_filepath)
if content is None:
continue # no pun intended
+
+ relative_to_workspace = os.path.relpath(absolute_filepath, workspace_dir)
items.append(ContextItem(
content=content[:min(2000, len(content))],
description=ContextItemDescription(
- name=os.path.basename(file),
- description=file,
+ name=os.path.basename(absolute_filepath),
+ # We should add the full path to the ContextItem
+ # It warrants a data modeling discussion and has no immediate use case
+ description=relative_to_workspace,
id=ContextItemId(
provider_title=self.title,
- item_id=remove_meilisearch_disallowed_chars(file)
+ item_id=remove_meilisearch_disallowed_chars(absolute_filepath)
)
)
))
diff --git a/extension/manual-testing-sandbox/nested-folder/helloNested.py b/extension/manual-testing-sandbox/nested-folder/helloNested.py
new file mode 100644
index 00000000..195ad40c
--- /dev/null
+++ b/extension/manual-testing-sandbox/nested-folder/helloNested.py
@@ -0,0 +1,2 @@
+def main():
+ print("Hello Nested!")
diff --git a/extension/react-app/src/App.tsx b/extension/react-app/src/App.tsx
index 879373a0..05b322ff 100644
--- a/extension/react-app/src/App.tsx
+++ b/extension/react-app/src/App.tsx
@@ -11,6 +11,7 @@ import {
setSessionId,
setVscMediaUrl,
setDataSwitchOn,
+ setWorkspacePaths,
} from "./redux/slices/configSlice";
import { setHighlightedCode } from "./redux/slices/miscSlice";
import { postVscMessage } from "./vscode";
@@ -56,6 +57,7 @@ function App() {
dispatch(setSessionId(event.data.sessionId));
dispatch(setVscMediaUrl(event.data.vscMediaUrl));
dispatch(setDataSwitchOn(event.data.dataSwitchOn));
+ dispatch(setWorkspacePaths(event.data.workspacePaths));
break;
case "highlightedCode":
dispatch(setHighlightedCode(event.data.rangeInFile));
diff --git a/extension/react-app/src/components/ComboBox.tsx b/extension/react-app/src/components/ComboBox.tsx
index 472e1b14..c75f9ee6 100644
--- a/extension/react-app/src/components/ComboBox.tsx
+++ b/extension/react-app/src/components/ComboBox.tsx
@@ -24,7 +24,8 @@ import {
setBottomMessage,
setBottomMessageCloseTimeout,
} from "../redux/slices/uiStateSlice";
-import { useDispatch } from "react-redux";
+import { useDispatch, useSelector } from "react-redux";
+import { RootStore } from "../redux/store";
const SEARCH_INDEX_NAME = "continue_context_items";
@@ -136,6 +137,7 @@ const ComboBox = React.forwardRef((props: ComboBoxProps, ref) => {
const searchClient = new MeiliSearch({ host: "http://127.0.0.1:7700" });
const client = useContext(GUIClientContext);
const dispatch = useDispatch();
+ const workspacePaths = useSelector((state: RootStore) => state.config.workspacePaths);
const [history, setHistory] = React.useState<string[]>([]);
// The position of the current command you are typing now, so the one that will be appended to history once you press enter
@@ -181,10 +183,16 @@ const ComboBox = React.forwardRef((props: ComboBoxProps, ref) => {
// Get search results and return
setCurrentlyInContextQuery(true);
const providerAndQuery = segs[segs.length - 1] || "";
- const [provider, query] = providerAndQuery.split(" ");
+ // Only return context items from the current workspace - the index is currently shared between all sessions
+ const workspaceFilter =
+ workspacePaths && workspacePaths.length > 0
+ ? `workspace_dir IN [ ${workspacePaths.map((path) => `"${path}"`).join(", ")} ]`
+ : undefined;
searchClient
.index(SEARCH_INDEX_NAME)
- .search(providerAndQuery)
+ .search(providerAndQuery, {
+ filter: workspaceFilter,
+ })
.then((res) => {
setItems(
res.hits.map((hit) => {
@@ -410,7 +418,7 @@ const ComboBox = React.forwardRef((props: ComboBoxProps, ref) => {
// Prevent Downshift's default 'Enter' behavior.
(event.nativeEvent as any).preventDownshiftDefault = true;
- if (props.onEnter) props.onEnter(event);
+ if (props.onEnter) {props.onEnter(event);}
setCurrentlyInContextQuery(false);
} else if (event.key === "Tab" && items.length > 0) {
downshiftProps.setInputValue(items[0].name);
@@ -423,7 +431,7 @@ const ComboBox = React.forwardRef((props: ComboBoxProps, ref) => {
) {
(event.nativeEvent as any).preventDownshiftDefault = true;
} else if (event.key === "ArrowUp") {
- if (positionInHistory == 0) return;
+ if (positionInHistory == 0) {return;}
else if (
positionInHistory == history.length &&
(history.length === 0 ||
diff --git a/extension/react-app/src/redux/slices/configSlice.ts b/extension/react-app/src/redux/slices/configSlice.ts
index 59c76066..9cf5402f 100644
--- a/extension/react-app/src/redux/slices/configSlice.ts
+++ b/extension/react-app/src/redux/slices/configSlice.ts
@@ -7,13 +7,13 @@ export const configSlice = createSlice({
apiUrl: "http://localhost:65432",
} as RootStore["config"],
reducers: {
- setWorkspacePath: (
+ setWorkspacePaths: (
state: RootStore["config"],
- action: { type: string; payload: string }
+ action: { type: string; payload: string[] }
) => {
return {
...state,
- workspacePath: action.payload,
+ workspacePaths: action.payload,
};
},
setApiUrl: (
@@ -57,7 +57,7 @@ export const configSlice = createSlice({
export const {
setVscMachineId,
setApiUrl,
- setWorkspacePath,
+ setWorkspacePaths,
setSessionId,
setVscMediaUrl,
setDataSwitchOn,
diff --git a/extension/react-app/src/redux/store.ts b/extension/react-app/src/redux/store.ts
index 59339060..bd6759e4 100644
--- a/extension/react-app/src/redux/store.ts
+++ b/extension/react-app/src/redux/store.ts
@@ -14,7 +14,7 @@ export interface ChatMessage {
export interface RootStore {
config: {
- workspacePath: string | undefined;
+ workspacePaths: string[] | undefined;
apiUrl: string;
vscMachineId: string | undefined;
sessionId: string | undefined;