cloudbrain-server 1.2.0__tar.gz → 2.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {cloudbrain_server-1.2.0 → cloudbrain_server-2.0.0}/PKG-INFO +2 -2
- cloudbrain_server-2.0.0/cloudbrain_server/db_config.py +123 -0
- {cloudbrain_server-1.2.0 → cloudbrain_server-2.0.0}/cloudbrain_server/init_database.py +5 -5
- cloudbrain_server-2.0.0/cloudbrain_server/start_server.py +2582 -0
- cloudbrain_server-2.0.0/cloudbrain_server/token_manager.py +717 -0
- {cloudbrain_server-1.2.0 → cloudbrain_server-2.0.0}/cloudbrain_server.egg-info/PKG-INFO +2 -2
- {cloudbrain_server-1.2.0 → cloudbrain_server-2.0.0}/cloudbrain_server.egg-info/SOURCES.txt +2 -0
- {cloudbrain_server-1.2.0 → cloudbrain_server-2.0.0}/cloudbrain_server.egg-info/requires.txt +1 -1
- {cloudbrain_server-1.2.0 → cloudbrain_server-2.0.0}/pyproject.toml +2 -2
- cloudbrain_server-1.2.0/cloudbrain_server/start_server.py +0 -1160
- {cloudbrain_server-1.2.0 → cloudbrain_server-2.0.0}/README.md +0 -0
- {cloudbrain_server-1.2.0 → cloudbrain_server-2.0.0}/cloudbrain_server/__init__.py +0 -0
- {cloudbrain_server-1.2.0 → cloudbrain_server-2.0.0}/cloudbrain_server/ai_brain_state_schema.sql +0 -0
- {cloudbrain_server-1.2.0 → cloudbrain_server-2.0.0}/cloudbrain_server/clean_server.py +0 -0
- {cloudbrain_server-1.2.0 → cloudbrain_server-2.0.0}/cloudbrain_server/cloud_brain_server.py +0 -0
- {cloudbrain_server-1.2.0 → cloudbrain_server-2.0.0}/cloudbrain_server/schema.sql +0 -0
- {cloudbrain_server-1.2.0 → cloudbrain_server-2.0.0}/cloudbrain_server.egg-info/dependency_links.txt +0 -0
- {cloudbrain_server-1.2.0 → cloudbrain_server-2.0.0}/cloudbrain_server.egg-info/entry_points.txt +0 -0
- {cloudbrain_server-1.2.0 → cloudbrain_server-2.0.0}/cloudbrain_server.egg-info/top_level.txt +0 -0
- {cloudbrain_server-1.2.0 → cloudbrain_server-2.0.0}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cloudbrain-server
|
|
3
|
-
Version:
|
|
3
|
+
Version: 2.0.0
|
|
4
4
|
Summary: CloudBrain Server - AI collaboration platform with WebSocket support
|
|
5
5
|
Author: CloudBrain Team
|
|
6
6
|
License: MIT
|
|
@@ -24,7 +24,7 @@ Requires-Python: >=3.8
|
|
|
24
24
|
Description-Content-Type: text/markdown
|
|
25
25
|
Requires-Dist: websockets>=12.0
|
|
26
26
|
Requires-Dist: aiohttp>=3.9.0
|
|
27
|
-
Requires-Dist:
|
|
27
|
+
Requires-Dist: psycopg2-binary>=2.9.0
|
|
28
28
|
Provides-Extra: dev
|
|
29
29
|
Requires-Dist: pytest>=7.0; extra == "dev"
|
|
30
30
|
Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Database Configuration for CloudBrain
|
|
3
|
+
Supports both SQLite and PostgreSQL
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import os
|
|
7
|
+
from typing import Optional, List, Any, Tuple
|
|
8
|
+
import sqlite3
|
|
9
|
+
|
|
10
|
+
# Database type: 'sqlite' or 'postgres'
|
|
11
|
+
DB_TYPE = os.getenv('DB_TYPE', 'postgres')
|
|
12
|
+
|
|
13
|
+
# SQLite Configuration
|
|
14
|
+
SQLITE_DB_PATH = os.getenv('SQLITE_DB_PATH', 'ai_db/cloudbrain.db')
|
|
15
|
+
|
|
16
|
+
# PostgreSQL Configuration
|
|
17
|
+
POSTGRES_HOST = os.getenv('POSTGRES_HOST', 'localhost')
|
|
18
|
+
POSTGRES_PORT = os.getenv('POSTGRES_PORT', '5432')
|
|
19
|
+
POSTGRES_DB = os.getenv('POSTGRES_DB', 'cloudbrain')
|
|
20
|
+
POSTGRES_USER = os.getenv('POSTGRES_USER', 'jk')
|
|
21
|
+
POSTGRES_PASSWORD = os.getenv('POSTGRES_PASSWORD', '')
|
|
22
|
+
|
|
23
|
+
def get_db_connection():
|
|
24
|
+
"""
|
|
25
|
+
Get database connection based on DB_TYPE
|
|
26
|
+
|
|
27
|
+
Returns:
|
|
28
|
+
Connection object (sqlite3.Connection or psycopg2.extensions.connection)
|
|
29
|
+
"""
|
|
30
|
+
if DB_TYPE == 'postgres':
|
|
31
|
+
import psycopg2
|
|
32
|
+
conn = psycopg2.connect(
|
|
33
|
+
host=POSTGRES_HOST,
|
|
34
|
+
port=POSTGRES_PORT,
|
|
35
|
+
dbname=POSTGRES_DB,
|
|
36
|
+
user=POSTGRES_USER,
|
|
37
|
+
password=POSTGRES_PASSWORD
|
|
38
|
+
)
|
|
39
|
+
conn.autocommit = False
|
|
40
|
+
return conn
|
|
41
|
+
else:
|
|
42
|
+
import sqlite3
|
|
43
|
+
conn = sqlite3.connect(SQLITE_DB_PATH)
|
|
44
|
+
conn.row_factory = sqlite3.Row
|
|
45
|
+
return conn
|
|
46
|
+
|
|
47
|
+
def get_db_path() -> str:
|
|
48
|
+
"""
|
|
49
|
+
Get database path or connection string
|
|
50
|
+
|
|
51
|
+
Returns:
|
|
52
|
+
str: Database file path for SQLite or connection info for PostgreSQL
|
|
53
|
+
"""
|
|
54
|
+
if DB_TYPE == 'postgres':
|
|
55
|
+
return f"postgresql://{POSTGRES_USER}@{POSTGRES_HOST}:{POSTGRES_PORT}/{POSTGRES_DB}"
|
|
56
|
+
else:
|
|
57
|
+
return SQLITE_DB_PATH
|
|
58
|
+
|
|
59
|
+
def is_postgres() -> bool:
|
|
60
|
+
"""Check if using PostgreSQL"""
|
|
61
|
+
return DB_TYPE == 'postgres'
|
|
62
|
+
|
|
63
|
+
def is_sqlite() -> bool:
|
|
64
|
+
"""Check if using SQLite"""
|
|
65
|
+
return DB_TYPE == 'sqlite'
|
|
66
|
+
|
|
67
|
+
class CursorWrapper:
|
|
68
|
+
"""Wrapper for database cursor to handle both SQLite and PostgreSQL"""
|
|
69
|
+
|
|
70
|
+
def __init__(self, cursor, columns: List[str] = None):
|
|
71
|
+
self.cursor = cursor
|
|
72
|
+
self.columns = columns
|
|
73
|
+
self.is_sqlite = is_sqlite()
|
|
74
|
+
|
|
75
|
+
def _convert_query(self, query: str) -> str:
|
|
76
|
+
"""Convert SQLite query to PostgreSQL query if needed"""
|
|
77
|
+
if self.is_sqlite:
|
|
78
|
+
return query
|
|
79
|
+
# Replace SQLite placeholders with PostgreSQL placeholders
|
|
80
|
+
return query.replace('?', '%s')
|
|
81
|
+
|
|
82
|
+
def execute(self, query: str, params: Tuple = None):
|
|
83
|
+
"""Execute query"""
|
|
84
|
+
converted_query = self._convert_query(query)
|
|
85
|
+
if params is None:
|
|
86
|
+
return self.cursor.execute(converted_query)
|
|
87
|
+
return self.cursor.execute(converted_query, params)
|
|
88
|
+
|
|
89
|
+
def fetchone(self) -> Optional[dict]:
|
|
90
|
+
"""Fetch one row as dictionary"""
|
|
91
|
+
row = self.cursor.fetchone()
|
|
92
|
+
if row is None:
|
|
93
|
+
return None
|
|
94
|
+
if self.is_sqlite:
|
|
95
|
+
return dict(row)
|
|
96
|
+
else:
|
|
97
|
+
# Use cursor.description to get actual column names from query result
|
|
98
|
+
if self.cursor.description:
|
|
99
|
+
column_names = [desc[0] for desc in self.cursor.description]
|
|
100
|
+
return dict(zip(column_names, row))
|
|
101
|
+
elif self.columns:
|
|
102
|
+
return dict(zip(self.columns, row))
|
|
103
|
+
else:
|
|
104
|
+
return dict(zip(['id', 'name', 'nickname', 'expertise', 'version', 'project', 'created_at', 'updated_at', 'is_active'], row))
|
|
105
|
+
|
|
106
|
+
def fetchall(self) -> List[dict]:
|
|
107
|
+
"""Fetch all rows as dictionaries"""
|
|
108
|
+
rows = self.cursor.fetchall()
|
|
109
|
+
if self.is_sqlite:
|
|
110
|
+
return [dict(row) for row in rows]
|
|
111
|
+
else:
|
|
112
|
+
# Use cursor.description to get actual column names from query result
|
|
113
|
+
if self.cursor.description:
|
|
114
|
+
column_names = [desc[0] for desc in self.cursor.description]
|
|
115
|
+
return [dict(zip(column_names, row)) for row in rows]
|
|
116
|
+
elif self.columns:
|
|
117
|
+
return [dict(zip(self.columns, row)) for row in rows]
|
|
118
|
+
else:
|
|
119
|
+
return [dict(zip(['id', 'name', 'nickname', 'expertise', 'version', 'project', 'created_at', 'updated_at', 'is_active'], row)) for row in rows]
|
|
120
|
+
|
|
121
|
+
def __getattr__(self, name):
|
|
122
|
+
"""Delegate to cursor"""
|
|
123
|
+
return getattr(self.cursor, name)
|
|
@@ -148,10 +148,10 @@ CloudBrain is a real-time collaboration platform for AI agents that enables:
|
|
|
148
148
|
🚀 GETTING STARTED:
|
|
149
149
|
|
|
150
150
|
1. INSTALL PACKAGES:
|
|
151
|
-
pip install cloudbrain-client
|
|
151
|
+
pip install cloudbrain-client
|
|
152
152
|
|
|
153
153
|
2. LEARN HOW TO USE:
|
|
154
|
-
python -c "from
|
|
154
|
+
python -c "from cloudbrain_client import CloudBrainClient; help(CloudBrainClient)"
|
|
155
155
|
|
|
156
156
|
3. CONNECT TO SERVER:
|
|
157
157
|
python cloudbrain_client.py <ai_id> <project_name>
|
|
@@ -196,7 +196,7 @@ Start collaborating, sharing knowledge, and building amazing things together!
|
|
|
196
196
|
|
|
197
197
|
---
|
|
198
198
|
|
|
199
|
-
Need help? Run: python -c "from
|
|
199
|
+
Need help? Run: python -c "from cloudbrain_client import CloudBrainClient; help(CloudBrainClient)"
|
|
200
200
|
"""
|
|
201
201
|
|
|
202
202
|
conn = sqlite3.connect(db_path)
|
|
@@ -595,8 +595,8 @@ def main():
|
|
|
595
595
|
print(" 3. View dashboard: cd streamlit_dashboard && streamlit run app.py")
|
|
596
596
|
print()
|
|
597
597
|
print("💡 For AI Agents:")
|
|
598
|
-
print(" 1. Install: pip install cloudbrain-client
|
|
599
|
-
print(" 2. Learn: python -c 'from
|
|
598
|
+
print(" 1. Install: pip install cloudbrain-client")
|
|
599
|
+
print(" 2. Learn: python -c 'from cloudbrain_client import CloudBrainClient; help(CloudBrainClient)'")
|
|
600
600
|
print(" 3. Connect: python cloudbrain_client.py <ai_id> <project>")
|
|
601
601
|
print()
|
|
602
602
|
|