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.
Files changed (18) hide show
  1. {hyper_sentinel-2.3.2/src/hyper_sentinel.egg-info → hyper_sentinel-2.3.4}/PKG-INFO +1 -1
  2. {hyper_sentinel-2.3.2 → hyper_sentinel-2.3.4}/pyproject.toml +1 -1
  3. {hyper_sentinel-2.3.2 → hyper_sentinel-2.3.4/src/hyper_sentinel.egg-info}/PKG-INFO +1 -1
  4. {hyper_sentinel-2.3.2 → hyper_sentinel-2.3.4}/src/sentinel/__init__.py +1 -1
  5. {hyper_sentinel-2.3.2 → hyper_sentinel-2.3.4}/src/sentinel/cli.py +68 -9
  6. {hyper_sentinel-2.3.2 → hyper_sentinel-2.3.4}/LICENSE +0 -0
  7. {hyper_sentinel-2.3.2 → hyper_sentinel-2.3.4}/README.md +0 -0
  8. {hyper_sentinel-2.3.2 → hyper_sentinel-2.3.4}/setup.cfg +0 -0
  9. {hyper_sentinel-2.3.2 → hyper_sentinel-2.3.4}/src/hyper_sentinel.egg-info/SOURCES.txt +0 -0
  10. {hyper_sentinel-2.3.2 → hyper_sentinel-2.3.4}/src/hyper_sentinel.egg-info/dependency_links.txt +0 -0
  11. {hyper_sentinel-2.3.2 → hyper_sentinel-2.3.4}/src/hyper_sentinel.egg-info/entry_points.txt +0 -0
  12. {hyper_sentinel-2.3.2 → hyper_sentinel-2.3.4}/src/hyper_sentinel.egg-info/requires.txt +0 -0
  13. {hyper_sentinel-2.3.2 → hyper_sentinel-2.3.4}/src/hyper_sentinel.egg-info/top_level.txt +0 -0
  14. {hyper_sentinel-2.3.2 → hyper_sentinel-2.3.4}/src/sentinel/client.py +0 -0
  15. {hyper_sentinel-2.3.2 → hyper_sentinel-2.3.4}/src/sentinel/exceptions.py +0 -0
  16. {hyper_sentinel-2.3.2 → hyper_sentinel-2.3.4}/src/sentinel/py.typed +0 -0
  17. {hyper_sentinel-2.3.2 → hyper_sentinel-2.3.4}/tests/test_client.py +0 -0
  18. {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.2
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.2"
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.2
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
@@ -21,7 +21,7 @@ from sentinel.exceptions import (
21
21
  ToolNotFoundError,
22
22
  )
23
23
 
24
- __version__ = "2.3.2"
24
+ __version__ = "2.3.4"
25
25
  __all__ = [
26
26
  "SentinelClient",
27
27
  "SentinelError",
@@ -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
- api_key = config["sentinel_api_key"]
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=30.0,
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