Skip to content
Merged
19 changes: 19 additions & 0 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
@@ -1,5 +1,5 @@
[workspace]
members = [".", "crates/ironclaw_common", "crates/ironclaw_host_api", "crates/ironclaw_filesystem", "crates/ironclaw_memory", "crates/ironclaw_events", "crates/ironclaw_event_projections", "crates/ironclaw_reborn_event_store", "crates/ironclaw_extensions", "crates/ironclaw_processes", "crates/ironclaw_dispatcher", "crates/ironclaw_scripts", "crates/ironclaw_mcp", "crates/ironclaw_wasm", "crates/ironclaw_wasm_sandbox_core", "crates/ironclaw_capabilities", "crates/ironclaw_secrets", "crates/ironclaw_network", "crates/ironclaw_host_runtime", "crates/ironclaw_runtime_policy", "crates/ironclaw_authorization", "crates/ironclaw_run_state", "crates/ironclaw_approvals", "crates/ironclaw_resources", "crates/ironclaw_trust", "crates/ironclaw_turns", "crates/ironclaw_agent_loop", "crates/ironclaw_threads", "crates/ironclaw_loop_support", "crates/ironclaw_reborn", "crates/ironclaw_reborn_config", "crates/ironclaw_reborn_composition", "crates/ironclaw_reborn_cli", "crates/ironclaw_conversations", "crates/ironclaw_product_adapters", "crates/ironclaw_product_workflow", "crates/ironclaw_product_adapter_registry", "crates/ironclaw_wasm_product_adapters", "crates/ironclaw_telegram_v2_adapter", "crates/ironclaw_outbound", "crates/ironclaw_architecture", "crates/ironclaw_safety", "crates/ironclaw_skills", "crates/ironclaw_llm", "crates/ironclaw_engine", "crates/ironclaw_gateway", "crates/ironclaw_tui", "crates/ironclaw_webui_v2"]
members = [".", "crates/ironclaw_common", "crates/ironclaw_host_api", "crates/ironclaw_filesystem", "crates/ironclaw_memory", "crates/ironclaw_events", "crates/ironclaw_event_projections", "crates/ironclaw_reborn_event_store", "crates/ironclaw_extensions", "crates/ironclaw_processes", "crates/ironclaw_dispatcher", "crates/ironclaw_scripts", "crates/ironclaw_mcp", "crates/ironclaw_wasm", "crates/ironclaw_wasm_sandbox_core", "crates/ironclaw_capabilities", "crates/ironclaw_secrets", "crates/ironclaw_network", "crates/ironclaw_host_runtime", "crates/ironclaw_runtime_policy", "crates/ironclaw_authorization", "crates/ironclaw_run_state", "crates/ironclaw_approvals", "crates/ironclaw_resources", "crates/ironclaw_trust", "crates/ironclaw_turns", "crates/ironclaw_agent_loop", "crates/ironclaw_threads", "crates/ironclaw_loop_support", "crates/ironclaw_reborn", "crates/ironclaw_reborn_config", "crates/ironclaw_reborn_composition", "crates/ironclaw_reborn_cli", "crates/ironclaw_conversations", "crates/ironclaw_product_adapters", "crates/ironclaw_product_workflow", "crates/ironclaw_product_workflow_storage", "crates/ironclaw_product_adapter_registry", "crates/ironclaw_wasm_product_adapters", "crates/ironclaw_telegram_v2_adapter", "crates/ironclaw_outbound", "crates/ironclaw_architecture", "crates/ironclaw_safety", "crates/ironclaw_skills", "crates/ironclaw_llm", "crates/ironclaw_engine", "crates/ironclaw_gateway", "crates/ironclaw_tui", "crates/ironclaw_webui_v2"]
exclude = [
"channels-src/discord",
"channels-src/feishu",
Expand Down
1 change: 0 additions & 1 deletion crates/ironclaw_product_workflow/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ ironclaw_reborn = { path = "../ironclaw_reborn" }
ironclaw_trust = { path = "../ironclaw_trust" }
ironclaw_product_workflow = { path = ".", features = ["test-support"] }
ironclaw_product_adapters = { path = "../ironclaw_product_adapters", features = ["test-support", "host-auth-mint"] }
serde_json = "1"
tempfile = "3"
tokio = { version = "1", features = ["macros", "rt", "sync", "time"] }
tokio-util = { version = "0.7", features = ["rt"] }
36 changes: 36 additions & 0 deletions crates/ironclaw_product_workflow_storage/AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# ironclaw_product_workflow_storage

Durable storage adapters for the product workflow idempotency ledger.

## Purpose

- Provide libSQL and PostgreSQL-backed implementations of
`ironclaw_product_workflow::IdempotencyLedger`.
- Persist product inbound action reservations and terminal outcomes through
`ironclaw_filesystem::RootFilesystem`.
- Preserve recovery-lease behavior for non-terminal reservations so retries do
not dispatch the same side effect concurrently.

## Boundaries

- This crate owns storage adapters only. Product workflow orchestration remains
in `ironclaw_product_workflow`.
- Keep durable records behind the existing `IdempotencyLedger` port; do not add
product workflow call paths around that trait.
- Use typed host and workflow values internally. Convert strings at boundaries.
- Keep libSQL and PostgreSQL behavior in parity when changing persistence
semantics.

## Validation

Run targeted checks from the workspace root:

```bash
cargo test -p ironclaw_product_workflow_storage --features libsql
cargo test -p ironclaw_product_workflow_storage --features postgres --no-run
cargo check -p ironclaw_product_workflow_storage --features "libsql postgres"
cargo clippy -p ironclaw_product_workflow_storage --all-targets --features "libsql postgres" -- -D warnings
```

PostgreSQL runtime tests require `IRONCLAW_PRODUCT_WORKFLOW_POSTGRES_URL`; when
it is unset, postgres contract tests compile and skip execution.
34 changes: 34 additions & 0 deletions crates/ironclaw_product_workflow_storage/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
[package]
name = "ironclaw_product_workflow_storage"
version = "0.1.0"
edition = "2024"
rust-version = "1.92"
description = "Durable storage adapters for IronClaw Reborn product workflow"
authors = ["NEAR AI <support@near.ai>"]
license = "MIT OR Apache-2.0"
homepage = "https://github.com/nearai/ironclaw"
repository = "https://github.com/nearai/ironclaw"
publish = false

[features]
default = []
libsql = ["ironclaw_filesystem/libsql"]
postgres = ["ironclaw_filesystem/postgres"]

[dependencies]
async-trait = "0.1"
chrono = { version = "0.4", features = ["serde"] }
ironclaw_filesystem = { path = "../ironclaw_filesystem", version = "0.1.0" }
ironclaw_host_api = { path = "../ironclaw_host_api", version = "0.1.0" }
ironclaw_product_workflow = { path = "../ironclaw_product_workflow", version = "0.1.0" }
serde_json = "1"
tracing = "0.1"

[dev-dependencies]
deadpool-postgres = "0.14"
ironclaw_filesystem = { path = "../ironclaw_filesystem", features = ["libsql", "postgres"] }
ironclaw_product_adapters = { path = "../ironclaw_product_adapters" }
libsql = { version = "0.6", default-features = false, features = ["core", "replication", "remote", "tls"] }
tempfile = "3"
tokio = { version = "1", features = ["macros", "rt", "sync", "time"] }
tokio-postgres = "0.7"
Loading
Loading