v0.4.7-pre.009

This commit is contained in:
2026-08-02 17:53:36 +02:00
parent d6cb4b0cce
commit ebdfd30d5d
21 changed files with 657 additions and 46 deletions

View File

@@ -0,0 +1,192 @@
// file: kb-app-demo-desktop/src/demo_execution_metadata.rs
// version: 2
//! Thin desktop adapters for metadata execution demo scenarios.
/// UI-safe Metaplex scenario row.
#[derive(Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize, ts_rs::TS)]
#[serde(rename_all = "camelCase")]
#[ts(
export,
export_to = "../frontend/ts/bindings/kb_app_demo_desktop/demo_execution_metadata/DemoExecutionMetadataScenarioPayload.ts"
)]
pub(crate) struct DemoExecutionMetadataScenarioPayload {
/// Stable scenario identifier.
pub id: std::string::String,
/// Stable asset-family code.
pub asset_family: std::string::String,
/// Stable execution-mode code.
pub mode: std::string::String,
/// Ordered operation codes.
pub operation_codes: std::vec::Vec<std::string::String>,
/// Whether a collection account is required.
pub requires_collection: bool,
/// Whether programmable authorization rules are required.
pub requires_programmable_rules: bool,
/// Whether postconditions are mandatory.
pub requires_postcondition: bool,
/// Current validation status from the canonical matrix.
pub validation_status: std::string::String,
/// Required evidence kinds.
pub required_evidence: std::vec::Vec<std::string::String>,
}
/// Returns the canonical Metaplex scenario inventory for the desktop panel.
pub(crate) fn demo_execution_metadata_scenarios() -> std::result::Result<
std::vec::Vec<crate::DemoExecutionMetadataScenarioPayload>,
std::string::String,
> {
let matrix = match kb_pipeline_demo_scenarios::load_metaplex_token_metadata_validation_matrix()
{
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => return std::result::Result::Err(error.to_string()),
};
let statuses = matrix
.scenarios
.into_iter()
.map(|scenario| return (scenario.id, (scenario.status, scenario.required_evidence)))
.collect::<std::collections::BTreeMap<
std::string::String,
(
kb_pipeline_demo_scenarios::MetaplexTokenMetadataValidationStatus,
std::vec::Vec<std::string::String>,
),
>>();
let mut payloads = std::vec::Vec::new();
for scenario in kb_pipeline_demo_scenarios::metaplex_token_metadata_synthetic_scenarios()
.into_iter()
.chain(kb_pipeline_demo_scenarios::metaplex_token_metadata_devnet_scenarios())
{
let status = statuses.get(scenario.id.as_str());
let validation_status = match status {
std::option::Option::Some((value, _)) => validation_status_code(*value),
std::option::Option::None => "not_run".to_string(),
};
let required_evidence = match status {
std::option::Option::Some((_, evidence)) => evidence.clone(),
std::option::Option::None => std::vec::Vec::new(),
};
payloads.push(crate::DemoExecutionMetadataScenarioPayload {
id: scenario.id,
asset_family: asset_family_code(scenario.asset_family),
mode: scenario_mode_code(scenario.mode),
operation_codes: scenario.operation_codes,
requires_collection: scenario.requires_collection,
requires_programmable_rules: scenario.requires_programmable_rules,
requires_postcondition: scenario.requires_postcondition,
validation_status,
required_evidence,
});
}
return std::result::Result::Ok(payloads);
}
fn asset_family_code(
value: kb_pipeline_demo_scenarios::MetaplexTokenMetadataAssetFamily,
) -> std::string::String {
return match value {
kb_pipeline_demo_scenarios::MetaplexTokenMetadataAssetFamily::Nft => "nft".to_string(),
kb_pipeline_demo_scenarios::MetaplexTokenMetadataAssetFamily::Sft => "sft".to_string(),
kb_pipeline_demo_scenarios::MetaplexTokenMetadataAssetFamily::Fungible => {
"fungible".to_string()
},
kb_pipeline_demo_scenarios::MetaplexTokenMetadataAssetFamily::Collection => {
"collection".to_string()
},
kb_pipeline_demo_scenarios::MetaplexTokenMetadataAssetFamily::ProgrammableNft => {
"programmable_nft".to_string()
},
};
}
fn scenario_mode_code(
value: kb_pipeline_demo_scenarios::MetaplexTokenMetadataScenarioMode,
) -> std::string::String {
return match value {
kb_pipeline_demo_scenarios::MetaplexTokenMetadataScenarioMode::Synthetic => {
"synthetic".to_string()
},
kb_pipeline_demo_scenarios::MetaplexTokenMetadataScenarioMode::NetworkSimulation => {
"network_simulation".to_string()
},
kb_pipeline_demo_scenarios::MetaplexTokenMetadataScenarioMode::NetworkSubmission => {
"network_submission".to_string()
},
};
}
fn validation_status_code(
value: kb_pipeline_demo_scenarios::MetaplexTokenMetadataValidationStatus,
) -> std::string::String {
return match value {
kb_pipeline_demo_scenarios::MetaplexTokenMetadataValidationStatus::NotRun => {
"not_run".to_string()
},
kb_pipeline_demo_scenarios::MetaplexTokenMetadataValidationStatus::SyntheticValidated => {
"synthetic_validated".to_string()
},
kb_pipeline_demo_scenarios::MetaplexTokenMetadataValidationStatus::Simulated => {
"simulated".to_string()
},
kb_pipeline_demo_scenarios::MetaplexTokenMetadataValidationStatus::Submitted => {
"submitted".to_string()
},
kb_pipeline_demo_scenarios::MetaplexTokenMetadataValidationStatus::Confirmed => {
"confirmed".to_string()
},
kb_pipeline_demo_scenarios::MetaplexTokenMetadataValidationStatus::Unavailable => {
"unavailable".to_string()
},
kb_pipeline_demo_scenarios::MetaplexTokenMetadataValidationStatus::Failed => {
"failed".to_string()
},
};
}
#[cfg(test)]
mod tests {
#[test]
fn desktop_inventory_matches_reusable_scenarios_and_matrix() {
let payloads = match crate::demo_execution_metadata_scenarios() {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => {
assert_eq!(std::option::Option::Some(error), std::option::Option::None);
return;
},
};
assert_eq!(payloads.len(), 10);
assert!(payloads.iter().all(|payload| return !payload.operation_codes.is_empty()));
assert!(payloads.iter().all(|payload| return payload.requires_postcondition));
assert!(
payloads
.iter()
.all(|payload| return payload.validation_status != "missing_from_matrix")
);
assert_eq!(
payloads
.iter()
.filter(|payload| return payload.mode == "network_simulation")
.count(),
5
);
}
#[test]
fn programmable_and_collection_requirements_remain_explicit() {
let payloads = match crate::demo_execution_metadata_scenarios() {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => {
assert_eq!(std::option::Option::Some(error), std::option::Option::None);
return;
},
};
assert_eq!(payloads.iter().filter(|payload| return payload.requires_collection).count(), 2);
assert_eq!(
payloads
.iter()
.filter(|payload| return payload.requires_programmable_rules)
.count(),
2
);
}
}

View File

@@ -1,5 +1,5 @@
// file: kb-app-demo-desktop/src/lib.rs
// version: 25
// version: 26
//! Tauri desktop demo application for `khadhroony-bot3`.
@@ -14,6 +14,7 @@ mod demo_config;
mod demo_core_extraction;
mod demo_decode_replay;
mod demo_devnet_common;
mod demo_execution_metadata;
mod demo_execution_solana_core;
mod demo_execution_spl;
mod demo_http;
@@ -126,6 +127,10 @@ pub(crate) use self::demo_devnet_common::DemoExecutionDevnetStoreReadinessPayloa
pub(crate) use self::demo_devnet_common::devnet_store_readiness_payload;
/// Serializes a diagnostic value to indented JSON without panicking.
pub(crate) use self::demo_devnet_common::pretty_json;
/// UI-safe Metaplex scenario row.
pub(crate) use self::demo_execution_metadata::DemoExecutionMetadataScenarioPayload;
/// Returns the canonical Metaplex scenario inventory for the desktop panel.
pub(crate) use self::demo_execution_metadata::demo_execution_metadata_scenarios;
/// Request sent by the Memo v4 Devnet execution panel.
pub(crate) use self::demo_execution_solana_core::DemoExecutionMemoRequest;
/// UI-safe result of one Memo v4 Devnet execution orchestration.

View File

@@ -1,5 +1,5 @@
// file: kb-app-demo-desktop/src/tauri.rs
// version: 24
// version: 26
//! Tauri runtime assembly and private command wrappers.
@@ -53,6 +53,8 @@ pub fn run() -> kb_core::Result<()> {
demo_execution_solana_core_cancel,
demo_execution_spl_validation_scenarios,
open_demo_execution_spl_window,
open_demo_execution_metadata_window,
demo_execution_metadata_scenarios,
demo_execution_spl_token_execute,
demo_spl_token_journal,
demo_spl_ata_derive,
@@ -601,6 +603,26 @@ fn open_demo_execution_spl_window(
);
}
#[tauri::command]
fn open_demo_execution_metadata_window(
app_handle: tauri::AppHandle,
) -> std::result::Result<(), std::string::String> {
return open_or_focus_demo_window(
app_handle,
"demo_execution_metadata",
"demo_execution_metadata.html",
"Exécution Metadata Devnet",
);
}
#[tauri::command]
fn demo_execution_metadata_scenarios() -> std::result::Result<
std::vec::Vec<crate::DemoExecutionMetadataScenarioPayload>,
std::string::String,
> {
return crate::demo_execution_metadata_scenarios();
}
#[tauri::command]
async fn demo_execution_spl_token_execute(
app_handle: tauri::AppHandle,