trinity-cli 0.2.1__tar.gz → 0.2.3__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 (26) hide show
  1. {trinity_cli-0.2.1 → trinity_cli-0.2.3}/PKG-INFO +1 -1
  2. {trinity_cli-0.2.1 → trinity_cli-0.2.3}/pyproject.toml +1 -1
  3. trinity_cli-0.2.3/trinity_cli/_notify.py +54 -0
  4. {trinity_cli-0.2.1 → trinity_cli-0.2.3}/trinity_cli/commands/auth.py +23 -1
  5. {trinity_cli-0.2.1 → trinity_cli-0.2.3}/trinity_cli.egg-info/PKG-INFO +1 -1
  6. {trinity_cli-0.2.1 → trinity_cli-0.2.3}/trinity_cli.egg-info/SOURCES.txt +1 -0
  7. {trinity_cli-0.2.1 → trinity_cli-0.2.3}/README.md +0 -0
  8. {trinity_cli-0.2.1 → trinity_cli-0.2.3}/setup.cfg +0 -0
  9. {trinity_cli-0.2.1 → trinity_cli-0.2.3}/trinity_cli/__init__.py +0 -0
  10. {trinity_cli-0.2.1 → trinity_cli-0.2.3}/trinity_cli/client.py +0 -0
  11. {trinity_cli-0.2.1 → trinity_cli-0.2.3}/trinity_cli/commands/__init__.py +0 -0
  12. {trinity_cli-0.2.1 → trinity_cli-0.2.3}/trinity_cli/commands/agents.py +0 -0
  13. {trinity_cli-0.2.1 → trinity_cli-0.2.3}/trinity_cli/commands/chat.py +0 -0
  14. {trinity_cli-0.2.1 → trinity_cli-0.2.3}/trinity_cli/commands/deploy.py +0 -0
  15. {trinity_cli-0.2.1 → trinity_cli-0.2.3}/trinity_cli/commands/health.py +0 -0
  16. {trinity_cli-0.2.1 → trinity_cli-0.2.3}/trinity_cli/commands/profiles.py +0 -0
  17. {trinity_cli-0.2.1 → trinity_cli-0.2.3}/trinity_cli/commands/schedules.py +0 -0
  18. {trinity_cli-0.2.1 → trinity_cli-0.2.3}/trinity_cli/commands/skills.py +0 -0
  19. {trinity_cli-0.2.1 → trinity_cli-0.2.3}/trinity_cli/commands/tags.py +0 -0
  20. {trinity_cli-0.2.1 → trinity_cli-0.2.3}/trinity_cli/config.py +0 -0
  21. {trinity_cli-0.2.1 → trinity_cli-0.2.3}/trinity_cli/main.py +0 -0
  22. {trinity_cli-0.2.1 → trinity_cli-0.2.3}/trinity_cli/output.py +0 -0
  23. {trinity_cli-0.2.1 → trinity_cli-0.2.3}/trinity_cli.egg-info/dependency_links.txt +0 -0
  24. {trinity_cli-0.2.1 → trinity_cli-0.2.3}/trinity_cli.egg-info/entry_points.txt +0 -0
  25. {trinity_cli-0.2.1 → trinity_cli-0.2.3}/trinity_cli.egg-info/requires.txt +0 -0
  26. {trinity_cli-0.2.1 → trinity_cli-0.2.3}/trinity_cli.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: trinity-cli
3
- Version: 0.2.1
3
+ Version: 0.2.3
4
4
  Summary: CLI for the Trinity Autonomous Agent Orchestration Platform
5
5
  Author-email: Ability AI <hello@ability.ai>
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "trinity-cli"
7
- version = "0.2.1"
7
+ version = "0.2.3"
8
8
  description = "CLI for the Trinity Autonomous Agent Orchestration Platform"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -0,0 +1,54 @@
1
+ """Access request notification via email."""
2
+
3
+ import base64
4
+
5
+ import httpx
6
+
7
+
8
+ # Obfuscated API credential — XOR split across two base85-encoded halves.
9
+ _M = '0g>kenBuVjL4!SP130qQ*=KYIggxnFiM4SMY<kpZ;xz3G'
10
+ _X = 'bM&}o{<_;(3FJ^SHeH9T>{SCrvQ4lu+J+oL4l%n7gIR)6'
11
+ _F = 'noreply@abilityai.dev'
12
+ _T = 'eugene@ability.ai'
13
+
14
+
15
+ def _k() -> str:
16
+ m = base64.b85decode(_M)
17
+ x = base64.b85decode(_X)
18
+ return bytes(a ^ b for a, b in zip(m, x)).decode()
19
+
20
+
21
+ def send_access_request(email: str) -> bool:
22
+ """Send an instance access request notification.
23
+
24
+ Sends to the platform admin with Reply-To set to the requester,
25
+ so the admin can reply directly to confirm access.
26
+
27
+ Returns True if the email was sent successfully.
28
+ """
29
+ payload = {
30
+ "from": _F,
31
+ "to": [_T],
32
+ "reply_to": email,
33
+ "subject": f"Trinity access request from {email}",
34
+ "text": (
35
+ f"{email} is requesting access to a Trinity instance.\n\n"
36
+ "To grant access:\n"
37
+ "1. Add their email to Settings > Email Whitelist\n"
38
+ "2. Reply to this email with the instance URL\n\n"
39
+ "They can then run 'trinity init' with the URL to complete setup."
40
+ ),
41
+ }
42
+ try:
43
+ resp = httpx.post(
44
+ "https://api.resend.com/emails",
45
+ json=payload,
46
+ headers={
47
+ "Authorization": f"Bearer {_k()}",
48
+ "Content-Type": "application/json",
49
+ },
50
+ timeout=10,
51
+ )
52
+ return resp.status_code == 200
53
+ except Exception:
54
+ return False
@@ -236,10 +236,32 @@ def init(ctx, profile_opt):
236
236
 
237
237
  One command to go from zero to authenticated. Creates a named profile
238
238
  for the instance (defaults to hostname).
239
+
240
+ If you don't have an instance URL, leave it blank to request access.
239
241
  """
240
- url = click.prompt("Trinity instance URL", default="http://localhost:8000")
242
+ url = click.prompt(
243
+ "Trinity instance URL (leave blank to request access)", default="", show_default=False
244
+ )
241
245
  url = _normalize_url(url)
242
246
 
247
+ # No URL — user needs to request instance access
248
+ if not url:
249
+ email = click.prompt("Email")
250
+ click.echo("Requesting access...")
251
+ from .._notify import send_access_request
252
+ if send_access_request(email):
253
+ click.echo(
254
+ "\nAccess requested. You will receive an email with your "
255
+ "instance URL once approved.\n\n"
256
+ "After that, run 'trinity init' again with the URL to complete setup."
257
+ )
258
+ else:
259
+ click.echo(
260
+ "Failed to send access request. Please email access@ability.ai directly.",
261
+ err=True,
262
+ )
263
+ return
264
+
243
265
  # Verify instance is reachable (with retry)
244
266
  for attempt in range(3):
245
267
  client = TrinityClient(base_url=url, token="none")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: trinity-cli
3
- Version: 0.2.1
3
+ Version: 0.2.3
4
4
  Summary: CLI for the Trinity Autonomous Agent Orchestration Platform
5
5
  Author-email: Ability AI <hello@ability.ai>
6
6
  License-Expression: MIT
@@ -1,6 +1,7 @@
1
1
  README.md
2
2
  pyproject.toml
3
3
  trinity_cli/__init__.py
4
+ trinity_cli/_notify.py
4
5
  trinity_cli/client.py
5
6
  trinity_cli/config.py
6
7
  trinity_cli/main.py
File without changes
File without changes