Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
134 commits
Select commit Hold shift + click to select a range
346ad1b
terminus migration setup
yaredtsy Feb 11, 2026
61cf3df
woql client migration to asyncio
yaredtsy Feb 11, 2026
a9e35a7
basic migration to async done
yaredtsy Feb 11, 2026
0ee51a4
schema added
yaredtsy Feb 13, 2026
b5c550a
model improved
yaredtsy Feb 13, 2026
189c366
repos skelton added
yaredtsy Feb 13, 2026
006cc89
client improved
yaredtsy Feb 13, 2026
488e553
repo improvement
yaredtsy Feb 13, 2026
1a1850d
repo imporvment
yaredtsy Feb 13, 2026
349caa8
schema imporvemnt
yaredtsy Feb 13, 2026
6588164
project create update test and service improved
yaredtsy Feb 13, 2026
2daebaf
folder creation migrated
yaredtsy Feb 13, 2026
edeca67
folder crud done
yaredtsy Feb 13, 2026
6e2dee3
folder and file optimized
yaredtsy Feb 13, 2026
c2cb2e0
pydantic model clean up
yaredtsy Feb 15, 2026
81382aa
more fix
yaredtsy Feb 15, 2026
a758f1c
type fix
yaredtsy Feb 15, 2026
0bd701f
function migration finished
yaredtsy Feb 15, 2026
3b22835
class migration done
yaredtsy Feb 15, 2026
2a3fb43
class service added
yaredtsy Feb 15, 2026
c1a457a
call serive migrated and test improved
yaredtsy Feb 15, 2026
b32b204
batch process added
yaredtsy Feb 15, 2026
c37501d
test added
yaredtsy Feb 15, 2026
9b6fd45
batch update test added
yaredtsy Feb 15, 2026
50108b8
code optimized
yaredtsy Feb 15, 2026
dd41869
query optimzed
yaredtsy Feb 16, 2026
0238af2
improvment
yaredtsy Feb 16, 2026
d6f8364
migration
yaredtsy Feb 16, 2026
446ee61
change detector improved
yaredtsy Feb 16, 2026
0674d05
folder sync improved
yaredtsy Feb 16, 2026
783050b
file migrated
yaredtsy Feb 16, 2026
42cdec2
test fox
yaredtsy Feb 16, 2026
2d7bac4
repo improvement
yaredtsy Feb 16, 2026
1687d89
ast sync finished
yaredtsy Feb 16, 2026
b5b5f92
call graph migrated
yaredtsy Feb 18, 2026
6aaef73
log
yaredtsy Feb 18, 2026
7b8c87d
batch processing improved
yaredtsy Feb 19, 2026
b82f81d
terminus client divide to smaller
yaredtsy Feb 19, 2026
c370113
more improvment added
yaredtsy Feb 19, 2026
5dacc64
branching and call sync fix
yaredtsy Feb 19, 2026
292417f
call test imporved
yaredtsy Feb 19, 2026
af8c8c7
more improved
yaredtsy Feb 19, 2026
787e931
test fixed
yaredtsy Feb 19, 2026
5b734ea
test improved
yaredtsy Feb 19, 2026
f9d5d4f
better way
yaredtsy Feb 20, 2026
f32c5ea
semaphore optimzed
yaredtsy Feb 20, 2026
aeceae3
function sync fix
yaredtsy Feb 21, 2026
4adecde
folder sync improved
yaredtsy Feb 21, 2026
d303020
get code added
yaredtsy Feb 21, 2026
fa0501b
class fix
yaredtsy Feb 21, 2026
16e2afd
more imprvovment
yaredtsy Feb 21, 2026
9bed948
call sync test migrated
yaredtsy Feb 21, 2026
fbd71e4
document migrated
yaredtsy Feb 21, 2026
c48a507
logs migrated
yaredtsy Feb 21, 2026
7bc8417
logs test migrated
yaredtsy Feb 21, 2026
2f66798
batch create improved
yaredtsy Feb 21, 2026
810ef34
test improved
yaredtsy Feb 21, 2026
9e468e5
logs test improved
yaredtsy Feb 21, 2026
3b4b38c
test skipped
yaredtsy Feb 21, 2026
03c52f1
basic group logic added
yaredtsy Feb 21, 2026
6e8c914
structure group migrated
yaredtsy Feb 21, 2026
907f0f0
project api migrated
yaredtsy Feb 22, 2026
b34e1eb
more test improved
yaredtsy Feb 22, 2026
9d3ef7d
get project improved
yaredtsy Feb 22, 2026
c7e5ce3
get code fixed
yaredtsy Feb 22, 2026
19d15a1
document api fixed
yaredtsy Feb 22, 2026
861bdf6
write code added
yaredtsy Feb 22, 2026
7e9f06c
basic type match
yaredtsy Feb 23, 2026
0fe29d8
write code fixed
yaredtsy Feb 23, 2026
6a864e9
migration of frontend
yaredtsy Feb 23, 2026
e14a3c4
document fixed
yaredtsy Feb 23, 2026
a037599
get history added
yaredtsy Feb 25, 2026
14a209e
document small improvement
yaredtsy Feb 25, 2026
db5c443
get commits added
yaredtsy Feb 25, 2026
f742db2
commit first code added
yaredtsy Feb 25, 2026
c617c4c
api improved
yaredtsy Feb 25, 2026
a7b53e1
small improvement
yaredtsy Feb 25, 2026
b53b0ac
versioning improved
yaredtsy Feb 25, 2026
76c62a6
show commits
yaredtsy Feb 25, 2026
23d41f3
diff viewer added
yaredtsy Feb 25, 2026
de4feb8
watcher fixed
yaredtsy Feb 25, 2026
58c9914
change viewer improved
yaredtsy Feb 25, 2026
9f1a662
diff ui added
yaredtsy Feb 26, 2026
cf71daf
console log removed
yaredtsy Feb 26, 2026
847bd80
basic agent ui added
yaredtsy Feb 26, 2026
8cca3ce
overlay fix
yaredtsy Feb 26, 2026
73612a3
basic reply engine added
yaredtsy Feb 26, 2026
b6adf1e
ui improved
yaredtsy Feb 26, 2026
f1111e4
basic event trigger added
yaredtsy Feb 26, 2026
732faf8
focus handler added
yaredtsy Feb 26, 2026
c5ad71b
focus handler added
yaredtsy Feb 26, 2026
a50c43a
call graph generator speed improved
yaredtsy Feb 28, 2026
dc92858
speed improved
yaredtsy Feb 28, 2026
97c0afd
clean up
yaredtsy Feb 28, 2026
48e69fd
api call optimized
yaredtsy Feb 28, 2026
fd28eb1
class call registration improved
yaredtsy Feb 28, 2026
f0dac29
more test added
yaredtsy Mar 2, 2026
82c5202
multi thread added
yaredtsy Mar 2, 2026
78398b1
batch append improved
yaredtsy Mar 2, 2026
e761a79
project creation fixed
yaredtsy Mar 2, 2026
8f8b405
imporve
yaredtsy Mar 2, 2026
e372e3e
cleanup
yaredtsy Mar 2, 2026
7aa8d7c
combined batch request flush added
yaredtsy Mar 2, 2026
a80c9fa
as collection speed upped
yaredtsy Mar 2, 2026
f462aee
file/folder structure sync improved
yaredtsy Mar 2, 2026
81a50cc
make file fix
yaredtsy Mar 2, 2026
35448ea
improve
yaredtsy Mar 2, 2026
d081728
batch request improved
yaredtsy Mar 3, 2026
efd6355
batch update
yaredtsy Mar 3, 2026
c84c59d
call graph improved
yaredtsy Mar 3, 2026
ee7a47f
speed improved
yaredtsy Mar 3, 2026
0aa2108
group request improved
yaredtsy Mar 3, 2026
e9a73b8
test imporved
yaredtsy Mar 3, 2026
026615e
test added
yaredtsy Mar 3, 2026
dd825d7
group optimized
yaredtsy Mar 3, 2026
18ed5d6
fix
yaredtsy Mar 3, 2026
64505e9
repo migration to new client
yaredtsy Mar 4, 2026
4528d4c
api migrated
yaredtsy Mar 4, 2026
b71e924
service migration
yaredtsy Mar 4, 2026
14aafdc
graph builder migrated
yaredtsy Mar 4, 2026
2e259a2
test fixed
yaredtsy Mar 4, 2026
4f4543b
test improved
yaredtsy Mar 4, 2026
7ff32e3
repo optimazation
yaredtsy Mar 4, 2026
2c5bf6a
structure repo improve
yaredtsy Mar 4, 2026
df063df
service added
yaredtsy Mar 4, 2026
9b595f2
more cleanups
yaredtsy Mar 4, 2026
50c563d
api fixed
yaredtsy Mar 4, 2026
ab28b34
final cleanups
yaredtsy Mar 5, 2026
e3c8049
logs improved
yaredtsy Mar 5, 2026
39b0e3a
improvement
yaredtsy Mar 5, 2026
debe8c9
log migration done
yaredtsy Mar 5, 2026
115aea7
log test fixed
yaredtsy Mar 5, 2026
13d6059
test improved for logger
yaredtsy Mar 5, 2026
11bab56
remote collaboration support added
yaredtsy Mar 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
.PHONY: help install-backend run-backend install-frontend run-frontend install
.PHONY: help install-backend run-backend install-frontend run-frontend install start-db stop-db

help:
@echo "Commands:"
@echo " install : Install all dependencies for backend and frontend."
@echo " install-backend : Install backend dependencies."
@echo " start-db : Start TerminusDB (Docker) on http://localhost:6363."
@echo " stop-db : Stop TerminusDB."
@echo " run-backend : Start backend development server on http://localhost:8000."
@echo " run-rpc : Start JSON-RPC server on http://localhost:8050/api/v1/jsonrpc."
@echo " run-servers : Start backend and JSON-RPC servers."
Expand All @@ -20,12 +22,12 @@ install-backend:
@uv pip install -r src/backend/requirements.txt --python .venv/bin/python

start-db:
@echo ">>> Starting ArangoDB..."
@docker-compose -f src/backend/docker-compose.yml --env-file src/backend/.env up -d
@echo ">>> Starting TerminusDB..."
@docker compose -f src/backend/docker-compose.yml --env-file src/backend/.env up -d

stop-db:
@echo ">>> Stopping ArangoDB..."
@docker-compose -f src/backend/docker-compose.yml --env-file src/backend/.env down
@echo ">>> Stopping TerminusDB..."
@docker compose -f src/backend/docker-compose.yml --env-file src/backend/.env down

run-backend: start-db
@echo ">>> Starting backend development server..."
Expand Down
13 changes: 8 additions & 5 deletions src/backend/.env.example
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
# .env.example
APP_ENV=development
ARANGO_HOST=http://localhost:8529
ARANGO_USER=app_user
ARANGO_PASSWORD=app_password
ARANGO_DB=_system
ARANGO_ROOT_PASSWORD=password
TERMINUS_HOST=http://localhost:6363
TERMINUS_DB=v_noc
TERMINUS_USER=admin
TERMINUS_KEY=root
TERMINUS_TEAM=admin

# TerminusDB Docker admin password (must match TERMINUS_KEY for API auth)
TERMINUSDB_ADMIN_PASS=root

PORT=8000
104 changes: 56 additions & 48 deletions src/backend/app/api/dependencies.py
Original file line number Diff line number Diff line change
@@ -1,76 +1,84 @@
from fastapi import Depends
from typing import Optional
from fastapi import Depends, Header, Query, HTTPException
from app.core.repository import Repositories
from app.core.services.project_service import ProjectService
from app.db.client import get_db
from arangoasync.database import AsyncDatabase
from app.core.services.container_service import ContainerService
from app.core.services.file_service import FileService
from app.core.services.class_service import ClassService
from app.core.services.function_service import FunctionService
from app.core.services.code_element_service import CodeElementService

from app.core.services.call_service import CallService
from app.core.services.log_service import LogService
from app.core.services.group_service import GroupService
from app.core.services.document_service import DocumentService


def get_group_service(
db: AsyncDatabase = Depends(get_db),
) -> GroupService:
repos = Repositories(db)
return GroupService(repos)
from app.db.client import get_terminus_client
from app.db.async_terminus_client import AsyncClient
from app.core.model.nodes import ProjectNode
from app.db.context import RequestDbContext, ProjectUoW


def get_project_service(
db: AsyncDatabase = Depends(get_db),
db: AsyncClient = Depends(get_terminus_client),
) -> ProjectService:
repos = Repositories(db)
return ProjectService(repos)
pow = ProjectUoW(db.clone(), None, RequestDbContext())
return ProjectService(pow)


def get_container_service(
db: AsyncDatabase = Depends(get_db),
) -> ContainerService:
repos = Repositories(db)
return ContainerService(repos)
async def get_request_db_context(
branch: str = Header("main", alias="X-Vnoc-Branch"),
ref: Optional[str] = Query(
None, description="Specific commit/ref to query"),
) -> RequestDbContext:
return RequestDbContext(branch=branch, ref=ref)


def get_file_service(
db: AsyncDatabase = Depends(get_db),
) -> FileService:
repos = Repositories(db)
return FileService(repos)
async def get_project_node(
project_id: str = Query(..., description="The ID of the project"),
project_service: ProjectService = Depends(get_project_service),
) -> ProjectNode:
project = await project_service.get(project_id)
return ProjectNode.from_raw_dict(project)


def get_class_service(
db: AsyncDatabase = Depends(get_db),
) -> ClassService:
repos = Repositories(db)
return ClassService(repos)
async def get_project_uow(
base: AsyncClient = Depends(get_terminus_client),
project: ProjectNode = Depends(get_project_node),
ctx: RequestDbContext = Depends(get_request_db_context),
):
"""Async generator dependency. FastAPI enters it and passes the yielded ProjectUoW."""
try:
yield ProjectUoW(base, project, ctx)
finally:
pass


def get_function_service(
db: AsyncDatabase = Depends(get_db),
) -> FunctionService:
repos = Repositories(db)
return FunctionService(repos)
def get_project_service_with_uow(
uow: ProjectUoW = Depends(get_project_uow),
) -> ProjectService:
return ProjectService(uow)


def get_group_service(
uow: ProjectUoW = Depends(get_project_uow)
) -> GroupService:
return GroupService(uow)


def get_call_service(
db: AsyncDatabase = Depends(get_db),
uow: ProjectUoW = Depends(get_project_uow)
) -> CallService:
repos = Repositories(db)
return CallService(repos)

return CallService(uow)


def get_log_service(
db: AsyncDatabase = Depends(get_db),
uow: ProjectUoW = Depends(get_project_uow)
) -> LogService:
repos = Repositories(db)
return LogService(repos)
return LogService(uow)


async def get_code_element_service(
uow: ProjectUoW = Depends(get_project_uow)
) -> CodeElementService:
return CodeElementService(uow)


def get_document_service(
db: AsyncDatabase = Depends(get_db),
) -> DocumentService:
repos = Repositories(db)
return DocumentService(repos)
def get_document_service(uow: ProjectUoW = Depends(get_project_uow)) -> DocumentService:
return DocumentService(uow)
94 changes: 35 additions & 59 deletions src/backend/app/api/json_rpc/dependencies.py
Original file line number Diff line number Diff line change
@@ -1,82 +1,58 @@
from fastapi import Depends, Body
from arangoasync.database import AsyncDatabase
from typing import Optional
from app.db.client import get_db
from app.core.repository import Repositories
from app.core.services.project_service import ProjectService
from app.core.services.file_service import FileService
from app.core.services.class_service import ClassService
from app.core.services.function_service import FunctionService
from app.core.services.call_service import CallService
from fastapi import Depends, Body

from app.db.client import get_terminus_client
from app.db.context import RequestDbContext, ProjectUoW
from app.core.model.nodes import ProjectNode
from app.core.services.log_service import LogService

from app.api.dependencies import get_project_service

def get_services(db: AsyncDatabase = Depends(get_db)):
repos = Repositories(db)
return (
ProjectService(repos),
FileService(repos),
ClassService(repos),
FunctionService(repos),
CallService(repos),
LogService(repos),
)

def get_jsonrpc_request_db_context() -> RequestDbContext:
"""JSON-RPC uses default branch/ref since params come from body."""
return RequestDbContext(branch="main", ref=None)

async def get_project(

def get_jsonrpc_project_id(
project_id: str = Body(..., embed=True, alias="project_id"),
services=Depends(get_services),
):
) -> str:
return project_id


async def get_jsonrpc_project_node(
project_id: str = Depends(get_jsonrpc_project_id),
project_service=Depends(get_project_service),
) -> Optional[ProjectNode]:
try:
project_service, *_ = services

project = await project_service.get(project_id)

return project
return ProjectNode.from_raw_dict(project) if project else None
except Exception as e:
print("Error getting project", e)
return None


def get_function_services(services=Depends(get_services)):
_, _, _, function_service, _, _ = services
return function_service


async def get_function(
function_id: str = Body(..., embed=True, alias="function_id"),
services=Depends(get_function_services),
async def get_jsonrpc_project_uow(
base=Depends(get_terminus_client),
project: Optional[ProjectNode] = Depends(get_jsonrpc_project_node),
ctx: RequestDbContext = Depends(get_jsonrpc_request_db_context),
):
func_node = None
"""Async generator dependency. FastAPI enters it and passes the yielded ProjectUoW."""
try:
function_service = services

func_node = await function_service.get(function_id)

except Exception as e:
print("Error getting function", e)
yield ProjectUoW(base, project, ctx)
finally:
return func_node
pass


async def get_parent_function(
parent_function_id: Optional[str] = Body(
None, embed=True, alias="parent_function_id"
),
services=Depends(get_function_services),
async def get_project(
project_node: Optional[ProjectNode] = Depends(get_jsonrpc_project_node),
):
parent_func_node = None
try:
function_service = services

if parent_function_id is not None:
parent_func_node = await function_service.get(parent_function_id)

except Exception as e:
print("Error getting function", e)
finally:
return parent_func_node
return project_node


def get_log_service(services=Depends(get_services)):
*_, log_service = services
return log_service
def get_log_service(
uow: ProjectUoW = Depends(get_jsonrpc_project_uow),
) -> LogService:
return LogService(uow)
9 changes: 2 additions & 7 deletions src/backend/app/api/json_rpc/schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,7 @@

from pydantic import BaseModel, ConfigDict, Field


class LogEventType(str, Enum):
ENTER = "enter"
EXIT = "exit"
ERROR = "error"
LOG = "log"
from app.core.model.logs import LogLevelName, LogEventType


class RegisterLogsParams(BaseModel):
Expand All @@ -36,7 +31,7 @@ class RegisterLogsParams(BaseModel):
message: str = Field(
..., description="Message"
)
level_name: Optional[str] = Field(
level_name: Optional[LogLevelName] = Field(
None, description="Log level name (e.g., info, warning, error)"
)
payload: Optional[Dict[str, Any]] = Field(
Expand Down
13 changes: 8 additions & 5 deletions src/backend/app/api/root.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
from fastapi import APIRouter
from . import health
from .v1 import project_routes
from .v1 import container_routes
from .v1 import code_routes
from .v1 import logger_routes
from .v1 import document_routes
from .v1 import call_routes
from .v1.versioning import router as versioning_router
# from .v1 import call_routes
from .v1 import group_routes

router = APIRouter()
Expand All @@ -22,8 +22,8 @@ def get_root():
router.include_router(project_routes.router,
prefix="/projects", tags=["projects"])

router.include_router(
container_routes.router, prefix="/containers", tags=["containers"])
# router.include_router(
# container_routes.router, prefix="/containers", tags=["containers"])

router.include_router(
code_routes.router, prefix="/code-elements", tags=["code-elements"]
Expand All @@ -34,6 +34,9 @@ def get_root():
router.include_router(document_routes.router,
prefix="/documents", tags=["documents"])

router.include_router(call_routes.router, prefix="/calls", tags=["calls"])
router.include_router(
versioning_router, prefix="/versioning", tags=["versioning"])

# router.include_router(call_routes.router, prefix="/calls", tags=["calls"])

router.include_router(group_routes.router, prefix="/groups", tags=["groups"])
Loading