signalpilot-ai-internal 0.10.0__py3-none-any.whl → 0.11.24__py3-none-any.whl
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.
- signalpilot_ai_internal/__init__.py +1 -0
- signalpilot_ai_internal/_version.py +1 -1
- signalpilot_ai_internal/cache_service.py +22 -21
- signalpilot_ai_internal/composio_handlers.py +224 -0
- signalpilot_ai_internal/composio_service.py +511 -0
- signalpilot_ai_internal/database_config_handlers.py +182 -0
- signalpilot_ai_internal/database_config_service.py +166 -0
- signalpilot_ai_internal/databricks_schema_service.py +907 -0
- signalpilot_ai_internal/file_scanner_service.py +5 -146
- signalpilot_ai_internal/handlers.py +388 -9
- signalpilot_ai_internal/integrations_config.py +256 -0
- signalpilot_ai_internal/log_utils.py +31 -0
- signalpilot_ai_internal/mcp_handlers.py +532 -0
- signalpilot_ai_internal/mcp_server_manager.py +298 -0
- signalpilot_ai_internal/mcp_service.py +1255 -0
- signalpilot_ai_internal/oauth_token_store.py +141 -0
- signalpilot_ai_internal/schema_search_config.yml +17 -11
- signalpilot_ai_internal/schema_search_service.py +85 -4
- signalpilot_ai_internal/signalpilot_home.py +961 -0
- signalpilot_ai_internal/snowflake_schema_service.py +2 -0
- signalpilot_ai_internal/test_dbt_mcp_server.py +180 -0
- signalpilot_ai_internal/unified_database_schema_service.py +2 -0
- signalpilot_ai_internal-0.10.0.data/data/share/jupyter/labextensions/signalpilot-ai-internal/schemas/signalpilot-ai-internal/package.json.orig → signalpilot_ai_internal-0.11.24.data/data/share/jupyter/labextensions/signalpilot-ai-internal/package.json +15 -48
- signalpilot_ai_internal-0.10.0.data/data/share/jupyter/labextensions/signalpilot-ai-internal/package.json → signalpilot_ai_internal-0.11.24.data/data/share/jupyter/labextensions/signalpilot-ai-internal/schemas/signalpilot-ai-internal/package.json.orig +9 -52
- {signalpilot_ai_internal-0.10.0.data → signalpilot_ai_internal-0.11.24.data}/data/share/jupyter/labextensions/signalpilot-ai-internal/schemas/signalpilot-ai-internal/plugin.json +7 -1
- signalpilot_ai_internal-0.11.24.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/122.bab318d6caadb055e29c.js +1 -0
- signalpilot_ai_internal-0.11.24.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/129.868ca665e6fc225c20a0.js +1 -0
- signalpilot_ai_internal-0.11.24.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/179.fd45a2e75d471d0aa3b9.js +7 -0
- signalpilot_ai_internal-0.11.24.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/220.81105a94aa873fc51a94.js +1 -0
- signalpilot_ai_internal-0.11.24.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/262.a002dd4630d3b6404a90.js +1 -0
- signalpilot_ai_internal-0.11.24.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/353.cc6f6ecacd703bcdb468.js +1 -0
- signalpilot_ai_internal-0.11.24.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/364.817a883549d55a0e0576.js +1 -0
- signalpilot_ai_internal-0.11.24.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/384.a4daecd44f1e9364e44a.js +1 -0
- signalpilot_ai_internal-0.11.24.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/439.667225aab294fb5ed161.js +1 -0
- signalpilot_ai_internal-0.11.24.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/447.8138af2522716e5a926f.js +1 -0
- signalpilot_ai_internal-0.11.24.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/476.925c73e32f3c07448da0.js +1 -0
- signalpilot_ai_internal-0.11.24.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/477.aaa4cc9e87801fb45f5b.js +1 -0
- signalpilot_ai_internal-0.11.24.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/481.370056149a59022b700c.js +1 -0
- signalpilot_ai_internal-0.11.24.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/510.868ca665e6fc225c20a0.js +1 -0
- signalpilot_ai_internal-0.11.24.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/512.835f97f7ccfc70ff5c93.js +1 -0
- signalpilot_ai_internal-0.11.24.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/57.6c13335f73de089d6b1e.js +1 -0
- signalpilot_ai_internal-0.11.24.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/574.ad2709e91ebcac5bbe68.js +1 -0
- signalpilot_ai_internal-0.11.24.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/635.bddbab8e464fe31f0393.js +1 -0
- signalpilot_ai_internal-0.11.24.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/713.fda1bcdb10497b0a6ade.js +1 -0
- signalpilot_ai_internal-0.11.24.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/741.d046701f475fcbf6697d.js +1 -0
- signalpilot_ai_internal-0.11.24.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/785.c306dffd4cfe8a613d13.js +1 -0
- signalpilot_ai_internal-0.11.24.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/801.e39898b6f336539f228c.js +1 -0
- signalpilot_ai_internal-0.11.24.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/880.77cc0ca10a1860df1b52.js +1 -0
- signalpilot_ai_internal-0.11.24.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/936.4e2850b2af985ed0d378.js +1 -0
- signalpilot_ai_internal-0.11.24.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/956.eeffe67d7781fd63ef4b.js +2 -0
- signalpilot_ai_internal-0.11.24.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/remoteEntry.055f50d20a31f3068c72.js +1 -0
- {signalpilot_ai_internal-0.10.0.data → signalpilot_ai_internal-0.11.24.data}/data/share/jupyter/labextensions/signalpilot-ai-internal/static/third-party-licenses.json +47 -29
- {signalpilot_ai_internal-0.10.0.dist-info → signalpilot_ai_internal-0.11.24.dist-info}/METADATA +14 -31
- signalpilot_ai_internal-0.11.24.dist-info/RECORD +66 -0
- signalpilot_ai_internal-0.11.24.dist-info/licenses/LICENSE +7 -0
- signalpilot_ai_internal-0.10.0.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/122.e2dadf63dc64d7b5f1ee.js +0 -1
- signalpilot_ai_internal-0.10.0.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/220.328403b5545f268b95c6.js +0 -1
- signalpilot_ai_internal-0.10.0.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/262.726e1da31a50868cb297.js +0 -1
- signalpilot_ai_internal-0.10.0.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/330.af2e9cb5def5ae2b84d5.js +0 -1
- signalpilot_ai_internal-0.10.0.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/353.972abe1d2d66f083f9cc.js +0 -1
- signalpilot_ai_internal-0.10.0.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/364.dbec4c2dc12e7b050dcc.js +0 -1
- signalpilot_ai_internal-0.10.0.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/384.fa432bdb7fb6b1c95ad6.js +0 -1
- signalpilot_ai_internal-0.10.0.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/439.37e271d7a80336daabe2.js +0 -1
- signalpilot_ai_internal-0.10.0.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/476.ad22ccddd74ee306fb56.js +0 -1
- signalpilot_ai_internal-0.10.0.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/481.73c7a9290b7d35a8b9c1.js +0 -1
- signalpilot_ai_internal-0.10.0.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/512.b58fc0093d080b8ee61c.js +0 -1
- signalpilot_ai_internal-0.10.0.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/553.b4042a795c91d9ff71ef.js +0 -2
- signalpilot_ai_internal-0.10.0.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/57.e9acd2e1f9739037f1ab.js +0 -1
- signalpilot_ai_internal-0.10.0.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/635.9720593ee20b768da3ca.js +0 -1
- signalpilot_ai_internal-0.10.0.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/713.8e6edc9a965bdd578ca7.js +0 -1
- signalpilot_ai_internal-0.10.0.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/741.dc49867fafb03ea2ba4d.js +0 -1
- signalpilot_ai_internal-0.10.0.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/742.91e7b516c8699eea3373.js +0 -1
- signalpilot_ai_internal-0.10.0.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/785.2d75de1a8d2c3131a8db.js +0 -1
- signalpilot_ai_internal-0.10.0.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/786.770dc7bcab77e14cc135.js +0 -7
- signalpilot_ai_internal-0.10.0.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/801.ca9e114a30896b669a3c.js +0 -1
- signalpilot_ai_internal-0.10.0.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/880.25ddd15aca09421d3765.js +0 -1
- signalpilot_ai_internal-0.10.0.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/888.34054db17bcf6e87ec95.js +0 -1
- signalpilot_ai_internal-0.10.0.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/remoteEntry.b05b2f0c9617ba28370d.js +0 -1
- signalpilot_ai_internal-0.10.0.dist-info/RECORD +0 -50
- signalpilot_ai_internal-0.10.0.dist-info/licenses/LICENSE +0 -29
- {signalpilot_ai_internal-0.10.0.data → signalpilot_ai_internal-0.11.24.data}/data/etc/jupyter/jupyter_server_config.d/signalpilot_ai.json +0 -0
- {signalpilot_ai_internal-0.10.0.data → signalpilot_ai_internal-0.11.24.data}/data/share/jupyter/labextensions/signalpilot-ai-internal/install.json +0 -0
- /signalpilot_ai_internal-0.10.0.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/553.b4042a795c91d9ff71ef.js.LICENSE.txt → /signalpilot_ai_internal-0.11.24.data/data/share/jupyter/labextensions/signalpilot-ai-internal/static/956.eeffe67d7781fd63ef4b.js.LICENSE.txt +0 -0
- {signalpilot_ai_internal-0.10.0.data → signalpilot_ai_internal-0.11.24.data}/data/share/jupyter/labextensions/signalpilot-ai-internal/static/style.js +0 -0
- {signalpilot_ai_internal-0.10.0.dist-info → signalpilot_ai_internal-0.11.24.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Database Configuration Service
|
|
3
|
+
Manages database configurations stored in db.toml in the connect/ cache directory
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import logging
|
|
7
|
+
from typing import Any, Dict, List, Optional
|
|
8
|
+
|
|
9
|
+
from .signalpilot_home import get_signalpilot_home
|
|
10
|
+
|
|
11
|
+
logger = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class DatabaseConfigService:
|
|
15
|
+
"""
|
|
16
|
+
Service for managing database configurations in TOML format.
|
|
17
|
+
Configurations stored at <cache_dir>/connect/db.toml
|
|
18
|
+
(e.g., ~/Library/Caches/SignalPilotAI/connect/db.toml on macOS)
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
_instance = None
|
|
22
|
+
|
|
23
|
+
# Supported database types
|
|
24
|
+
SUPPORTED_TYPES = ["snowflake", "postgres", "mysql", "databricks"]
|
|
25
|
+
|
|
26
|
+
def __init__(self):
|
|
27
|
+
self._home_manager = get_signalpilot_home()
|
|
28
|
+
|
|
29
|
+
@classmethod
|
|
30
|
+
def get_instance(cls) -> 'DatabaseConfigService':
|
|
31
|
+
"""Get singleton instance."""
|
|
32
|
+
if cls._instance is None:
|
|
33
|
+
cls._instance = DatabaseConfigService()
|
|
34
|
+
return cls._instance
|
|
35
|
+
|
|
36
|
+
def get_all_configs(self) -> List[Dict[str, Any]]:
|
|
37
|
+
"""Get all database configurations."""
|
|
38
|
+
return self._home_manager.get_database_configs()
|
|
39
|
+
|
|
40
|
+
def get_config(self, db_type: str, name: str) -> Optional[Dict[str, Any]]:
|
|
41
|
+
"""Get a specific database configuration."""
|
|
42
|
+
return self._home_manager.get_database_config(db_type, name)
|
|
43
|
+
|
|
44
|
+
def get_configs_by_type(self, db_type: str) -> List[Dict[str, Any]]:
|
|
45
|
+
"""Get all configurations for a specific database type."""
|
|
46
|
+
configs = self.get_all_configs()
|
|
47
|
+
return [c for c in configs if c.get("type") == db_type]
|
|
48
|
+
|
|
49
|
+
def add_config(self, db_type: str, config: Dict[str, Any]) -> bool:
|
|
50
|
+
"""Add a new database configuration."""
|
|
51
|
+
if db_type not in self.SUPPORTED_TYPES:
|
|
52
|
+
logger.error(f"Unsupported database type: {db_type}")
|
|
53
|
+
return False
|
|
54
|
+
|
|
55
|
+
if "name" not in config:
|
|
56
|
+
logger.error("Database config must have a 'name' field")
|
|
57
|
+
return False
|
|
58
|
+
|
|
59
|
+
return self._home_manager.add_database_config(db_type, config)
|
|
60
|
+
|
|
61
|
+
def update_config(self, db_type: str, name: str,
|
|
62
|
+
updates: Dict[str, Any]) -> bool:
|
|
63
|
+
"""Update an existing database configuration."""
|
|
64
|
+
return self._home_manager.update_database_config(db_type, name, updates)
|
|
65
|
+
|
|
66
|
+
def remove_config(self, db_type: str, name: str) -> bool:
|
|
67
|
+
"""Remove a database configuration."""
|
|
68
|
+
return self._home_manager.remove_database_config(db_type, name)
|
|
69
|
+
|
|
70
|
+
def set_defaults(self, defaults: Dict[str, Any]) -> bool:
|
|
71
|
+
"""Set global defaults for database configurations."""
|
|
72
|
+
return self._home_manager.set_database_defaults(defaults)
|
|
73
|
+
|
|
74
|
+
def get_defaults(self) -> Dict[str, Any]:
|
|
75
|
+
"""Get global defaults."""
|
|
76
|
+
return self._home_manager.get_database_defaults()
|
|
77
|
+
|
|
78
|
+
# ==================== Type-specific helpers ====================
|
|
79
|
+
|
|
80
|
+
def add_snowflake_config(self, name: str, account: str,
|
|
81
|
+
database: str = None,
|
|
82
|
+
warehouse: str = None,
|
|
83
|
+
role: str = None,
|
|
84
|
+
username: str = None,
|
|
85
|
+
password: str = None,
|
|
86
|
+
**extra) -> bool:
|
|
87
|
+
"""Add a Snowflake database configuration."""
|
|
88
|
+
config = {
|
|
89
|
+
"name": name,
|
|
90
|
+
"account": account,
|
|
91
|
+
}
|
|
92
|
+
if database:
|
|
93
|
+
config["database"] = database
|
|
94
|
+
if warehouse:
|
|
95
|
+
config["warehouse"] = warehouse
|
|
96
|
+
if role:
|
|
97
|
+
config["role"] = role
|
|
98
|
+
if username:
|
|
99
|
+
config["username"] = username
|
|
100
|
+
if password:
|
|
101
|
+
config["password"] = password
|
|
102
|
+
config.update(extra)
|
|
103
|
+
|
|
104
|
+
return self.add_config("snowflake", config)
|
|
105
|
+
|
|
106
|
+
def add_postgres_config(self, name: str, host: str, port: int,
|
|
107
|
+
database: str, username: str, password: str,
|
|
108
|
+
**extra) -> bool:
|
|
109
|
+
"""Add a PostgreSQL database configuration."""
|
|
110
|
+
config = {
|
|
111
|
+
"name": name,
|
|
112
|
+
"host": host,
|
|
113
|
+
"port": port,
|
|
114
|
+
"database": database,
|
|
115
|
+
"username": username,
|
|
116
|
+
"password": password,
|
|
117
|
+
}
|
|
118
|
+
config.update(extra)
|
|
119
|
+
|
|
120
|
+
return self.add_config("postgres", config)
|
|
121
|
+
|
|
122
|
+
def add_mysql_config(self, name: str, host: str, port: int,
|
|
123
|
+
database: str, username: str, password: str,
|
|
124
|
+
**extra) -> bool:
|
|
125
|
+
"""Add a MySQL database configuration."""
|
|
126
|
+
config = {
|
|
127
|
+
"name": name,
|
|
128
|
+
"host": host,
|
|
129
|
+
"port": port,
|
|
130
|
+
"database": database,
|
|
131
|
+
"username": username,
|
|
132
|
+
"password": password,
|
|
133
|
+
}
|
|
134
|
+
config.update(extra)
|
|
135
|
+
|
|
136
|
+
return self.add_config("mysql", config)
|
|
137
|
+
|
|
138
|
+
def add_databricks_config(self, name: str, host: str,
|
|
139
|
+
http_path: str, catalog: str,
|
|
140
|
+
auth_type: str = "pat",
|
|
141
|
+
access_token: str = None,
|
|
142
|
+
client_id: str = None,
|
|
143
|
+
client_secret: str = None,
|
|
144
|
+
**extra) -> bool:
|
|
145
|
+
"""Add a Databricks database configuration."""
|
|
146
|
+
config = {
|
|
147
|
+
"name": name,
|
|
148
|
+
"host": host,
|
|
149
|
+
"http_path": http_path,
|
|
150
|
+
"catalog": catalog,
|
|
151
|
+
"auth_type": auth_type,
|
|
152
|
+
}
|
|
153
|
+
if access_token:
|
|
154
|
+
config["access_token"] = access_token
|
|
155
|
+
if client_id:
|
|
156
|
+
config["client_id"] = client_id
|
|
157
|
+
if client_secret:
|
|
158
|
+
config["client_secret"] = client_secret
|
|
159
|
+
config.update(extra)
|
|
160
|
+
|
|
161
|
+
return self.add_config("databricks", config)
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def get_database_config_service() -> DatabaseConfigService:
|
|
165
|
+
"""Get the singleton instance."""
|
|
166
|
+
return DatabaseConfigService.get_instance()
|