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.

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fusesell
3
- Version: 1.2.3
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
- > Latest release: `fusesell==1.2.1` is available on PyPI via `pip install fusesell`.
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.dist-info/licenses/LICENSE,sha256=GDz1ZoC4lB0kwjERpzqc_OdA_awYVso2aBnUH-ErW_w,1070
3
- fusesell_local/__init__.py,sha256=fEvogPM4NPOiL4oLU9oK0HWECKyTvAGB4rSUr1XI-So,966
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=w2Ed0HAdkTg23r_Fz_v8j3H_jcXbgD_Xk_lfeySi9bk,178447
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.3.dist-info/METADATA,sha256=Izbft0CEbjY1O9NQebg5b6FxgMJpd8p24N8FDWE1e-o,34976
32
- fusesell-1.2.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
33
- fusesell-1.2.3.dist-info/entry_points.txt,sha256=Vqek7tbiX7iF4rQkCRBZvT5WrB0HUduqKTsI2ZjhsXo,53
34
- fusesell-1.2.3.dist-info/top_level.txt,sha256=VP9y1K6DEq6gNq2UgLd7ChujxViF6OzeAVCK7IUBXPA,24
35
- fusesell-1.2.3.dist-info/RECORD,,
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,,
@@ -32,6 +32,6 @@ __all__ = [
32
32
  "validate_config",
33
33
  ]
34
34
 
35
- __version__ = "1.2.3"
35
+ __version__ = "1.2.4"
36
36
  __author__ = "FuseSell Team"
37
37
  __description__ = "Local implementation of FuseSell AI sales automation pipeline"
@@ -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.