hyper-sentinel 2.3.3__tar.gz → 2.3.5__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.
Files changed (18) hide show
  1. {hyper_sentinel-2.3.3/src/hyper_sentinel.egg-info → hyper_sentinel-2.3.5}/PKG-INFO +1 -1
  2. {hyper_sentinel-2.3.3 → hyper_sentinel-2.3.5}/pyproject.toml +1 -1
  3. {hyper_sentinel-2.3.3 → hyper_sentinel-2.3.5/src/hyper_sentinel.egg-info}/PKG-INFO +1 -1
  4. {hyper_sentinel-2.3.3 → hyper_sentinel-2.3.5}/src/sentinel/__init__.py +1 -1
  5. {hyper_sentinel-2.3.3 → hyper_sentinel-2.3.5}/src/sentinel/cli.py +46 -5
  6. {hyper_sentinel-2.3.3 → hyper_sentinel-2.3.5}/LICENSE +0 -0
  7. {hyper_sentinel-2.3.3 → hyper_sentinel-2.3.5}/README.md +0 -0
  8. {hyper_sentinel-2.3.3 → hyper_sentinel-2.3.5}/setup.cfg +0 -0
  9. {hyper_sentinel-2.3.3 → hyper_sentinel-2.3.5}/src/hyper_sentinel.egg-info/SOURCES.txt +0 -0
  10. {hyper_sentinel-2.3.3 → hyper_sentinel-2.3.5}/src/hyper_sentinel.egg-info/dependency_links.txt +0 -0
  11. {hyper_sentinel-2.3.3 → hyper_sentinel-2.3.5}/src/hyper_sentinel.egg-info/entry_points.txt +0 -0
  12. {hyper_sentinel-2.3.3 → hyper_sentinel-2.3.5}/src/hyper_sentinel.egg-info/requires.txt +0 -0
  13. {hyper_sentinel-2.3.3 → hyper_sentinel-2.3.5}/src/hyper_sentinel.egg-info/top_level.txt +0 -0
  14. {hyper_sentinel-2.3.3 → hyper_sentinel-2.3.5}/src/sentinel/client.py +0 -0
  15. {hyper_sentinel-2.3.3 → hyper_sentinel-2.3.5}/src/sentinel/exceptions.py +0 -0
  16. {hyper_sentinel-2.3.3 → hyper_sentinel-2.3.5}/src/sentinel/py.typed +0 -0
  17. {hyper_sentinel-2.3.3 → hyper_sentinel-2.3.5}/tests/test_client.py +0 -0
  18. {hyper_sentinel-2.3.3 → hyper_sentinel-2.3.5}/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
3
+ Version: 2.3.5
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.3"
7
+ version = "2.3.5"
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
3
+ Version: 2.3.5
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
@@ -21,7 +21,7 @@ from sentinel.exceptions import (
21
21
  ToolNotFoundError,
22
22
  )
23
23
 
24
- __version__ = "2.3.3"
24
+ __version__ = "2.3.5"
25
25
  __all__ = [
26
26
  "SentinelClient",
27
27
  "SentinelError",
@@ -993,10 +993,20 @@ def _handle_upgrade(plan: str = "pro"):
993
993
  if not config.get("sentinel_api_key") and not config.get("ai_key"):
994
994
  console.print(" [s.error]✗ Not authenticated[/] — run [bold]sentinel-setup[/] first.\n")
995
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
996
1006
  console.print(f"\n [s.magenta]💎 Upgrading to {plan.title()}...[/]")
997
1007
  try:
998
1008
  from sentinel import SentinelClient
999
- url = SentinelClient().upgrade(plan)
1009
+ url = SentinelClient(api_key=config["sentinel_api_key"], timeout=10).upgrade(plan)
1000
1010
  console.print(f" [s.cyan]✓ Checkout URL:[/] {url}")
1001
1011
  import webbrowser
1002
1012
  webbrowser.open(url)
@@ -1012,15 +1022,36 @@ def _handle_upgrade(plan: str = "pro"):
1012
1022
  def _show_billing():
1013
1023
  """Show billing status from the gateway."""
1014
1024
  config = _load_config()
1025
+ tier = config.get("tier", "free")
1026
+ t_info = TIER_INFO.get(tier, TIER_INFO["free"])
1015
1027
  if not config.get("sentinel_api_key") and not config.get("ai_key"):
1016
1028
  console.print(" [s.error]✗ Not authenticated[/] — run [bold]sentinel-setup[/] first.\n")
1017
1029
  return
1030
+ # Try to get sentinel_api_key if we only have ai_key
1031
+ if not config.get("sentinel_api_key") and config.get("ai_key"):
1032
+ result = _register_with_gateway(config["ai_key"])
1033
+ if result.get("api_key"):
1034
+ config["sentinel_api_key"] = result["api_key"]
1035
+ config["tier"] = result.get("tier", "free")
1036
+ _save_config(config)
1037
+ if not config.get("sentinel_api_key"):
1038
+ # Show offline billing from local config
1039
+ console.print()
1040
+ tbl = Table(title="[bold cyan]🛡️ Billing Status[/] [s.dim](offline)[/]", title_justify="left",
1041
+ show_header=False, box=box.SIMPLE_HEAVY, border_style="cyan", padding=(0, 2))
1042
+ tbl.add_column("", style="bold white", min_width=18)
1043
+ tbl.add_column("", min_width=40)
1044
+ tbl.add_row("Tier", f"[s.cyan]{t_info['label']}[/] [s.dim]({t_info['price']})[/]")
1045
+ tbl.add_row("Rate Limit", f"[s.cyan]{t_info['rate']}[/]")
1046
+ tbl.add_row("LLM Markup", t_info["llm"])
1047
+ tbl.add_row("Trade Fees", f"maker {t_info['maker']} / taker {t_info['taker']}")
1048
+ console.print(tbl)
1049
+ console.print(" [s.dim]Gateway unavailable — billing data from local config.[/]\n")
1050
+ return
1018
1051
  console.print()
1019
- tier = config.get("tier", "free")
1020
- t_info = TIER_INFO.get(tier, TIER_INFO["free"])
1021
1052
  try:
1022
1053
  from sentinel import SentinelClient
1023
- data = SentinelClient().billing_status()
1054
+ data = SentinelClient(api_key=config["sentinel_api_key"], timeout=10).billing_status()
1024
1055
  tier = data.get("tier", "free")
1025
1056
  t_info = TIER_INFO.get(tier, TIER_INFO["free"])
1026
1057
  tbl = Table(title="[bold cyan]🛡️ Billing Status[/]", title_justify="left",
@@ -1052,10 +1083,20 @@ def _show_tools():
1052
1083
  if not config.get("sentinel_api_key") and not config.get("ai_key"):
1053
1084
  console.print(" [s.error]✗ Not authenticated[/] — run [bold]sentinel-setup[/] first.\n")
1054
1085
  return
1086
+ # Try to get sentinel_api_key if we only have ai_key
1087
+ if not config.get("sentinel_api_key") and config.get("ai_key"):
1088
+ result = _register_with_gateway(config["ai_key"])
1089
+ if result.get("api_key"):
1090
+ config["sentinel_api_key"] = result["api_key"]
1091
+ config["tier"] = result.get("tier", "free")
1092
+ _save_config(config)
1093
+ if not config.get("sentinel_api_key"):
1094
+ console.print(" [s.dim]Gateway unavailable — try again in a moment.[/]\n")
1095
+ return
1055
1096
  console.print()
1056
1097
  try:
1057
1098
  from sentinel import SentinelClient
1058
- tools = SentinelClient().list_tools()
1099
+ tools = SentinelClient(api_key=config["sentinel_api_key"], timeout=10).list_tools()
1059
1100
  tbl = Table(title=f"[bold cyan]🔧 Available Tools ({len(tools)})[/]", title_justify="left",
1060
1101
  show_header=True, box=box.SIMPLE_HEAVY, border_style="cyan", padding=(0, 2))
1061
1102
  tbl.add_column("Tool", style="s.cyan.bold", min_width=28)
File without changes
File without changes
File without changes