diff options
-rw-r--r-- | continuedev/src/continuedev/core/sdk.py | 4 | ||||
-rw-r--r-- | continuedev/src/continuedev/libs/util/telemetry.py | 12 | ||||
-rw-r--r-- | continuedev/src/continuedev/server/ide.py | 9 | ||||
-rw-r--r-- | continuedev/src/continuedev/server/ide_protocol.py | 3 | ||||
-rw-r--r-- | extension/react-app/src/components/ComboBox.tsx | 8 | ||||
-rw-r--r-- | extension/src/continueIdeClient.ts | 7 |
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), |