Skip to content

Commit 84a7356

Browse files
ZhiXiao-LinRoy Lin
andauthored
chore(release): v2.5.1 — programmable-CI SDK becomes a3s-box-sdk (#152)
Renames the programmable-CI pipeline crate a3s-box-ci -> a3s-box-sdk (the general Rust SDK; pipeline API under `a3s_box_sdk::pipeline`, error `pipeline::PipelineError`), and the former workload-execution a3s-box-sdk -> a3s-box-lambda (consumers update `use a3s_box_sdk` -> `use a3s_box_lambda`). Adds a3s-box-sdk to the crates.io publish list and bumps the workspace to 2.5.1. No runtime behavior change. Co-authored-by: Roy Lin <roylin@a3s.box>
1 parent 6d09511 commit 84a7356

16 files changed

Lines changed: 206 additions & 178 deletions

File tree

.github/workflows/release.yml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -296,8 +296,9 @@ jobs:
296296
echo "Publishing version $VERSION (in dependency order)"
297297
FAILED=""
298298
# Order matters: a dependent is published AFTER its internal deps so
299-
# the index has them. runtime depends on core + netproxy + libkrun-sys.
300-
for crate in a3s-libkrun-sys a3s-box-core a3s-box-netproxy a3s-box-runtime; do
299+
# the index has them. runtime depends on core + netproxy + libkrun-sys;
300+
# a3s-box-sdk is dependency-free (a thin CLI wrapper) so its position is free.
301+
for crate in a3s-libkrun-sys a3s-box-core a3s-box-netproxy a3s-box-runtime a3s-box-sdk; do
301302
code=$(curl -s -o /dev/null -w '%{http_code}' "https://crates.io/api/v1/crates/$crate/$VERSION")
302303
if [ "$code" = "200" ]; then
303304
echo "✓ $crate@$VERSION already on crates.io — skipping"

CHANGELOG.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,20 @@ All notable changes to A3S Box will be documented in this file.
44

55
## [Unreleased]
66

7+
## [2.5.1] — 2026-06-22
8+
9+
SDK crate naming. No runtime behavior change.
10+
11+
### Changed
12+
13+
- **`a3s-box-sdk` is now the general-purpose Rust SDK.** The programmable-CI pipeline
14+
API (added in 2.5.0 as the `a3s-box-ci` crate) is now `a3s-box-sdk`, under the
15+
`a3s_box_sdk::pipeline` module, so the SDK can grow beyond CI. The error type
16+
`CiError` is now `pipeline::PipelineError`. **`a3s-box-sdk` is published to crates.io.**
17+
- **The former `a3s-box-sdk` (MicroVM workload-execution SDK for a3s-lambda) is renamed
18+
to `a3s-box-lambda`.** Consumers (e.g. a3s-lambda) must update `use a3s_box_sdk::…`
19+
`use a3s_box_lambda::…`. It remains unpublished (path-only deps).
20+
721
## [2.5.0] — 2026-06-22
822

923
Programmable CI on a3s-box: copy-on-write snapshot restore — fork a warmed snapshot as

src/Cargo.lock

Lines changed: 28 additions & 28 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ members = [
99
"cri",
1010
"cli",
1111
"sdk",
12-
"ci",
12+
"lambda",
1313
]
1414
resolver = "2"
1515

@@ -23,7 +23,7 @@ resolver = "2"
2323
h2 = { path = "third_party/h2" }
2424

2525
[workspace.package]
26-
version = "2.5.0"
26+
version = "2.5.1"
2727
edition = "2021"
2828
authors = ["A3S Lab Team"]
2929
license = "MIT"

src/ci/Cargo.toml

Lines changed: 0 additions & 11 deletions
This file was deleted.

src/lambda/Cargo.toml

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
[package]
2+
name = "a3s-box-lambda"
3+
version.workspace = true
4+
edition = "2021"
5+
authors = ["A3S Lab"]
6+
license = "MIT"
7+
repository = "https://github.com/A3S-Lab/a3s"
8+
description = "A3S Box MicroVM workload-execution SDK (the VM-executor SDK for a3s-lambda)."
9+
10+
[dependencies]
11+
# Box runtime for VM management
12+
a3s-box-runtime = { path = "../runtime", features = ["vm", "pool"] }
13+
14+
# Core types
15+
a3s-box-core = { path = "../core" }
16+
17+
# Async runtime
18+
tokio = { workspace = true }
19+
async-trait = { workspace = true }
20+
21+
# Serialization
22+
serde = { workspace = true }
23+
serde_json = { workspace = true }
24+
25+
# Time
26+
chrono = { workspace = true }
27+
28+
# UUID
29+
uuid = { workspace = true }
30+
31+
# Error handling
32+
thiserror = { workspace = true }
33+
34+
# Logging
35+
tracing = { workspace = true }
36+
37+
# TEE/Attestation
38+
sha2 = { workspace = true }
39+
40+
# HTTP client
41+
reqwest = { workspace = true }
42+
43+
# HTML parsing for web extract
44+
scraper = "0.24"

src/lambda/src/lib.rs

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
//! A3S Box workload-execution SDK — MicroVM workload execution for Lambda.
2+
//!
3+
//! (Formerly the `a3s-box-sdk` crate; renamed to `a3s-box-lambda` so `a3s-box-sdk`
4+
//! can be the general-purpose Rust SDK. The programmable-CI pipeline API now lives
5+
//! in `a3s-box-sdk`.)
6+
//!
7+
//! This crate provides the SDK interface for executing workloads inside
8+
//! isolated A3S Box MicroVMs. It wraps the lower-level a3s-box-runtime
9+
//! to provide a simple execution interface.
10+
//!
11+
//! # Core Concepts
12+
//!
13+
//! - **ExecutionRegistry**: Main entry point for workload execution
14+
//! - **ExecutionAdapter**: Pluggable backends for different execution modes
15+
//! - **BoxWorkloadEnvelope**: Workload specification (runtime, entrypoint, input)
16+
//!
17+
//! # Example
18+
//!
19+
//! ```rust,no_run
20+
//! use a3s_box_lambda::{ExecutionRegistry, BoxWorkloadEnvelope, RuntimeClass, WorkloadKind, BoxRuntimeSpec};
21+
//! use std::time::Duration;
22+
//!
23+
//! #[tokio::main]
24+
//! async fn main() -> Result<(), Box<dyn std::error::Error>> {
25+
//! let registry = ExecutionRegistry::new();
26+
//!
27+
//! let envelope = BoxWorkloadEnvelope {
28+
//! runtime_class: RuntimeClass::A3sBox,
29+
//! workload_kind: WorkloadKind::ExecutionTask,
30+
//! runtime: BoxRuntimeSpec {
31+
//! runtime: "a3s/executor/http".into(),
32+
//! entrypoint: "a3s-executor".into(),
33+
//! args: vec!["--executor".into(), "http".into(), "--handler".into(), "get".into()],
34+
//! env: Default::default(),
35+
//! },
36+
//! input: serde_json::json!({"url": "https://example.com"}),
37+
//! labels: Default::default(),
38+
//! };
39+
//!
40+
//! let result = registry.execute_box_workload(&envelope, Duration::from_secs(300)).await;
41+
//! println!("Result: {:?}", result);
42+
//! Ok(())
43+
//! }
44+
//! ```
45+
46+
pub mod adapter;
47+
pub mod error;
48+
pub mod registry;
49+
pub mod vm;
50+
51+
pub use adapter::{
52+
CapabilityAccess, CapabilityRisk, ExecutionAdapter, ExecutionCapability,
53+
ExecutionCapabilityGrant, HttpExecutionAdapter,
54+
};
55+
pub use error::SdkError;
56+
pub use registry::{
57+
BoxRuntimePoolSnapshot, CapabilityMatchMode, ExecutionPolicy, ExecutionRegistry, Result,
58+
};
59+
pub use vm::{VmExecutor, VmPoolStats};
60+
61+
pub use a3s_box_core::{
62+
BoxRuntimeSpec, BoxWorkloadEnvelope, ExecutionLaunchMode, RuntimeClass, WorkloadKind,
63+
};

0 commit comments

Comments
 (0)