fusesell 1.2.3__py3-none-any.whl → 1.2.4__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.
Potentially problematic release.
This version of fusesell might be problematic. Click here for more details.
- {fusesell-1.2.3.dist-info → fusesell-1.2.4.dist-info}/METADATA +4 -2
- {fusesell-1.2.3.dist-info → fusesell-1.2.4.dist-info}/RECORD +8 -8
- fusesell_local/__init__.py +1 -1
- fusesell_local/utils/data_manager.py +81 -4
- {fusesell-1.2.3.dist-info → fusesell-1.2.4.dist-info}/WHEEL +0 -0
- {fusesell-1.2.3.dist-info → fusesell-1.2.4.dist-info}/entry_points.txt +0 -0
- {fusesell-1.2.3.dist-info → fusesell-1.2.4.dist-info}/licenses/LICENSE +0 -0
- {fusesell-1.2.3.dist-info → fusesell-1.2.4.dist-info}/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fusesell
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.4
|
|
4
4
|
Summary: Local implementation of FuseSell AI sales automation pipeline
|
|
5
5
|
Author-email: FuseSell Team <team@fusesell.ai>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -45,7 +45,9 @@ Dynamic: license-file
|
|
|
45
45
|
|
|
46
46
|
FuseSell Local is a production-ready implementation of the FuseSell AI sales automation system, converted from server-based YAML workflows to a comprehensive Python command-line tool with full data ownership and privacy control.
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
Latest release: `fusesell==1.2.1` is available on PyPI via `pip install fusesell`.
|
|
49
|
+
|
|
50
|
+
Contributors should review the [Repository Guidelines](AGENTS.md) before opening a pull request.
|
|
49
51
|
|
|
50
52
|
## 🚀 Complete Pipeline Overview
|
|
51
53
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
fusesell.py,sha256=t5PjkhWEJGINp4k517u0EX0ge7lzuHOUHHro-BE1mGk,596
|
|
2
|
-
fusesell-1.2.
|
|
3
|
-
fusesell_local/__init__.py,sha256=
|
|
2
|
+
fusesell-1.2.4.dist-info/licenses/LICENSE,sha256=GDz1ZoC4lB0kwjERpzqc_OdA_awYVso2aBnUH-ErW_w,1070
|
|
3
|
+
fusesell_local/__init__.py,sha256=5kIksTuzPSk57Yq7vqJC3pFHs9ZOyxaGSkA9QxqzEq0,966
|
|
4
4
|
fusesell_local/api.py,sha256=AcPune5YJdgi7nsMeusCUqc49z5UiycsQb6n3yiV_No,10839
|
|
5
5
|
fusesell_local/cli.py,sha256=MYnVxuEf5KTR4VcO3sc-VtP9NkWlSixJsYfOWST2Ds0,65859
|
|
6
6
|
fusesell_local/pipeline.py,sha256=KO5oAIHZ3L_uAZWOszauJyv0QWlsQMIDNGRuwQSxNmQ,39531
|
|
@@ -22,14 +22,14 @@ fusesell_local/tests/test_data_manager_sales_process.py,sha256=NbwxQ9oBKCZfrkRQY
|
|
|
22
22
|
fusesell_local/tests/test_data_manager_teams.py,sha256=kjk4V4r9ja4EVREIiQMxkuZd470SSwRHJAvpHln9KO4,4578
|
|
23
23
|
fusesell_local/utils/__init__.py,sha256=TVemlo0wpckhNUxP3a1Tky3ekswy8JdIHaXBlkKXKBQ,330
|
|
24
24
|
fusesell_local/utils/birthday_email_manager.py,sha256=NKLoUyzPedyhewZPma21SOoU8p9wPquehloer7TRA9U,20478
|
|
25
|
-
fusesell_local/utils/data_manager.py,sha256=
|
|
25
|
+
fusesell_local/utils/data_manager.py,sha256=MVozSojGXbIr9mhaTIt5bQrFO_1o-4BJux03FPW0jxA,180881
|
|
26
26
|
fusesell_local/utils/event_scheduler.py,sha256=rjtWwtYQoJP0YwoN1-43t6K9GpLfqRq3c7Fv4papvbI,25725
|
|
27
27
|
fusesell_local/utils/llm_client.py,sha256=FVc25UlGt6hro7h5Iw7PHSXY3E3_67Xc-SUbHuMSRs0,10437
|
|
28
28
|
fusesell_local/utils/logger.py,sha256=sWlV8Tjyz_Z8J4zXKOnNalh8_iD6ytfrwPZpD-wcEOs,6259
|
|
29
29
|
fusesell_local/utils/timezone_detector.py,sha256=0cAE4c8ZXqCA8AvxRKm6PrFKmAmsbq3HOHR6w-mW3KQ,39997
|
|
30
30
|
fusesell_local/utils/validators.py,sha256=Z1VzeoxFsnuzlIA_ZaMWoy-0Cgyqupd47kIdljlMDbs,15438
|
|
31
|
-
fusesell-1.2.
|
|
32
|
-
fusesell-1.2.
|
|
33
|
-
fusesell-1.2.
|
|
34
|
-
fusesell-1.2.
|
|
35
|
-
fusesell-1.2.
|
|
31
|
+
fusesell-1.2.4.dist-info/METADATA,sha256=cBzLD9FHG3yQu300mnPm48TKgNH1adgcF66gIF9vqHk,35074
|
|
32
|
+
fusesell-1.2.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
33
|
+
fusesell-1.2.4.dist-info/entry_points.txt,sha256=Vqek7tbiX7iF4rQkCRBZvT5WrB0HUduqKTsI2ZjhsXo,53
|
|
34
|
+
fusesell-1.2.4.dist-info/top_level.txt,sha256=VP9y1K6DEq6gNq2UgLd7ChujxViF6OzeAVCK7IUBXPA,24
|
|
35
|
+
fusesell-1.2.4.dist-info/RECORD,,
|
fusesell_local/__init__.py
CHANGED
|
@@ -4,10 +4,10 @@ Handles SQLite database operations and local file management
|
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
6
|
import sqlite3
|
|
7
|
-
import json
|
|
8
|
-
import os
|
|
9
|
-
import uuid
|
|
10
|
-
from typing import Dict, Any, List, Optional, Union
|
|
7
|
+
import json
|
|
8
|
+
import os
|
|
9
|
+
import uuid
|
|
10
|
+
from typing import Dict, Any, List, Optional, Sequence, Union
|
|
11
11
|
from datetime import datetime
|
|
12
12
|
import logging
|
|
13
13
|
from pathlib import Path
|
|
@@ -1408,6 +1408,83 @@ class LocalDataManager:
|
|
|
1408
1408
|
self.logger.error(f"Failed to get team settings: {str(e)}")
|
|
1409
1409
|
raise
|
|
1410
1410
|
|
|
1411
|
+
def build_team_settings_snapshot(
|
|
1412
|
+
self,
|
|
1413
|
+
team_id: str,
|
|
1414
|
+
sections: Optional[Sequence[str]] = None
|
|
1415
|
+
) -> Dict[str, Any]:
|
|
1416
|
+
"""
|
|
1417
|
+
Build a response payload containing team settings in the expected RealTimeX format.
|
|
1418
|
+
|
|
1419
|
+
Args:
|
|
1420
|
+
team_id: Team identifier
|
|
1421
|
+
sections: Optional sequence of section names to include. Accepts either
|
|
1422
|
+
full keys (e.g. ``gs_team_product``) or shorthand without the prefix.
|
|
1423
|
+
|
|
1424
|
+
Returns:
|
|
1425
|
+
Dictionary shaped as ``{"data": [{...}]}``. When no settings exist,
|
|
1426
|
+
returns ``{"data": []}``.
|
|
1427
|
+
"""
|
|
1428
|
+
settings = self.get_team_settings(team_id)
|
|
1429
|
+
if not settings:
|
|
1430
|
+
return {"data": []}
|
|
1431
|
+
|
|
1432
|
+
available_fields = [
|
|
1433
|
+
'gs_team_organization',
|
|
1434
|
+
'gs_team_rep',
|
|
1435
|
+
'gs_team_product',
|
|
1436
|
+
'gs_team_schedule_time',
|
|
1437
|
+
'gs_team_initial_outreach',
|
|
1438
|
+
'gs_team_follow_up',
|
|
1439
|
+
'gs_team_auto_interaction',
|
|
1440
|
+
'gs_team_followup_schedule_time',
|
|
1441
|
+
'gs_team_birthday_email',
|
|
1442
|
+
]
|
|
1443
|
+
|
|
1444
|
+
if sections:
|
|
1445
|
+
normalized = set()
|
|
1446
|
+
for item in sections:
|
|
1447
|
+
if not item:
|
|
1448
|
+
continue
|
|
1449
|
+
item = item.strip()
|
|
1450
|
+
if not item:
|
|
1451
|
+
continue
|
|
1452
|
+
if item.startswith("gs_team_"):
|
|
1453
|
+
normalized.add(item)
|
|
1454
|
+
else:
|
|
1455
|
+
normalized.add(f"gs_team_{item}")
|
|
1456
|
+
fields_to_include = [field for field in available_fields if field in normalized]
|
|
1457
|
+
else:
|
|
1458
|
+
fields_to_include = available_fields
|
|
1459
|
+
|
|
1460
|
+
list_like_fields = {
|
|
1461
|
+
'gs_team_organization',
|
|
1462
|
+
'gs_team_rep',
|
|
1463
|
+
'gs_team_product',
|
|
1464
|
+
'gs_team_auto_interaction',
|
|
1465
|
+
}
|
|
1466
|
+
|
|
1467
|
+
snapshot: Dict[str, Any] = {}
|
|
1468
|
+
for field in fields_to_include:
|
|
1469
|
+
value = settings.get(field)
|
|
1470
|
+
if value is None:
|
|
1471
|
+
continue
|
|
1472
|
+
|
|
1473
|
+
if field in list_like_fields:
|
|
1474
|
+
if isinstance(value, list):
|
|
1475
|
+
snapshot[field] = value
|
|
1476
|
+
elif value:
|
|
1477
|
+
snapshot[field] = [value]
|
|
1478
|
+
else:
|
|
1479
|
+
snapshot[field] = []
|
|
1480
|
+
else:
|
|
1481
|
+
snapshot[field] = value
|
|
1482
|
+
|
|
1483
|
+
if not snapshot:
|
|
1484
|
+
return {"data": []}
|
|
1485
|
+
|
|
1486
|
+
return {"data": [snapshot]}
|
|
1487
|
+
|
|
1411
1488
|
def _deserialize_product_row(self, row: sqlite3.Row) -> Dict[str, Any]:
|
|
1412
1489
|
"""
|
|
1413
1490
|
Convert a product row into a dictionary with JSON fields parsed.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|