summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--continuedev/src/continuedev/core/sdk.py4
-rw-r--r--continuedev/src/continuedev/libs/util/telemetry.py12
-rw-r--r--continuedev/src/continuedev/server/ide.py9
-rw-r--r--continuedev/src/continuedev/server/ide_protocol.py3
-rw-r--r--extension/react-app/src/components/ComboBox.tsx8
-rw-r--r--extension/src/continueIdeClient.ts7
6 files changed, 35 insertions, 8 deletions
diff --git a/continuedev/src/continuedev/core/sdk.py b/continuedev/src/continuedev/core/sdk.py
index c3b50375..7090283f 100644
--- a/continuedev/src/continuedev/core/sdk.py
+++ b/continuedev/src/continuedev/core/sdk.py
@@ -115,7 +115,9 @@ class ContinueSDK(AbstractContinueSDK):
# )
# When the config is loaded, setup posthog logger
- posthog_logger.setup(sdk.ide.unique_id, sdk.config.allow_anonymous_telemetry)
+ posthog_logger.setup(
+ sdk.ide.unique_id, sdk.config.allow_anonymous_telemetry, sdk.ide.ide_info
+ )
dev_data_logger.setup(sdk.config.user_token, sdk.config.data_server_url)
return sdk
diff --git a/continuedev/src/continuedev/libs/util/telemetry.py b/continuedev/src/continuedev/libs/util/telemetry.py
index 10cf7ba8..1772fe20 100644
--- a/continuedev/src/continuedev/libs/util/telemetry.py
+++ b/continuedev/src/continuedev/libs/util/telemetry.py
@@ -1,6 +1,6 @@
import os
import socket
-from typing import Any
+from typing import Any, Dict, Optional
from dotenv import load_dotenv
@@ -26,14 +26,18 @@ def is_connected():
class PostHogLogger:
unique_id: str = "NO_UNIQUE_ID"
allow_anonymous_telemetry: bool = False
+ ide_info: Optional[Dict] = None
posthog = None
def __init__(self, api_key: str):
self.api_key = api_key
- def setup(self, unique_id: str, allow_anonymous_telemetry: bool):
+ def setup(
+ self, unique_id: str, allow_anonymous_telemetry: bool, ide_info: Optional[Dict]
+ ):
self.unique_id = unique_id or "NO_UNIQUE_ID"
self.allow_anonymous_telemetry = allow_anonymous_telemetry or False
+ self.ide_info = ide_info
# Capture initial event
self.capture_event("session_start", {"os": os.name})
@@ -81,6 +85,10 @@ class PostHogLogger:
# Add operating system
event_properties["os"] = os.name
+ if self.ide_info:
+ event_properties["ide_name"] = self.ide_info.get("name", None)
+ event_properties["ide_version"] = self.ide_info.get("version", None)
+ event_properties["ide_remote_name"] = self.ide_info.get("remoteName", None)
# Send event to PostHog
if self.posthog is None:
diff --git a/continuedev/src/continuedev/server/ide.py b/continuedev/src/continuedev/server/ide.py
index 1709503b..6a4dc738 100644
--- a/continuedev/src/continuedev/server/ide.py
+++ b/continuedev/src/continuedev/server/ide.py
@@ -4,7 +4,7 @@ import json
import os
import traceback
import uuid
-from typing import Any, Callable, Coroutine, List, Optional, Type, TypeVar, Union
+from typing import Any, Callable, Coroutine, Dict, List, Optional, Type, TypeVar, Union
import nest_asyncio
from fastapi import APIRouter, WebSocket
@@ -154,6 +154,8 @@ class IdeProtocolServer(AbstractIdeProtocolServer):
sub_queue: AsyncSubscriptionQueue = AsyncSubscriptionQueue()
session_id: Union[str, None] = None
+ ide_info: Optional[Dict] = None
+
def __init__(self, session_manager: SessionManager, websocket: WebSocket):
self.websocket = websocket
self.session_manager = session_manager
@@ -165,6 +167,7 @@ class IdeProtocolServer(AbstractIdeProtocolServer):
self.session_id = session_id
await self._send_json("workspaceDirectory", {})
await self._send_json("uniqueId", {})
+ await self._send_json("ide", {})
other_msgs = []
while True:
msg_string = await self.websocket.receive_text()
@@ -178,6 +181,8 @@ class IdeProtocolServer(AbstractIdeProtocolServer):
self.workspace_directory = data["workspaceDirectory"]
elif message_type == "uniqueId":
self.unique_id = data["uniqueId"]
+ elif message_type == "ide":
+ self.ide_info = data
else:
other_msgs.append(msg_string)
@@ -269,6 +274,8 @@ class IdeProtocolServer(AbstractIdeProtocolServer):
self.workspace_directory = data["workspaceDirectory"]
elif message_type == "uniqueId":
self.unique_id = data["uniqueId"]
+ elif message_type == "ide":
+ self.ide_info = data
elif message_type == "filesCreated":
self.onFilesCreated(data["filepaths"])
elif message_type == "filesDeleted":
diff --git a/continuedev/src/continuedev/server/ide_protocol.py b/continuedev/src/continuedev/server/ide_protocol.py
index 015da767..832dd338 100644
--- a/continuedev/src/continuedev/server/ide_protocol.py
+++ b/continuedev/src/continuedev/server/ide_protocol.py
@@ -1,5 +1,5 @@
from abc import ABC, abstractmethod
-from typing import Any, Callable, List, Optional, Union
+from typing import Any, Callable, Dict, List, Optional, Union
from fastapi import WebSocket
@@ -10,6 +10,7 @@ from ..models.filesystem_edit import EditDiff, FileEdit, FileSystemEdit
class AbstractIdeProtocolServer(ABC):
websocket: WebSocket
session_id: Union[str, None]
+ ide_info: Optional[Dict] = None
@abstractmethod
async def handle_json(self, data: Any):
diff --git a/extension/react-app/src/components/ComboBox.tsx b/extension/react-app/src/components/ComboBox.tsx
index 12cd91a2..c08c05de 100644
--- a/extension/react-app/src/components/ComboBox.tsx
+++ b/extension/react-app/src/components/ComboBox.tsx
@@ -439,9 +439,11 @@ const ComboBox = React.forwardRef((props: ComboBoxProps, ref) => {
// Handle slash commands
dispatch(setTakenActionTrue(null));
setItems(
- availableSlashCommands?.filter((slashCommand) =>
- slashCommand.name.toLowerCase().startsWith(inputValue.toLowerCase())
- ) || []
+ availableSlashCommands?.filter((slashCommand) => {
+ const sc = slashCommand.name.toLowerCase();
+ const iv = inputValue.toLowerCase();
+ return sc.startsWith(iv) && sc !== iv;
+ }) || []
);
},
[
diff --git a/extension/src/continueIdeClient.ts b/extension/src/continueIdeClient.ts
index f49f0936..c25dff50 100644
--- a/extension/src/continueIdeClient.ts
+++ b/extension/src/continueIdeClient.ts
@@ -268,6 +268,13 @@ class IdeProtocolClient {
uniqueId: this.getUniqueId(),
});
break;
+ case "ide":
+ messenger.send("ide", {
+ name: "vscode",
+ version: vscode.version,
+ remoteName: vscode.env.remoteName,
+ });
+ break;
case "fileExists":
messenger.send("fileExists", {
exists: await this.fileExists(data.filepath),