Moved sharing to enterprise

This commit is contained in:
Tim O'Farrell 2025-12-22 19:27:58 -07:00
parent 32fb4767f1
commit 76a9573b2e
12 changed files with 28 additions and 116 deletions

View File

@ -37,6 +37,8 @@ from server.routes.mcp_patch import patch_mcp_server # noqa: E402
from server.routes.oauth_device import oauth_device_router # noqa: E402
from server.routes.readiness import readiness_router # noqa: E402
from server.routes.user import saas_user_router # noqa: E402
from server.sharing.shared_conversation_router import router as shared_conversation_router # noqa: E402
from server.sharing.shared_event_router import router as shared_event_router # noqa: E402
from openhands.server.app import app as base_app # noqa: E402
from openhands.server.listen_socket import sio # noqa: E402
@ -66,6 +68,8 @@ base_app.include_router(saas_user_router) # Add additional route SAAS user call
base_app.include_router(
billing_router
) # Add routes for credit management and Stripe payment integration
base_app.include_router(shared_conversation_router)
base_app.include_router(shared_event_router)
# Add GitHub integration router only if GITHUB_APP_CLIENT_ID is set
if GITHUB_APP_CLIENT_ID:
@ -99,6 +103,7 @@ base_app.include_router(
event_webhook_router
) # Add routes for Events in nested runtimes
base_app.add_middleware(
CORSMiddleware,
allow_origins=PERMITTED_CORS_ORIGINS,

View File

@ -20,10 +20,10 @@ from openhands.agent_server.models import EventPage, EventSortOrder
from openhands.app_server.event.event_service import EventService
from openhands.app_server.event_callback.event_callback_models import EventKind
from openhands.app_server.services.injector import InjectorState
from openhands.app_server.sharing.shared_conversation_info_service import (
from server.sharing.shared_conversation_info_service import (
SharedConversationInfoService,
)
from openhands.app_server.sharing.shared_event_service import (
from server.sharing.shared_event_service import (
SharedEventService,
SharedEventServiceInjector,
)

View File

@ -4,7 +4,7 @@ from datetime import datetime
from uuid import UUID
from openhands.app_server.services.injector import Injector
from openhands.app_server.sharing.shared_conversation_models import (
from server.sharing.shared_conversation_models import (
SharedConversation,
SharedConversationPage,
SharedConversationSortOrder,

View File

@ -4,21 +4,22 @@ from datetime import datetime
from typing import Annotated
from uuid import UUID
from fastapi import APIRouter, Query
from fastapi import APIRouter, Depends, Query
from openhands.app_server.config import depends_shared_conversation_info_service
from openhands.app_server.sharing.shared_conversation_info_service import (
from enterprise.server.sharing.sql_shared_conversation_info_service import SQLSharedConversationInfoServiceInjector
from server.sharing.shared_conversation_info_service import (
SharedConversationInfoService,
)
from openhands.app_server.sharing.shared_conversation_models import (
from server.sharing.shared_conversation_models import (
SharedConversation,
SharedConversationPage,
SharedConversationSortOrder,
)
router = APIRouter(prefix='/shared-conversations', tags=['Sharing'])
shared_conversation_service_dependency = depends_shared_conversation_info_service()
router = APIRouter(prefix='/api/shared-conversations', tags=['Sharing'])
shared_conversation_info_service_dependency = Depends(
SQLSharedConversationInfoServiceInjector().depends
)
# Read methods
@ -67,7 +68,7 @@ async def search_shared_conversations(
title='If True, include sub-conversations in the results. If False (default), exclude all sub-conversations.'
),
] = False,
shared_conversation_service: SharedConversationInfoService = shared_conversation_service_dependency,
shared_conversation_service: SharedConversationInfoService = shared_conversation_info_service_dependency,
) -> SharedConversationPage:
"""Search / List shared conversations."""
assert limit > 0
@ -107,7 +108,7 @@ async def count_shared_conversations(
datetime | None,
Query(title='Filter by updated_at less than this datetime'),
] = None,
shared_conversation_service: SharedConversationInfoService = shared_conversation_service_dependency,
shared_conversation_service: SharedConversationInfoService = shared_conversation_info_service_dependency,
) -> int:
"""Count shared conversations matching the given filters."""
return await shared_conversation_service.count_shared_conversation_info(
@ -122,7 +123,7 @@ async def count_shared_conversations(
@router.get('')
async def batch_get_shared_conversations(
ids: Annotated[list[str], Query()],
shared_conversation_service: SharedConversationInfoService = shared_conversation_service_dependency,
shared_conversation_service: SharedConversationInfoService = shared_conversation_info_service_dependency,
) -> list[SharedConversation | None]:
"""Get a batch of shared conversations given their ids. Return None for any missing or non-shared."""
assert len(ids) <= 100

View File

@ -4,16 +4,18 @@ from datetime import datetime
from typing import Annotated
from uuid import UUID
from fastapi import APIRouter, Query
from fastapi import APIRouter, Depends, Query
from openhands.agent_server.models import EventPage, EventSortOrder
from openhands.app_server.config import depends_shared_event_service
from enterprise.server.sharing.filesystem_shared_event_service import SharedEventServiceImplInjector
from openhands.app_server.event_callback.event_callback_models import EventKind
from openhands.app_server.sharing.shared_event_service import SharedEventService
from server.sharing.shared_event_service import SharedEventService
from openhands.sdk import Event
router = APIRouter(prefix='/shared-events', tags=['Sharing'])
shared_event_service_dependency = depends_shared_event_service()
router = APIRouter(prefix='/api/shared-events', tags=['Sharing'])
shared_event_service_dependency = Depends(
SharedEventServiceImplInjector().depends
)
# Read methods

View File

@ -22,11 +22,11 @@ from openhands.app_server.app_conversation.sql_app_conversation_info_service imp
StoredConversationMetadata,
)
from openhands.app_server.services.injector import InjectorState
from openhands.app_server.sharing.shared_conversation_info_service import (
from server.sharing.shared_conversation_info_service import (
SharedConversationInfoService,
SharedConversationInfoServiceInjector,
)
from openhands.app_server.sharing.shared_conversation_models import (
from server.sharing.shared_conversation_models import (
SharedConversation,
SharedConversationPage,
SharedConversationSortOrder,

View File

@ -1,41 +0,0 @@
"""add public column to conversation_metadata
Revision ID: 004
Revises: 003
Create Date: 2025-01-27 00:00:00.000000
"""
from typing import Sequence, Union
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision: str = '004'
down_revision: Union[str, None] = '003'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
"""Upgrade schema."""
op.add_column(
'conversation_metadata',
sa.Column('public', sa.Boolean(), nullable=True),
)
op.create_index(
op.f('ix_conversation_metadata_public'),
'conversation_metadata',
['public'],
unique=False,
)
def downgrade() -> None:
"""Downgrade schema."""
op.drop_index(
op.f('ix_conversation_metadata_public'),
table_name='conversation_metadata',
)
op.drop_column('conversation_metadata', 'public')

View File

@ -47,14 +47,6 @@ from openhands.app_server.services.db_session_injector import (
from openhands.app_server.services.httpx_client_injector import HttpxClientInjector
from openhands.app_server.services.injector import InjectorState
from openhands.app_server.services.jwt_service import JwtService, JwtServiceInjector
from openhands.app_server.sharing.shared_conversation_info_service import (
SharedConversationInfoService,
SharedConversationInfoServiceInjector,
)
from openhands.app_server.sharing.shared_event_service import (
SharedEventService,
SharedEventServiceInjector,
)
from openhands.app_server.user.user_context import UserContext, UserContextInjector
from openhands.sdk.utils.models import OpenHandsModel
@ -113,8 +105,6 @@ class AppServerConfig(OpenHandsModel):
app_conversation_info: AppConversationInfoServiceInjector | None = None
app_conversation_start_task: AppConversationStartTaskServiceInjector | None = None
app_conversation: AppConversationServiceInjector | None = None
shared_conversation_info: SharedConversationInfoServiceInjector | None = None
shared_event: SharedEventServiceInjector | None = None
user: UserContextInjector | None = None
jwt: JwtServiceInjector | None = None
httpx: HttpxClientInjector = Field(default_factory=HttpxClientInjector)
@ -212,20 +202,6 @@ def config_from_env() -> AppServerConfig:
tavily_api_key=tavily_api_key
)
if config.shared_conversation_info is None:
from openhands.app_server.sharing.sql_shared_conversation_info_service import (
SQLSharedConversationInfoServiceInjector,
)
config.shared_conversation_info = SQLSharedConversationInfoServiceInjector()
if config.shared_event is None:
from openhands.app_server.sharing.filesystem_shared_event_service import (
SharedEventServiceImplInjector,
)
config.shared_event = SharedEventServiceImplInjector()
if config.user is None:
config.user = AuthUserContextInjector()
@ -397,31 +373,3 @@ def depends_jwt_service():
def depends_db_session():
return Depends(get_global_config().db_session.depends)
def depends_shared_conversation_info_service():
injector = get_global_config().shared_conversation_info
assert injector is not None
return Depends(injector.depends)
def depends_shared_event_service():
injector = get_global_config().shared_event
assert injector is not None
return Depends(injector.depends)
def get_shared_conversation_info_service(
state: InjectorState, request: Request | None = None
) -> AsyncContextManager[SharedConversationInfoService]:
injector = get_global_config().shared_conversation_info
assert injector is not None
return injector.context(state, request)
def get_shared_event_service(
state: InjectorState, request: Request | None = None
) -> AsyncContextManager[SharedEventService]:
injector = get_global_config().shared_event
assert injector is not None
return injector.context(state, request)

View File

@ -6,7 +6,6 @@ from openhands.app_server.event_callback import (
webhook_router,
)
from openhands.app_server.sandbox import sandbox_router, sandbox_spec_router
from openhands.app_server.sharing import shared_conversation_router, shared_event_router
from openhands.app_server.user import user_router
# Include routers
@ -15,7 +14,5 @@ router.include_router(event_router.router)
router.include_router(app_conversation_router.router)
router.include_router(sandbox_router.router)
router.include_router(sandbox_spec_router.router)
router.include_router(shared_conversation_router.router)
router.include_router(shared_event_router.router)
router.include_router(user_router.router)
router.include_router(webhook_router.router)