hyper-sentinel 2.3.2__tar.gz → 2.3.4__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.
- {hyper_sentinel-2.3.2/src/hyper_sentinel.egg-info → hyper_sentinel-2.3.4}/PKG-INFO +1 -1
- {hyper_sentinel-2.3.2 → hyper_sentinel-2.3.4}/pyproject.toml +1 -1
- {hyper_sentinel-2.3.2 → hyper_sentinel-2.3.4/src/hyper_sentinel.egg-info}/PKG-INFO +1 -1
- {hyper_sentinel-2.3.2 → hyper_sentinel-2.3.4}/src/sentinel/__init__.py +1 -1
- {hyper_sentinel-2.3.2 → hyper_sentinel-2.3.4}/src/sentinel/cli.py +68 -9
- {hyper_sentinel-2.3.2 → hyper_sentinel-2.3.4}/LICENSE +0 -0
- {hyper_sentinel-2.3.2 → hyper_sentinel-2.3.4}/README.md +0 -0
- {hyper_sentinel-2.3.2 → hyper_sentinel-2.3.4}/setup.cfg +0 -0
- {hyper_sentinel-2.3.2 → hyper_sentinel-2.3.4}/src/hyper_sentinel.egg-info/SOURCES.txt +0 -0
- {hyper_sentinel-2.3.2 → hyper_sentinel-2.3.4}/src/hyper_sentinel.egg-info/dependency_links.txt +0 -0
- {hyper_sentinel-2.3.2 → hyper_sentinel-2.3.4}/src/hyper_sentinel.egg-info/entry_points.txt +0 -0
- {hyper_sentinel-2.3.2 → hyper_sentinel-2.3.4}/src/hyper_sentinel.egg-info/requires.txt +0 -0
- {hyper_sentinel-2.3.2 → hyper_sentinel-2.3.4}/src/hyper_sentinel.egg-info/top_level.txt +0 -0
- {hyper_sentinel-2.3.2 → hyper_sentinel-2.3.4}/src/sentinel/client.py +0 -0
- {hyper_sentinel-2.3.2 → hyper_sentinel-2.3.4}/src/sentinel/exceptions.py +0 -0
- {hyper_sentinel-2.3.2 → hyper_sentinel-2.3.4}/src/sentinel/py.typed +0 -0
- {hyper_sentinel-2.3.2 → hyper_sentinel-2.3.4}/tests/test_client.py +0 -0
- {hyper_sentinel-2.3.2 → hyper_sentinel-2.3.4}/tests/test_integration.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: hyper-sentinel
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.4
|
|
4
4
|
Summary: Python SDK for Sentinel — 80+ crypto trading, AI, and market intelligence tools. Free access, usage-based fees.
|
|
5
5
|
Author-email: Sentinel Labs <dev@hyper-sentinel.com>
|
|
6
6
|
License-Expression: AGPL-3.0-only
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "hyper-sentinel"
|
|
7
|
-
version = "2.3.
|
|
7
|
+
version = "2.3.4"
|
|
8
8
|
description = "Python SDK for Sentinel — 80+ crypto trading, AI, and market intelligence tools. Free access, usage-based fees."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "AGPL-3.0-only"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: hyper-sentinel
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.4
|
|
4
4
|
Summary: Python SDK for Sentinel — 80+ crypto trading, AI, and market intelligence tools. Free access, usage-based fees.
|
|
5
5
|
Author-email: Sentinel Labs <dev@hyper-sentinel.com>
|
|
6
6
|
License-Expression: AGPL-3.0-only
|
|
@@ -543,6 +543,8 @@ def _show_status():
|
|
|
543
543
|
if config.get("sentinel_api_key"):
|
|
544
544
|
key_preview = config["sentinel_api_key"][:16] + "..."
|
|
545
545
|
auth.add_row("🔑 API Key", f"[s.green]● {key_preview}[/]", "~/.sentinel/config")
|
|
546
|
+
elif config.get("ai_key"):
|
|
547
|
+
auth.add_row("🔑 API Key", "[s.cyan]● AI key set[/] [s.dim](gateway sync pending)[/]", "~/.sentinel/config")
|
|
546
548
|
else:
|
|
547
549
|
auth.add_row("🔑 API Key", "[s.dim]○ Not configured[/]", "run sentinel-setup")
|
|
548
550
|
|
|
@@ -576,7 +578,7 @@ def _show_status():
|
|
|
576
578
|
gw.add_row("🔧 Tools", "[s.green]● 62+ registered[/]", "crypto · equities · AI · social · trading")
|
|
577
579
|
|
|
578
580
|
# Test connectivity if we have a key
|
|
579
|
-
if config.get("sentinel_api_key"):
|
|
581
|
+
if config.get("sentinel_api_key") or config.get("ai_key"):
|
|
580
582
|
gw.add_row("📶 Status", "[s.dim]run 'sentinel test' to verify[/]", "")
|
|
581
583
|
else:
|
|
582
584
|
gw.add_row("📶 Status", "[s.dim]○ Not authenticated[/]", "run sentinel-setup")
|
|
@@ -676,11 +678,29 @@ def _run_test():
|
|
|
676
678
|
padding=(0, 3),
|
|
677
679
|
))
|
|
678
680
|
|
|
679
|
-
if not config.get("sentinel_api_key"):
|
|
681
|
+
if not config.get("sentinel_api_key") and not config.get("ai_key"):
|
|
680
682
|
console.print(" [s.error]✗ No API key found[/] — run [bold]sentinel-setup[/] first.\n")
|
|
681
683
|
return
|
|
682
684
|
|
|
683
|
-
|
|
685
|
+
# If we have ai_key but no sentinel_api_key, try to register now
|
|
686
|
+
api_key = config.get("sentinel_api_key", "")
|
|
687
|
+
if not api_key and config.get("ai_key"):
|
|
688
|
+
console.print(" [s.dim]Registering with gateway...[/]", end=" ")
|
|
689
|
+
result = _register_with_gateway(config["ai_key"])
|
|
690
|
+
if result.get("api_key"):
|
|
691
|
+
api_key = result["api_key"]
|
|
692
|
+
config["sentinel_api_key"] = api_key
|
|
693
|
+
config["user_id"] = result.get("user_id", "")
|
|
694
|
+
config["tier"] = result.get("tier", "free")
|
|
695
|
+
_save_config(config)
|
|
696
|
+
console.print("[s.cyan]✓[/]")
|
|
697
|
+
else:
|
|
698
|
+
console.print("[s.dim]gateway unavailable — test may fail[/]")
|
|
699
|
+
|
|
700
|
+
if not api_key:
|
|
701
|
+
console.print(" [s.error]✗ Could not obtain API key from gateway.[/]\n")
|
|
702
|
+
return
|
|
703
|
+
|
|
684
704
|
key_preview = api_key[:16] + "..."
|
|
685
705
|
console.print(f" [s.dim]Key: {key_preview}[/]")
|
|
686
706
|
console.print(f" [s.dim]Gateway: {GATEWAY_URL}[/]")
|
|
@@ -697,7 +717,7 @@ def _run_test():
|
|
|
697
717
|
import httpx
|
|
698
718
|
client = httpx.Client(
|
|
699
719
|
base_url=GATEWAY_URL,
|
|
700
|
-
timeout=
|
|
720
|
+
timeout=10.0,
|
|
701
721
|
headers={"X-API-Key": api_key, "Content-Type": "application/json"},
|
|
702
722
|
)
|
|
703
723
|
|
|
@@ -973,10 +993,20 @@ def _handle_upgrade(plan: str = "pro"):
|
|
|
973
993
|
if not config.get("sentinel_api_key") and not config.get("ai_key"):
|
|
974
994
|
console.print(" [s.error]✗ Not authenticated[/] — run [bold]sentinel-setup[/] first.\n")
|
|
975
995
|
return
|
|
996
|
+
# Try to get sentinel_api_key if we only have ai_key
|
|
997
|
+
if not config.get("sentinel_api_key") and config.get("ai_key"):
|
|
998
|
+
result = _register_with_gateway(config["ai_key"])
|
|
999
|
+
if result.get("api_key"):
|
|
1000
|
+
config["sentinel_api_key"] = result["api_key"]
|
|
1001
|
+
config["tier"] = result.get("tier", "free")
|
|
1002
|
+
_save_config(config)
|
|
1003
|
+
if not config.get("sentinel_api_key"):
|
|
1004
|
+
console.print(" [s.dim]Gateway unavailable — try 'sentinel upgrade' again in a moment.[/]\n")
|
|
1005
|
+
return
|
|
976
1006
|
console.print(f"\n [s.magenta]💎 Upgrading to {plan.title()}...[/]")
|
|
977
1007
|
try:
|
|
978
1008
|
from sentinel import SentinelClient
|
|
979
|
-
url = SentinelClient().upgrade(plan)
|
|
1009
|
+
url = SentinelClient(api_key=config["sentinel_api_key"], timeout=10).upgrade(plan)
|
|
980
1010
|
console.print(f" [s.cyan]✓ Checkout URL:[/] {url}")
|
|
981
1011
|
import webbrowser
|
|
982
1012
|
webbrowser.open(url)
|
|
@@ -995,12 +1025,31 @@ def _show_billing():
|
|
|
995
1025
|
if not config.get("sentinel_api_key") and not config.get("ai_key"):
|
|
996
1026
|
console.print(" [s.error]✗ Not authenticated[/] — run [bold]sentinel-setup[/] first.\n")
|
|
997
1027
|
return
|
|
1028
|
+
# Try to get sentinel_api_key if we only have ai_key
|
|
1029
|
+
if not config.get("sentinel_api_key") and config.get("ai_key"):
|
|
1030
|
+
result = _register_with_gateway(config["ai_key"])
|
|
1031
|
+
if result.get("api_key"):
|
|
1032
|
+
config["sentinel_api_key"] = result["api_key"]
|
|
1033
|
+
config["tier"] = result.get("tier", "free")
|
|
1034
|
+
_save_config(config)
|
|
1035
|
+
if not config.get("sentinel_api_key"):
|
|
1036
|
+
# Show offline billing from local config
|
|
1037
|
+
console.print()
|
|
1038
|
+
tbl = Table(title="[bold cyan]🛡️ Billing Status[/] [s.dim](offline)[/]", title_justify="left",
|
|
1039
|
+
show_header=False, box=box.SIMPLE_HEAVY, border_style="cyan", padding=(0, 2))
|
|
1040
|
+
tbl.add_column("", style="bold white", min_width=18)
|
|
1041
|
+
tbl.add_column("", min_width=40)
|
|
1042
|
+
tbl.add_row("Tier", f"[s.cyan]{t_info['label']}[/] [s.dim]({t_info['price']})[/]")
|
|
1043
|
+
tbl.add_row("Rate Limit", f"[s.cyan]{t_info['rate']}[/]")
|
|
1044
|
+
tbl.add_row("LLM Markup", t_info["llm"])
|
|
1045
|
+
tbl.add_row("Trade Fees", f"maker {t_info['maker']} / taker {t_info['taker']}")
|
|
1046
|
+
console.print(tbl)
|
|
1047
|
+
console.print(" [s.dim]Gateway unavailable — billing data from local config.[/]\n")
|
|
1048
|
+
return
|
|
998
1049
|
console.print()
|
|
999
|
-
tier = config.get("tier", "free")
|
|
1000
|
-
t_info = TIER_INFO.get(tier, TIER_INFO["free"])
|
|
1001
1050
|
try:
|
|
1002
1051
|
from sentinel import SentinelClient
|
|
1003
|
-
data = SentinelClient().billing_status()
|
|
1052
|
+
data = SentinelClient(api_key=config["sentinel_api_key"], timeout=10).billing_status()
|
|
1004
1053
|
tier = data.get("tier", "free")
|
|
1005
1054
|
t_info = TIER_INFO.get(tier, TIER_INFO["free"])
|
|
1006
1055
|
tbl = Table(title="[bold cyan]🛡️ Billing Status[/]", title_justify="left",
|
|
@@ -1032,10 +1081,20 @@ def _show_tools():
|
|
|
1032
1081
|
if not config.get("sentinel_api_key") and not config.get("ai_key"):
|
|
1033
1082
|
console.print(" [s.error]✗ Not authenticated[/] — run [bold]sentinel-setup[/] first.\n")
|
|
1034
1083
|
return
|
|
1084
|
+
# Try to get sentinel_api_key if we only have ai_key
|
|
1085
|
+
if not config.get("sentinel_api_key") and config.get("ai_key"):
|
|
1086
|
+
result = _register_with_gateway(config["ai_key"])
|
|
1087
|
+
if result.get("api_key"):
|
|
1088
|
+
config["sentinel_api_key"] = result["api_key"]
|
|
1089
|
+
config["tier"] = result.get("tier", "free")
|
|
1090
|
+
_save_config(config)
|
|
1091
|
+
if not config.get("sentinel_api_key"):
|
|
1092
|
+
console.print(" [s.dim]Gateway unavailable — try again in a moment.[/]\n")
|
|
1093
|
+
return
|
|
1035
1094
|
console.print()
|
|
1036
1095
|
try:
|
|
1037
1096
|
from sentinel import SentinelClient
|
|
1038
|
-
tools = SentinelClient().list_tools()
|
|
1097
|
+
tools = SentinelClient(api_key=config["sentinel_api_key"], timeout=10).list_tools()
|
|
1039
1098
|
tbl = Table(title=f"[bold cyan]🔧 Available Tools ({len(tools)})[/]", title_justify="left",
|
|
1040
1099
|
show_header=True, box=box.SIMPLE_HEAVY, border_style="cyan", padding=(0, 2))
|
|
1041
1100
|
tbl.add_column("Tool", style="s.cyan.bold", min_width=28)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{hyper_sentinel-2.3.2 → hyper_sentinel-2.3.4}/src/hyper_sentinel.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|