darwin-agentic-cloud 3.0.1__tar.gz → 3.0.2__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 (89) hide show
  1. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/.gitignore +7 -0
  2. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/CHANGELOG.md +18 -0
  3. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/PKG-INFO +7 -2
  4. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/README.md +6 -1
  5. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/darwin/__init__.py +1 -1
  6. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/darwin/agenticcloud/cli.py +59 -0
  7. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/darwin/agenticcloud/ui.py +97 -0
  8. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/pyproject.toml +1 -1
  9. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/.dockerignore +0 -0
  10. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/CODE_OF_CONDUCT.md +0 -0
  11. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/CONTRIBUTING.md +0 -0
  12. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/DARWIN_AGENTIC_CLOUD_PHASE_2_PROGRESS_2of3.md +0 -0
  13. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/DARWIN_AGENTIC_CLOUD_PHASE_2_SPEC.md +0 -0
  14. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/Dockerfile +0 -0
  15. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/LAUNCH_POST_v3.0.0.md +0 -0
  16. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/LICENSE +0 -0
  17. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/Makefile +0 -0
  18. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/QUICKSTART.md +0 -0
  19. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/SECURITY.md +0 -0
  20. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/darwin/agenticcloud/__init__.py +0 -0
  21. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/darwin/agenticcloud/admin_cli.py +0 -0
  22. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/darwin/agenticcloud/attestation.py +0 -0
  23. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/darwin/agenticcloud/class_keys.py +0 -0
  24. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/darwin/agenticcloud/cost.py +0 -0
  25. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/darwin/agenticcloud/hashing.py +0 -0
  26. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/darwin/agenticcloud/mcp_server.py +0 -0
  27. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/darwin/agenticcloud/router.py +0 -0
  28. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/darwin/agenticcloud/runtime.py +0 -0
  29. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/darwin/agenticcloud/runtime_v02.py +0 -0
  30. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/darwin/agenticcloud/sandbox.py +0 -0
  31. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/darwin/agenticcloud/schemas/__init__.py +0 -0
  32. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/darwin/agenticcloud/schemas/attestation_v0_2.json +0 -0
  33. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/darwin/agenticcloud/server.py +0 -0
  34. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/darwin/agenticcloud/signing.py +0 -0
  35. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/darwin/agenticcloud/storage.py +0 -0
  36. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/darwin/agenticcloud/substrate/__init__.py +0 -0
  37. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/darwin/agenticcloud/substrate/aws_batch.py +0 -0
  38. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/darwin/agenticcloud/substrate/aws_batch_event.py +0 -0
  39. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/darwin/agenticcloud/substrate/aws_lambda.py +0 -0
  40. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/darwin/agenticcloud/substrate/aws_lambda_event.py +0 -0
  41. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/darwin/agenticcloud/substrate/aws_pricing.py +0 -0
  42. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/darwin/agenticcloud/substrate/base.py +0 -0
  43. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/darwin/agenticcloud/substrate/identity.py +0 -0
  44. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/darwin/agenticcloud/substrate/local_docker.py +0 -0
  45. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/darwin/agenticcloud/substrate/modal.py +0 -0
  46. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/darwin/agenticcloud/templates/demo.html +0 -0
  47. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/darwin/agenticcloud/templates/demo_attestation.json +0 -0
  48. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/darwin/agenticcloud/templates/docs.html +0 -0
  49. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/darwin/agenticcloud/types.py +0 -0
  50. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/docker-entrypoint.sh +0 -0
  51. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/docs/AGENT_INVENTORY.md +0 -0
  52. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/examples/example_workloads/hello.py +0 -0
  53. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/examples/hello.py +0 -0
  54. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/fly.toml +0 -0
  55. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/infra/__init__.py +0 -0
  56. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/infra/aws_runner/Dockerfile.batch-runner-python +0 -0
  57. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/infra/aws_runner/Dockerfile.runner-node +0 -0
  58. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/infra/aws_runner/Dockerfile.runner-python +0 -0
  59. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/infra/aws_runner/__init__.py +0 -0
  60. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/infra/aws_runner/batch_deploy.py +0 -0
  61. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/infra/aws_runner/batch_runner.py +0 -0
  62. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/infra/aws_runner/deploy.py +0 -0
  63. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/infra/aws_runner/runner.mjs +0 -0
  64. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/infra/aws_runner/runner.py +0 -0
  65. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/infra/bake_demo_attestation.py +0 -0
  66. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/infra/batch_smoketest.py +0 -0
  67. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/infra/modal_smoketest.py +0 -0
  68. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/tests/__init__.py +0 -0
  69. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/tests/fixtures/ec2_ondemand_m5xlarge.json +0 -0
  70. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/tests/fixtures/ec2_spot_history_m5xlarge.json +0 -0
  71. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/tests/runtime/__init__.py +0 -0
  72. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/tests/runtime/test_router.py +0 -0
  73. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/tests/runtime/test_runtime_v02.py +0 -0
  74. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/tests/substrate/test_aws_batch.py +0 -0
  75. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/tests/substrate/test_aws_lambda.py +0 -0
  76. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/tests/substrate/test_aws_pricing.py +0 -0
  77. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/tests/substrate/test_base.py +0 -0
  78. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/tests/substrate/test_identity.py +0 -0
  79. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/tests/substrate/test_local_docker.py +0 -0
  80. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/tests/substrate/test_modal.py +0 -0
  81. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/tests/test_admin_cli.py +0 -0
  82. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/tests/test_attestation.py +0 -0
  83. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/tests/test_class_keys.py +0 -0
  84. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/tests/test_cost.py +0 -0
  85. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/tests/test_server_signing.py +0 -0
  86. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/tests/test_smoke.py +0 -0
  87. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/tests/test_storage.py +0 -0
  88. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/tests/test_ui.py +0 -0
  89. {darwin_agentic_cloud-3.0.1 → darwin_agentic_cloud-3.0.2}/uv.lock +0 -0
@@ -100,3 +100,10 @@ logs/
100
100
  # DAC-specific
101
101
  attestations/
102
102
  .dac-state/
103
+
104
+ # macOS Finder duplicate artifacts
105
+ * 2.md
106
+ * 2.sh
107
+ * 2.lock
108
+ *\ 2/
109
+ README.v2.0.0.md.bak
@@ -7,6 +7,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [3.0.2] — 2026-05-28
11
+
12
+ ### Added
13
+
14
+ - First-run welcome banner. When a user runs any `darwin` command for the first
15
+ time after install, an ASCII brand banner prints with the tagline, motto, three
16
+ starter commands, and links to demo, repo, and docs. Shown once per install
17
+ via a marker file at `~/.darwin/welcomed`. Suppressed in non-interactive shells
18
+ (pipes, scripts, CI) and when `DARWIN_SUPPRESS_WELCOME=1` is set.
19
+ - `darwin welcome` command to re-trigger the banner on demand.
20
+
21
+ ### Internal
22
+
23
+ - New `render_welcome()` and `print_welcome()` functions in
24
+ `darwin/agenticcloud/ui.py`, reusing the existing `BANNER`, `BRAND_GREEN`,
25
+ `BRAND_AMBER`, and `BRAND_DIM` brand tokens for visual continuity with the
26
+ attestation cert panel.
27
+
10
28
  ## [3.0.1] — 2026-05-27
11
29
 
12
30
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: darwin-agentic-cloud
3
- Version: 3.0.1
3
+ Version: 3.0.2
4
4
  Summary: Darwin — adaptive software systems. Includes darwin.agenticcloud, the verifiable agentic cloud. Open-source compute for AI agents with cryptographically signed attestations.
5
5
  Project-URL: Homepage, https://github.com/vje013/darwin-agentic-cloud
6
6
  Project-URL: Repository, https://github.com/vje013/darwin-agentic-cloud
@@ -275,7 +275,7 @@ Description-Content-Type: text/markdown
275
275
  [![Python: 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)
276
276
  [![Schema: v0.2](https://img.shields.io/badge/schema-v0.2-FFB86C.svg)](https://darwin-agentic-cloud.fly.dev/.well-known/schemas/attestation/v0.2)
277
277
 
278
- > **Verifiable compute for AI agents.** Every workload signed. Every cost capped. Every routing decision auditable. Open verification, paid signing.
278
+ > **Verifiable compute for AI agents.** Every workload signed. Every cost capped. Every routing decision auditable. Open source, verified, free compute.
279
279
 
280
280
  **Install:** `pip install darwin-agentic-cloud`
281
281
 
@@ -285,6 +285,11 @@ Description-Content-Type: text/markdown
285
285
 
286
286
  **v0.2 Schema:** https://darwin-agentic-cloud.fly.dev/.well-known/schemas/attestation/v0.2
287
287
 
288
+ ---
289
+ ## Darwin's Mission
290
+
291
+ Increase AI adoption by increasing AI safety.
292
+
288
293
  ---
289
294
 
290
295
  ## The question agents can't answer today
@@ -6,7 +6,7 @@
6
6
  [![Python: 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)
7
7
  [![Schema: v0.2](https://img.shields.io/badge/schema-v0.2-FFB86C.svg)](https://darwin-agentic-cloud.fly.dev/.well-known/schemas/attestation/v0.2)
8
8
 
9
- > **Verifiable compute for AI agents.** Every workload signed. Every cost capped. Every routing decision auditable. Open verification, paid signing.
9
+ > **Verifiable compute for AI agents.** Every workload signed. Every cost capped. Every routing decision auditable. Open source, verified, free compute.
10
10
 
11
11
  **Install:** `pip install darwin-agentic-cloud`
12
12
 
@@ -16,6 +16,11 @@
16
16
 
17
17
  **v0.2 Schema:** https://darwin-agentic-cloud.fly.dev/.well-known/schemas/attestation/v0.2
18
18
 
19
+ ---
20
+ ## Darwin's Mission
21
+
22
+ Increase AI adoption by increasing AI safety.
23
+
19
24
  ---
20
25
 
21
26
  ## The question agents can't answer today
@@ -5,7 +5,7 @@ A family of modules:
5
5
  (more to come)
6
6
  """
7
7
 
8
- __version__ = "3.0.1"
8
+ __version__ = "3.0.2"
9
9
  __author__ = "Vladimir J Edouard"
10
10
  __license__ = "Apache-2.0"
11
11
 
@@ -14,6 +14,8 @@ Examples:
14
14
  from __future__ import annotations
15
15
 
16
16
  import json
17
+ import os
18
+ import sys
17
19
  from datetime import UTC
18
20
  from pathlib import Path
19
21
  from typing import Annotated
@@ -35,6 +37,63 @@ app = typer.Typer(
35
37
  no_args_is_help=True,
36
38
  add_completion=False,
37
39
  )
40
+
41
+
42
+ # -------------------------------------------------------------------
43
+ # First-run welcome
44
+ # -------------------------------------------------------------------
45
+
46
+ _WELCOME_MARKER = Path.home() / ".darwin" / "welcomed"
47
+
48
+
49
+ def _show_welcome_if_first_run() -> None:
50
+ """Print the welcome banner exactly once per user install.
51
+
52
+ Suppressed in non-interactive shells, when piped, or when the user
53
+ sets DARWIN_SUPPRESS_WELCOME=1. The marker file at
54
+ ~/.darwin/welcomed records that the user has been welcomed.
55
+ """
56
+ try:
57
+ if not sys.stdout.isatty():
58
+ return
59
+ if os.environ.get("DARWIN_SUPPRESS_WELCOME"):
60
+ return
61
+ if _WELCOME_MARKER.exists():
62
+ return
63
+
64
+ from darwin import __version__ as _v
65
+ from darwin.agenticcloud.ui import print_welcome
66
+
67
+ print_welcome(Console(), version=_v)
68
+
69
+ _WELCOME_MARKER.parent.mkdir(parents=True, exist_ok=True)
70
+ _WELCOME_MARKER.touch()
71
+ except Exception:
72
+ # Welcome banner must never block real commands. If anything
73
+ # goes wrong here (terminal weirdness, IO error, etc.), swallow
74
+ # silently and proceed with the user's command.
75
+ pass
76
+
77
+
78
+ @app.callback()
79
+ def _root(ctx: typer.Context) -> None:
80
+ """Darwin Agentic Cloud — verifiable compute for AI agents."""
81
+ # The `welcome` command renders the banner itself; skip the
82
+ # auto-trigger here to avoid double-rendering.
83
+ if ctx.invoked_subcommand == "welcome":
84
+ return
85
+ _show_welcome_if_first_run()
86
+
87
+
88
+ @app.command()
89
+ def welcome() -> None:
90
+ """Show the Darwin welcome banner."""
91
+ from darwin import __version__ as _v
92
+ from darwin.agenticcloud.ui import print_welcome
93
+
94
+ print_welcome(Console(), version=_v)
95
+
96
+
38
97
  keys_app = typer.Typer(help="Manage signing keys.", no_args_is_help=True)
39
98
  attest_app = typer.Typer(help="Work with attestations.", no_args_is_help=True)
40
99
  history_app = typer.Typer(help="Query attestation history.", no_args_is_help=True)
@@ -91,6 +91,103 @@ def print_banner(
91
91
  console.print()
92
92
 
93
93
 
94
+ # -------------------------------------------------------------------
95
+ # First-run welcome
96
+ # -------------------------------------------------------------------
97
+
98
+
99
+ def render_welcome(
100
+ version: str,
101
+ demo_url: str = "https://darwin-agentic-cloud.fly.dev/demo",
102
+ repo_url: str = "https://github.com/vje013/darwin-agentic-cloud",
103
+ docs_url: str = "https://darwin-agentic-cloud.fly.dev/docs",
104
+ ) -> Group:
105
+ """First-run welcome: ASCII banner + tagline + 3 commands + links.
106
+
107
+ Visually distinct from `render_banner()` (which prints version/signer
108
+ metadata for repeat users). Designed to orient a new user in their
109
+ first 30 seconds with the tool.
110
+ """
111
+ parts: list = []
112
+
113
+ parts.append(Text(BANNER, style=f"bold {BRAND_GREEN}"))
114
+ parts.append(Text(""))
115
+
116
+ motto = Text()
117
+ motto.append(" ")
118
+ motto.append("✦", style=f"bold {BRAND_AMBER}")
119
+ motto.append(" SECURITAS · STABILITAS · SIGNUM ", style=BRAND_GREEN)
120
+ motto.append("✦", style=f"bold {BRAND_AMBER}")
121
+ parts.append(motto)
122
+ parts.append(Text(""))
123
+
124
+ parts.append(Text(" Verifiable and free compute for AI agents.", style=f"bold {BRAND_GREEN}"))
125
+ parts.append(
126
+ Text(" Cryptographically signed execution attestations.", style=f"bold {BRAND_GREEN}")
127
+ )
128
+ parts.append(Text(" MCP-native.", style=f"bold {BRAND_GREEN}"))
129
+ parts.append(Text(""))
130
+
131
+ parts.append(Text(" " + "─" * 59, style=BRAND_DIM))
132
+ parts.append(Text(""))
133
+
134
+ parts.append(Text(" Try it in 3 commands:", style=f"bold {BRAND_GREEN}"))
135
+ parts.append(Text(""))
136
+
137
+ cmd1 = Text(" 1. ", style=f"bold {BRAND_GREEN}")
138
+ cmd1.append("darwin list", style=f"bold {BRAND_GREEN}")
139
+ parts.append(cmd1)
140
+ parts.append(
141
+ Text(" See which compute substrates are available right now.", style=BRAND_GREEN)
142
+ )
143
+ parts.append(Text(""))
144
+
145
+ cmd2 = Text(" 2. ", style=f"bold {BRAND_GREEN}")
146
+ cmd2.append("echo 'print(\"hello\")' > hello.py", style=BRAND_GREEN)
147
+ parts.append(cmd2)
148
+ parts.append(Text(" darwin run hello.py --save att.json", style=f"bold {BRAND_GREEN}"))
149
+ parts.append(Text(" Execute a workload, get a signed attestation.", style=BRAND_GREEN))
150
+ parts.append(Text(""))
151
+
152
+ cmd3 = Text(" 3. ", style=f"bold {BRAND_GREEN}")
153
+ cmd3.append("darwin verify att.json", style=f"bold {BRAND_GREEN}")
154
+ parts.append(cmd3)
155
+ parts.append(
156
+ Text(" Cryptographically verify the attestation against", style=BRAND_GREEN)
157
+ )
158
+ parts.append(Text(" the public keylist.", style=BRAND_GREEN))
159
+ parts.append(Text(""))
160
+
161
+ parts.append(Text(" " + "─" * 59, style=BRAND_DIM))
162
+ parts.append(Text(""))
163
+
164
+ link_demo = Text(" Live demo: ", style=BRAND_GREEN)
165
+ link_demo.append(demo_url, style=f"underline {BRAND_GREEN}")
166
+ parts.append(link_demo)
167
+
168
+ link_repo = Text(" GitHub: ", style=BRAND_GREEN)
169
+ link_repo.append(repo_url, style=f"underline {BRAND_GREEN}")
170
+ parts.append(link_repo)
171
+
172
+ link_docs = Text(" Docs: ", style=BRAND_GREEN)
173
+ link_docs.append(docs_url, style=f"underline {BRAND_GREEN}")
174
+ parts.append(link_docs)
175
+
176
+ parts.append(Text(""))
177
+
178
+ parts.append(Text(" This message shown once per install.", style=BRAND_DIM))
179
+ parts.append(Text(" Run `darwin welcome` to see it again.", style=BRAND_DIM))
180
+
181
+ return Group(*parts)
182
+
183
+
184
+ def print_welcome(console: Console, version: str) -> None:
185
+ """Convenience: print the welcome with appropriate vertical spacing."""
186
+ console.print()
187
+ console.print(render_welcome(version=version))
188
+ console.print()
189
+
190
+
94
191
  # -------------------------------------------------------------------
95
192
  # Matrix boot sequence
96
193
  # -------------------------------------------------------------------
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "darwin-agentic-cloud"
3
- version = "3.0.1"
3
+ version = "3.0.2"
4
4
  description = "Darwin — adaptive software systems. Includes darwin.agenticcloud, the verifiable agentic cloud. Open-source compute for AI agents with cryptographically signed attestations."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"