Skip to content
This repository was archived by the owner on Jun 5, 2025. It is now read-only.

Commit 2ffd1dc

Browse files
authored
Merge branch 'main' into cline
2 parents 9cff3fb + e49c72f commit 2ffd1dc

File tree

12 files changed

+167
-139
lines changed

12 files changed

+167
-139
lines changed

api/openapi.json

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -285,8 +285,13 @@
285285
}
286286
],
287287
"responses": {
288-
"204": {
289-
"description": "Successful Response"
288+
"200": {
289+
"description": "Successful Response",
290+
"content": {
291+
"application/json": {
292+
"schema": {}
293+
}
294+
}
290295
},
291296
"422": {
292297
"description": "Validation Error",
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
"""add soft delete
2+
3+
Revision ID: 8e4b4b8d1a88
4+
Revises: 5c2f3eee5f90
5+
Create Date: 2025-01-20 14:08:40.851647
6+
7+
"""
8+
9+
from typing import Sequence, Union
10+
11+
from alembic import op
12+
13+
# revision identifiers, used by Alembic.
14+
revision: str = "8e4b4b8d1a88"
15+
down_revision: Union[str, None] = "5c2f3eee5f90"
16+
branch_labels: Union[str, Sequence[str], None] = None
17+
depends_on: Union[str, Sequence[str], None] = None
18+
19+
20+
def upgrade() -> None:
21+
op.execute(
22+
"""
23+
ALTER TABLE workspaces
24+
ADD COLUMN deleted_at DATETIME DEFAULT NULL;
25+
"""
26+
)
27+
28+
29+
def downgrade() -> None:
30+
op.execute("ALTER TABLE workspaces DROP COLUMN deleted_at;")
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
"""merging system prompt and soft-deletes
2+
3+
Revision ID: e6227073183d
4+
Revises: 8e4b4b8d1a88, a692c8b52308
5+
Create Date: 2025-01-20 16:08:40.645298
6+
7+
"""
8+
9+
from typing import Sequence, Union
10+
11+
# revision identifiers, used by Alembic.
12+
revision: str = "e6227073183d"
13+
down_revision: Union[str, None] = ("8e4b4b8d1a88", "a692c8b52308")
14+
branch_labels: Union[str, Sequence[str], None] = None
15+
depends_on: Union[str, Sequence[str], None] = None
16+
17+
18+
def upgrade() -> None:
19+
pass
20+
21+
22+
def downgrade() -> None:
23+
pass

poetry.lock

Lines changed: 25 additions & 121 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ tree-sitter-java = "==0.23.5"
2626
tree-sitter-javascript = "==0.23.1"
2727
tree-sitter-python = "==0.23.6"
2828
tree-sitter-rust = "==0.23.2"
29-
sqlite-vec-sl-tmp = "==0.0.4"
3029
alembic = "==1.14.1"
3130
pygments = "==2.19.1"
31+
sqlite-vec = "==0.1.6"
3232

3333
[tool.poetry.group.dev.dependencies]
3434
pytest = "==8.3.4"

scripts/import_packages.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import sqlite3
66

77
import numpy as np
8-
import sqlite_vec_sl_tmp
8+
import sqlite_vec
99

1010
from codegate.inference.inference_engine import LlamaCppInferenceEngine
1111
from codegate.utils.utils import generate_vector_string
@@ -27,7 +27,7 @@ def __init__(self, jsonl_dir="data", vec_db_path="./sqlite_data/vectordb.db"):
2727
def _get_connection(self):
2828
conn = sqlite3.connect(self.vec_db_path)
2929
conn.enable_load_extension(True)
30-
sqlite_vec_sl_tmp.load(conn)
30+
sqlite_vec.load(conn)
3131
conn.enable_load_extension(False)
3232
return conn
3333

src/codegate/api/v1.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,11 @@ async def activate_workspace(request: v1_models.ActivateWorkspaceRequest, status
4545
try:
4646
await wscrud.activate_workspace(request.name)
4747
except crud.WorkspaceAlreadyActiveError:
48-
return HTTPException(status_code=409, detail="Workspace already active")
48+
raise HTTPException(status_code=409, detail="Workspace already active")
4949
except crud.WorkspaceDoesNotExistError:
50-
return HTTPException(status_code=404, detail="Workspace does not exist")
50+
raise HTTPException(status_code=404, detail="Workspace does not exist")
5151
except Exception:
52-
return HTTPException(status_code=500, detail="Internal server error")
52+
raise HTTPException(status_code=500, detail="Internal server error")
5353

5454
return Response(status_code=204)
5555

@@ -79,8 +79,16 @@ async def create_workspace(request: v1_models.CreateWorkspaceRequest) -> v1_mode
7979
"/workspaces/{workspace_name}",
8080
tags=["Workspaces"],
8181
generate_unique_id_function=uniq_name,
82-
status_code=204,
8382
)
8483
async def delete_workspace(workspace_name: str):
8584
"""Delete a workspace by name."""
86-
raise NotImplementedError
85+
try:
86+
_ = await wscrud.soft_delete_workspace(workspace_name)
87+
except crud.WorkspaceDoesNotExistError:
88+
raise HTTPException(status_code=404, detail="Workspace does not exist")
89+
except crud.WorkspaceCrudError as e:
90+
raise HTTPException(status_code=400, detail=str(e))
91+
except Exception:
92+
raise HTTPException(status_code=500, detail="Internal server error")
93+
94+
return Response(status_code=204)

src/codegate/db/connection.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,20 @@ async def update_session(self, session: Session) -> Optional[Session]:
304304
active_session = await self._execute_update_pydantic_model(session, sql, should_raise=True)
305305
return active_session
306306

307+
async def soft_delete_workspace(self, workspace: Workspace) -> Optional[Workspace]:
308+
sql = text(
309+
"""
310+
UPDATE workspaces
311+
SET deleted_at = CURRENT_TIMESTAMP
312+
WHERE id = :id
313+
RETURNING *
314+
"""
315+
)
316+
deleted_workspace = await self._execute_update_pydantic_model(
317+
workspace, sql, should_raise=True
318+
)
319+
return deleted_workspace
320+
307321

308322
class DbReader(DbCodeGate):
309323

@@ -401,6 +415,7 @@ async def get_workspaces(self) -> List[WorkspaceActive]:
401415
w.id, w.name, s.active_workspace_id
402416
FROM workspaces w
403417
LEFT JOIN sessions s ON w.id = s.active_workspace_id
418+
WHERE w.deleted_at IS NULL
404419
"""
405420
)
406421
workspaces = await self._execute_select_pydantic_model(WorkspaceActive, sql)
@@ -412,7 +427,7 @@ async def get_workspace_by_name(self, name: str) -> Optional[Workspace]:
412427
SELECT
413428
id, name, system_prompt
414429
FROM workspaces
415-
WHERE name = :name
430+
WHERE name = :name AND deleted_at IS NULL
416431
"""
417432
)
418433
conditions = {"name": name}

src/codegate/pipeline/cli/commands.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ def subcommands(self) -> Dict[str, Callable[[List[str]], Awaitable[str]]]:
153153
"list": self._list_workspaces,
154154
"add": self._add_workspace,
155155
"activate": self._activate_workspace,
156+
"remove": self._remove_workspace,
156157
}
157158

158159
async def _list_workspaces(self, flags: Dict[str, str], args: List[str]) -> str:
@@ -211,6 +212,27 @@ async def _activate_workspace(self, flags: Dict[str, str], args: List[str]) -> s
211212
return "An error occurred while activating the workspace"
212213
return f"Workspace **{workspace_name}** has been activated"
213214

215+
async def _remove_workspace(self, flags: Dict[str, str], args: List[str]) -> str:
216+
"""
217+
Remove a workspace
218+
"""
219+
if args is None or len(args) == 0:
220+
return "Please provide a name. Use `codegate workspace remove workspace_name`"
221+
222+
workspace_name = args[0]
223+
if not workspace_name:
224+
return "Please provide a name. Use `codegate workspace remove workspace_name`"
225+
226+
try:
227+
await self.workspace_crud.soft_delete_workspace(workspace_name)
228+
except crud.WorkspaceDoesNotExistError:
229+
return f"Workspace **{workspace_name}** does not exist"
230+
except crud.WorkspaceCrudError as e:
231+
return str(e)
232+
except Exception:
233+
return "An error occurred while removing the workspace"
234+
return f"Workspace **{workspace_name}** has been removed"
235+
214236
@property
215237
def help(self) -> str:
216238
return (

src/codegate/storage/storage_engine.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from typing import List, Optional
55

66
import numpy as np
7-
import sqlite_vec_sl_tmp
7+
import sqlite_vec
88
import structlog
99

1010
from codegate.config import Config
@@ -71,7 +71,7 @@ def _get_connection(self):
7171
try:
7272
conn = sqlite3.connect(self.db_path)
7373
conn.enable_load_extension(True)
74-
sqlite_vec_sl_tmp.load(conn)
74+
sqlite_vec.load(conn)
7575
conn.enable_load_extension(False)
7676
return conn
7777
except Exception as e:

0 commit comments

Comments
 (0)