summaryrefslogtreecommitdiff
path: root/continuedev
diff options
context:
space:
mode:
Diffstat (limited to 'continuedev')
-rw-r--r--continuedev/src/continuedev/libs/constants/default_config.py6
-rw-r--r--continuedev/src/continuedev/plugins/context_providers/url.py34
-rw-r--r--continuedev/src/continuedev/plugins/steps/share_session.py51
3 files changed, 86 insertions, 5 deletions
diff --git a/continuedev/src/continuedev/libs/constants/default_config.py b/continuedev/src/continuedev/libs/constants/default_config.py
index dbd2c8eb..2201df33 100644
--- a/continuedev/src/continuedev/libs/constants/default_config.py
+++ b/continuedev/src/continuedev/libs/constants/default_config.py
@@ -20,6 +20,7 @@ from continuedev.src.continuedev.plugins.steps.open_config import OpenConfigStep
from continuedev.src.continuedev.plugins.steps.clear_history import ClearHistoryStep
from continuedev.src.continuedev.plugins.steps.feedback import FeedbackStep
from continuedev.src.continuedev.plugins.steps.comment_code import CommentCodeStep
+from continuedev.src.continuedev.plugins.steps.share_session import ShareSessionStep
from continuedev.src.continuedev.plugins.steps.main import EditHighlightedCodeStep
from continuedev.src.continuedev.plugins.context_providers.search import SearchContextProvider
from continuedev.src.continuedev.plugins.context_providers.diff import DiffContextProvider
@@ -108,6 +109,11 @@ config = ContinueConfig(
name="clear",
description="Clear step history",
step=ClearHistoryStep,
+ ),
+ SlashCommand(
+ name="share",
+ description="Download and share the session transcript",
+ step=ShareSessionStep,
)
],
diff --git a/continuedev/src/continuedev/plugins/context_providers/url.py b/continuedev/src/continuedev/plugins/context_providers/url.py
index 9274d84a..32c1d69c 100644
--- a/continuedev/src/continuedev/plugins/context_providers/url.py
+++ b/continuedev/src/continuedev/plugins/context_providers/url.py
@@ -1,4 +1,4 @@
-from typing import List
+from typing import List, Optional
from .util import remove_meilisearch_disallowed_chars
from ...core.main import ContextItem, ContextItemDescription, ContextItemId
@@ -8,9 +8,25 @@ from ...core.context import ContextProvider
class URLContextProvider(ContextProvider):
title = "url"
+ url: Optional[str] = None
+ display_name: Optional[str] = None
URL_CONTEXT_ITEM_ID = "url"
@property
+ def optional_url_item_id(self) -> str:
+ return remove_meilisearch_disallowed_chars(self.url)
+
+ @property
+ def optional_url_item(self) -> ContextItem:
+ cp = self.BASE_CONTEXT_ITEM.copy()
+ if self.display_name:
+ cp.description.name = self.display_name
+ cp.description.description = f"Contents of {self.url}"
+ cp.description.id.item_id = self.optional_url_item_id
+
+ return cp
+
+ @property
def BASE_CONTEXT_ITEM(self):
return ContextItem(
content="",
@@ -33,14 +49,22 @@ class URLContextProvider(ContextProvider):
return soup.get_text()
async def provide_context_items(self, workspace_dir: str) -> List[ContextItem]:
- return [self.BASE_CONTEXT_ITEM]
+ items = [self.BASE_CONTEXT_ITEM]
+ if self.url:
+ items.append(self.optional_url_item)
+
+ return items
async def get_item(self, id: ContextItemId, query: str) -> ContextItem:
+ if id.item_id == self.optional_url_item_id:
+ item = self.optional_url_item
+ item.content = self._get_url_text_contents(self.url)
+ return item
+
if not id.item_id == self.URL_CONTEXT_ITEM_ID:
raise Exception("Invalid item id")
- query = query.lstrip("url ")
- url = query.strip()
+ url = query.lstrip("url ").strip()
content = self._get_url_text_contents(url)
ctx_item = self.BASE_CONTEXT_ITEM.copy()
@@ -48,5 +72,5 @@ class URLContextProvider(ContextProvider):
ctx_item.description.name = url.replace(
"https://", "").replace("http://", "")
ctx_item.description.id.item_id = remove_meilisearch_disallowed_chars(
- query)
+ url)
return ctx_item
diff --git a/continuedev/src/continuedev/plugins/steps/share_session.py b/continuedev/src/continuedev/plugins/steps/share_session.py
new file mode 100644
index 00000000..de8659bd
--- /dev/null
+++ b/continuedev/src/continuedev/plugins/steps/share_session.py
@@ -0,0 +1,51 @@
+import json
+import os
+import time
+from typing import Optional
+
+
+from ...core.sdk import ContinueSDK
+from ...core.main import Step, FullState
+from ...libs.util.paths import getSessionFilePath, getGlobalFolderPath
+from ...server.session_manager import session_manager
+
+
+class ShareSessionStep(Step):
+
+ session_id: Optional[str] = None
+
+ async def run(self, sdk: ContinueSDK):
+ if self.session_id is None:
+ self.session_id = sdk.ide.session_id
+
+ await session_manager.persist_session(self.session_id)
+ time.sleep(0.5)
+
+ # Load the session data and format as a markdown file
+ session_filepath = getSessionFilePath(self.session_id)
+ with open(session_filepath, 'r') as f:
+ session_state = FullState(**json.load(f))
+
+ import datetime
+ date_created = datetime.datetime.fromtimestamp(
+ float(session_state.session_info.date_created)).strftime('%Y-%m-%d %H:%M:%S')
+ content = f"This is a session transcript from [Continue](https://continue.dev) on {date_created}.\n\n"
+
+ for node in session_state.history.timeline[:-2]:
+ if node.step.hide:
+ continue # ay
+
+ content += f"## {node.step.name}\n"
+ content += f"{node.step.description}\n\n"
+
+ # Save to a markdown file
+ save_filepath = os.path.join(
+ getGlobalFolderPath(), f"{session_state.session_info.title}.md")
+
+ with open(save_filepath, 'w') as f:
+ f.write(content)
+
+ # Open the file
+ await sdk.ide.setFileOpen(save_filepath)
+
+ self.description = f"The session transcript has been saved to a markdown file at {save_filepath}."