Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
04d9eaa
Progress on at triggers
ismellike Dec 2, 2025
ac593d7
has_start_atproto_stream
ismellike Dec 2, 2025
91b9333
Update events.wit
ismellike Dec 2, 2025
08cecf9
add config
ismellike Dec 2, 2025
793184d
wkg wit fetch
ismellike Dec 4, 2025
cf42c3b
Update bindings
ismellike Dec 4, 2025
7514aef
at proto support in echo data
ismellike Dec 4, 2025
6d75ba8
just wasi-build-native
ismellike Dec 4, 2025
67a8147
atproto echo data test
ismellike Dec 4, 2025
0c2add3
atproto-echo
ismellike Dec 5, 2025
cf3d09a
no jetstream compression
ismellike Dec 5, 2025
bc701d9
Working e2e
ismellike Dec 5, 2025
c020429
Update atproto_jetstream.rs
ismellike Dec 5, 2025
958ecae
Update atproto_jetstream.rs
ismellike Dec 5, 2025
63ea938
Merge branch 'main' into at-protocol-triggers
ismellike Dec 5, 2025
7e8fbbc
Remove default jetstream config
ismellike Dec 8, 2025
92f0ea3
Merge branch 'at-protocol-triggers' of https://github.com/Lay3rLabs/W…
ismellike Dec 8, 2025
644e5a2
Update atproto_jetstream.rs
ismellike Dec 8, 2025
35376d5
at proto action + cli
ismellike Dec 8, 2025
5b693c0
Update trigger.rs
ismellike Dec 8, 2025
93f9427
just download-wit at-protocol-triggers
ismellike Dec 8, 2025
2d5fc45
Ignore sequence and timestamp from eventIdSalt creation
ismellike Dec 8, 2025
4e722c8
Add rev + op_index
ismellike Dec 8, 2025
c207ae5
all tests
ismellike Dec 10, 2025
4e973c3
Improve at proto eventidsalt comment
ismellike Dec 10, 2025
f7c633b
Remove redundant TryFrom atprotoaction
ismellike Dec 10, 2025
1d8a56d
Remove jetstream truncation
ismellike Dec 10, 2025
ba65bc9
Use strongly-typed JetStreamEvent
ismellike Dec 10, 2025
d740547
just wasi-build-native
ismellike Dec 10, 2025
0151331
Improve jetstream types
ismellike Dec 10, 2025
fe307d8
Improve connection state handling
ismellike Dec 10, 2025
030bcda
Split at_proto triggers into exact and pattern
ismellike Dec 10, 2025
026f287
Improve jetstream url creation
ismellike Dec 10, 2025
291258f
Add metrics for jetstream
ismellike Dec 10, 2025
fc3829a
bump version
ismellike Dec 10, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 24 additions & 22 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ split-debuginfo = "unpacked"

[workspace.package]
edition = "2021"
version = "2.0.0-rc.8"
version = "2.0.0-rc.9"
license = "GPL-3.0-or-later"
authors = ["Layer Labs (Cayman)"]
repository = "https://github.com/Lay3rLabs/WAVS"
Expand Down
22 changes: 11 additions & 11 deletions checksums.txt
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
49f13595653139b26ce6d4906068cc9ebf7653388d17db9ac842cdaeb4b8947c ./examples/build/components/chain_trigger_lookup.wasm
66b0d53dc12e7b129e595aa7833e30fa2d3a8c83b3784b94b8b53372e2d01e70 ./examples/build/components/cosmos_query.wasm
2f1ed9ec91bdfa67ae8a10ec91851a446a3edf328349b2ab60ed942e753005c3 ./examples/build/components/echo_block_interval.wasm
a832577cef71c406e3a2b2e62399b76a2cc21c8ca275049d4511312cc612709a ./examples/build/components/echo_cron_interval.wasm
232c4e66312d17d8b1d7b1b0b69b16720d5a61a84ebd7343eecff873c5ba0128 ./examples/build/components/echo_data.wasm
0fd4871e78fca7a4bb8c5673820217989bfe71ca932e990cf07511a65d842393 ./examples/build/components/example_helpers.wasm
83fc7cebc10ad4a2f0903a3a3172cfad66bdc04a703e837048630b5a530791d8 ./examples/build/components/chain_trigger_lookup.wasm
4b685d3b70400b9d34bb3c332bfb9e753eff606ba495a3f2a203b132cb2c97b5 ./examples/build/components/cosmos_query.wasm
9cf528fb697b636a4bc506a827dbb0bf0f1ea752f4ce1c31a0a93bc50473cef2 ./examples/build/components/echo_block_interval.wasm
0105aba97c40166bb043cbb5aad290319c6f13a5972a68027086c5923f332842 ./examples/build/components/echo_cron_interval.wasm
841b1ee7d96dc45f829b7051f8a01e5298262036aa3c4048be3d48e334ed5394 ./examples/build/components/echo_data.wasm
755735b2720aaadd753cbefabafebb76ef84f5b8745341669b0a30f03f4157df ./examples/build/components/example_helpers.wasm
980288228c1f56076eff41eff796fcbdf0d400890d4322f043e843559620fae2 ./examples/build/components/example_types.wasm
59f8d70572b29620807a4e9a2ec85c6069d1148bd6021277372478d8cedc1fed ./examples/build/components/kv_store.wasm
8d7a5c7e2b8e141d72fa04aa4d699417d69afddd9b6ffb840ce68da8d9c2424f ./examples/build/components/permissions.wasm
fe469ca930b46b071a599ed7bb25ae72d4c1dd25a3ed456386c1c7a7a302c5fa ./examples/build/components/simple_aggregator.wasm
780b81942931cc4793279e04f41fa44ef0c4ab98bf10d08e65d4215634583be7 ./examples/build/components/square.wasm
4705544270cbb69ac37ced36305f15dc9edf3fb390dfa172c01aae90f88fdc8d ./examples/build/components/timer_aggregator.wasm
f30378955c29cdd42f423adce5157974ac5b1620b3af9dcbe3d4574708b81052 ./examples/build/components/kv_store.wasm
4c4d271889fef308ff7768dff42f4e68c0ff40bcf0fbf94bafec863e71741e4d ./examples/build/components/permissions.wasm
f59d830593b785193c127546534098dec193385e8693e552751ad2b88d44dab4 ./examples/build/components/simple_aggregator.wasm
4c7d13f89bf7dad2175e758ee68849f3a2e3b92f5c938beaf7cd2a64bd968c7b ./examples/build/components/square.wasm
d670a5147ba8b6cb208b7917ffc1b5c2be9ebfd6e6ad64005210d06904a3955a ./examples/build/components/timer_aggregator.wasm
Binary file modified examples/build/components/chain_trigger_lookup.wasm
Binary file not shown.
Binary file modified examples/build/components/cosmos_query.wasm
Binary file not shown.
Binary file modified examples/build/components/echo_block_interval.wasm
Binary file not shown.
Binary file modified examples/build/components/echo_cron_interval.wasm
Binary file not shown.
Binary file modified examples/build/components/echo_data.wasm
Binary file not shown.
Binary file modified examples/build/components/example_helpers.wasm
Binary file not shown.
Binary file modified examples/build/components/kv_store.wasm
Binary file not shown.
Binary file modified examples/build/components/permissions.wasm
Binary file not shown.
Binary file modified examples/build/components/simple_aggregator.wasm
Binary file not shown.
Binary file modified examples/build/components/square.wasm
Binary file not shown.
Binary file modified examples/build/components/timer_aggregator.wasm
Binary file not shown.
15 changes: 14 additions & 1 deletion examples/components/_helpers/src/trigger.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@
use crate::bindings::world::wavs::{
operator::{input as component_input, output as component_output},
types::{
events::{TriggerDataCosmosContractEvent, TriggerDataEvmContractEvent},
events::{
TriggerDataAtprotoEvent, TriggerDataCosmosContractEvent, TriggerDataEvmContractEvent,
},
service::ServiceManager,
},
};
Expand Down Expand Up @@ -35,6 +37,17 @@ pub fn decode_trigger_event(trigger_data: component_input::TriggerData) -> Resul
Ok((trigger_info.triggerId, trigger_info.data.to_vec()))
}
component_input::TriggerData::Raw(bytes) => Ok((0, bytes)),
component_input::TriggerData::AtprotoEvent(TriggerDataAtprotoEvent {
record_data,
sequence,
..
}) => Ok((
sequence.try_into().expect("Expected sequence to be u64"),
record_data
.expect("Record data was not provided")
.as_bytes()
.to_vec(),
)),
_ => Err(anyhow::anyhow!("Unsupported trigger data type")),
}
}
Expand Down
4 changes: 3 additions & 1 deletion examples/components/echo-data/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,9 @@ impl Guest for Component {
}

let (maybe_trigger_id, data) = match trigger_action.data {
TriggerData::EvmContractEvent(_) | TriggerData::CosmosContractEvent(_) => {
TriggerData::EvmContractEvent(_)
| TriggerData::CosmosContractEvent(_)
| TriggerData::AtprotoEvent(_) => {
let (trigger_id, data) =
decode_trigger_event(trigger_action.data).map_err(|e| e.to_string())?;

Expand Down
22 changes: 21 additions & 1 deletion packages/cli/src/args.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@ use utils::{
serde::deserialize_vec_string,
};
use wasm_pkg_client::{PackageRef, Version};
use wavs_types::{ChainKey, ComponentDigest, Credential, ServiceStatus, Timestamp, WorkflowId};
use wavs_types::{
AtProtoAction, ChainKey, ComponentDigest, Credential, ServiceStatus, Timestamp, WorkflowId,
};

use crate::config::Config;

Expand Down Expand Up @@ -386,6 +388,24 @@ pub enum TriggerCommand {
#[clap(long)]
end_time: Option<Timestamp>,
},

/// Set an ATProto Jetstream event trigger for a workflow
SetAtProtocol {
/// Collection NSID to filter for (e.g., "app.bsky.feed.post")
/// Supports wildcards with prefix matching (e.g., "app.bsky.feed.*")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
/// Supports wildcards with prefix matching (e.g., "app.bsky.feed.*")
/// Supports wildcards with suffix matching (e.g., "app.bsky.feed.*")

the function matches at .*.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

imo correct as is, because the prefix is what's matched when using wildcard.

#[clap(long)]
collection: String,

/// Optional DID to filter for specific repositories
/// If not provided, will match events from any repository
#[clap(long)]
repo_did: Option<String>,

/// Action type to filter for (create, update, delete)
/// If not provided, will match all action types
#[clap(long)]
action: Option<AtProtoAction>,
},
}

impl Command {
Expand Down
23 changes: 23 additions & 0 deletions packages/cli/src/clients.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,29 @@ impl HttpClient {
Ok(response.digest)
}

pub async fn simulate_trigger(&self, req: wavs_types::SimulatedTriggerRequest) -> Result<()> {
let url = format!("{}/dev/triggers", self.endpoint);

let response = self
.inner
.post(&url)
.json(&req)
.send()
.await
.context("Failed to send simulated trigger request")?;

if response.status().is_success() {
Ok(())
} else {
let status = response.status();
let body = response
.text()
.await
.unwrap_or_else(|_| "<failed to read body>".to_string());
anyhow::bail!("{} from {}: {}", status, url, body);
}
}

pub async fn register_aggregator_service(
&self,
service_manager: &ServiceManager,
Expand Down
Loading