Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
388 changes: 384 additions & 4 deletions Cargo.lock

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions auto-engine-core/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ wasmtime = "39.0.1"
wasmtime-wasi = "39.0.1"
anyhow = "1.0.100"
convert_case = "0.10.0"
leptess = "0.14.0"
reqwest = { version = "0.12.9", default-features = false, features = ["json", "rustls-tls"] }

[features]
default = ["types", "context", "event", "pipeline", "runner", "utils"]
Expand Down
7 changes: 3 additions & 4 deletions auto-engine-core/src/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -62,14 +62,13 @@ impl Context {
pub async fn get_value_parse(&self, key: &str) -> Option<serde_json::Value> {
let mut default_value = None;
let mut key = key.to_string();
for caps in utils::REGEX_PARSE_VARIABLES.captures_iter(&key) {
let var_name = (&caps[1]).to_string();
if let Some(caps) = utils::REGEX_PARSE_VARIABLES.captures_iter(&key).next() {
let var_name = (caps[1]).to_string();
let default = caps.get(2).map(|m| m.as_str()).unwrap_or("");
if default != "" {
if !default.is_empty() {
default_value = Some(serde_json::Value::String(default.to_string()));
}
key = var_name;
break;
}

let value = self.get_value(&key).await;
Expand Down
3 changes: 3 additions & 0 deletions auto-engine-core/src/node.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
pub mod data_aggregator;
pub mod http;
pub mod image_match;
pub mod keyboard;
pub mod mouse_click;
pub mod mouse_move;
pub mod ocr;
pub mod screen_capture;
pub mod start;
pub mod time_wait;
#[cfg(feature = "wasm")]
Expand Down
12 changes: 9 additions & 3 deletions auto-engine-core/src/node/data_aggregator/node.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use crate::types::node::{FieldType, I18nValue, NodeDefine, SchemaField};
use crate::types::field::{FieldType, SchemaField};
use crate::types::node::{I18nValue, NodeDefine};
use std::collections::HashMap;

pub const NODE_TYPE: &str = "DataAggregator";
Expand Down Expand Up @@ -26,7 +27,7 @@ impl NodeDefine for DataAggregatorNode {

fn icon(&self) -> String {
String::from(
"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik0yMSAxNlY4YTIgMiAwIDAgMC0xLTEuNzNsLTctNGEyIDIgMCAwIDAtMiAwbC03IDRBMiAyIDAgMCAwIDMgOHY4YTIgMiAwIDAgMCAxIDEuNzNsNyA0YTIgMiAwIDAgMCAyIDBsNy00QTIgMiAwIDAgMCAyMSAxNnoiLz48cG9seWxpbmUgcG9pbnRzPSI3LjUgNC4yMSAxMiA2LjgxIDE2LjUgNC4yMSIvPjxwb2x5bGluZSBwb2ludHM9IjcuNSAxOS43OSA3LjUgMTQuNiAzIDE3LjQiLz48cG9seWxpbmUgcG9pbnRzPSIyMSAxMi4yIDIxIDE2Ljc5IDE2LjUgMTkuNzkgMTYuNSAxNC42Ii8+PHBvbHlsaW5lIHBvaW50cz0iMy4yNyA2Ljk2IDEyIDEyLjAxIDIwLjczIDYuOTYiLz48bGluZSB4MT0iMTIiIHgyPSIxMiIgeTE9IjIyLjA4IiB5Mj0iMTIiLz48L3N2Zz4=",
"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgY2xhc3M9Imx1Y2lkZSBsdWNpZGUtYmV0d2Vlbi1ob3Jpem9udGFsLXN0YXJ0LWljb24gbHVjaWRlLWJldHdlZW4taG9yaXpvbnRhbC1zdGFydCI+PHJlY3Qgd2lkdGg9IjEzIiBoZWlnaHQ9IjciIHg9IjgiIHk9IjMiIHJ4PSIxIi8+PHBhdGggZD0ibTIgOSAzIDMtMyAzIi8+PHJlY3Qgd2lkdGg9IjEzIiBoZWlnaHQ9IjciIHg9IjgiIHk9IjE0IiByeD0iMSIvPjwvc3ZnPg==",
)
}

Expand All @@ -44,7 +45,7 @@ impl NodeDefine for DataAggregatorNode {
})
}

fn output_schema(&self,_input: HashMap<String, serde_json::Value>) -> Vec<SchemaField> {
fn output_schema(&self, _input: HashMap<String, serde_json::Value>) -> Vec<SchemaField> {
vec![
SchemaField {
name: "result".to_string(),
Expand All @@ -56,6 +57,7 @@ impl NodeDefine for DataAggregatorNode {
}),
enums: vec![],
default: None,
condition: None,
},
SchemaField {
name: "count".to_string(),
Expand All @@ -67,6 +69,7 @@ impl NodeDefine for DataAggregatorNode {
}),
enums: vec![],
default: None,
condition: None,
},
]
}
Expand All @@ -83,6 +86,7 @@ impl NodeDefine for DataAggregatorNode {
}),
enums: vec!["object".to_string(), "array".to_string()],
default: Some("object".to_string()),
condition: None,
},
SchemaField {
name: "sources".to_string(),
Expand All @@ -95,6 +99,7 @@ impl NodeDefine for DataAggregatorNode {
}),
enums: vec![],
default: None,
condition: None,
},
SchemaField {
name: "keys".to_string(),
Expand All @@ -106,6 +111,7 @@ impl NodeDefine for DataAggregatorNode {
}),
enums: vec![],
default: None,
condition: None,
},
]
}
Expand Down
8 changes: 5 additions & 3 deletions auto-engine-core/src/node/data_aggregator/runner.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ use crate::types::node::{NodeRunner, NodeRunnerControl, NodeRunnerController, No
use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::HashMap;
use std::time::Duration;

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct DataAggregatorParam {
Expand Down Expand Up @@ -35,7 +34,7 @@ impl NodeRunner for DataAggregatorRunner {
let map = ctx.string_value.read().await;
log::info!("map: {:?}", map.keys());
}
let mut values= vec![];
let mut values = vec![];

for source in param.sources.iter() {
match ctx.get_value_parse(source).await {
Expand All @@ -52,7 +51,7 @@ impl NodeRunner for DataAggregatorRunner {
// Array mode: return values as an array
Value::Array(values)
}
"object" | _ => {
"object" => {
// Object mode: use keys if provided, otherwise use indices
let mut map = serde_json::Map::new();
for (i, value) in values.iter().enumerate() {
Expand All @@ -65,6 +64,9 @@ impl NodeRunner for DataAggregatorRunner {
}
Value::Object(map)
}
_ => {
return Err(format!("Invalid mode: {}", param.mode));
}
};

let mut output = HashMap::new();
Expand Down
2 changes: 2 additions & 0 deletions auto-engine-core/src/node/http.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
pub mod node;
pub mod runner;
141 changes: 141 additions & 0 deletions auto-engine-core/src/node/http/node.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
use crate::types::field::{FieldType, SchemaField};
use crate::types::node::{I18nValue, NodeDefine};
use std::collections::HashMap;

pub const NODE_TYPE: &str = "HTTPClient";

#[derive(Default)]
pub struct HttpNode;

impl HttpNode {
pub fn new() -> Self {
Self {}
}
}

impl NodeDefine for HttpNode {
fn action_type(&self) -> String {
NODE_TYPE.to_string()
}

fn name(&self) -> I18nValue {
I18nValue {
zh: "HTTP 请求".to_string(),
en: "HTTP Request".to_string(),
}
}

fn icon(&self) -> String {
String::from(
"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgY2xhc3M9Imx1Y2lkZSBsdWNpZGUtZ2xvYmUtaWNvbiBsdWNpZGUtZ2xvYmUiPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEwIi8+PHBhdGggZD0iTTEyIDJhMTQuNSAxNC41IDAgMCAwIDAgMjAgMTQuNSAxNC41IDAgMCAwIDAtMjAiLz48cGF0aCBkPSJNMiAxMmgyMCIvPjwvc3ZnPg==",
)
}

fn category(&self) -> Option<I18nValue> {
Some(I18nValue {
zh: "网络请求".to_string(),
en: "Network".to_string(),
})
}

fn description(&self) -> Option<I18nValue> {
Some(I18nValue {
zh: "发送简单的 HTTP 请求(基于 reqwest)。".to_string(),
en: "Send simple HTTP requests using reqwest.".to_string(),
})
}

fn output_schema(&self, _input: HashMap<String, serde_json::Value>) -> Vec<SchemaField> {
vec![
SchemaField {
name: "status".to_string(),
field_type: FieldType::Number,
item_type: None,
description: Some(I18nValue {
zh: "HTTP 状态码".to_string(),
en: "HTTP status code".to_string(),
}),
enums: vec![],
default: None,
condition: None,
},
SchemaField {
name: "body".to_string(),
field_type: FieldType::String,
item_type: None,
description: Some(I18nValue {
zh: "响应正文".to_string(),
en: "Response body".to_string(),
}),
enums: vec![],
default: None,
condition: None,
},
]
}

fn input_schema(&self) -> Vec<SchemaField> {
vec![
SchemaField {
name: "method".to_string(),
field_type: FieldType::String,
item_type: None,
description: Some(I18nValue {
zh: "HTTP 方法,支持 GET/POST".to_string(),
en: "HTTP method, supports GET/POST".to_string(),
}),
enums: vec!["GET".to_string(), "POST".to_string()],
default: Some("GET".to_string()),
condition: None,
},
SchemaField {
name: "url".to_string(),
field_type: FieldType::String,
item_type: None,
description: Some(I18nValue {
zh: "请求 URL".to_string(),
en: "Request URL".to_string(),
}),
enums: vec![],
default: None,
condition: None,
},
SchemaField {
name: "headers".to_string(),
field_type: FieldType::Array,
item_type: Some(FieldType::String),
description: Some(I18nValue {
zh: "可选请求头列表,格式:Key: Value".to_string(),
en: "Optional headers list, format: Key: Value".to_string(),
}),
enums: vec![],
default: None,
condition: None,
},
SchemaField {
name: "body".to_string(),
field_type: FieldType::String,
item_type: None,
description: Some(I18nValue {
zh: "POST 请求体,文本/JSON 皆可。".to_string(),
en: "POST body, plain text or JSON string.".to_string(),
}),
enums: vec![],
default: Some("".to_string()),
condition: None,
},
SchemaField {
name: "timeout_ms".to_string(),
field_type: FieldType::Number,
item_type: None,
description: Some(I18nValue {
zh: "请求超时时间(毫秒),默认 30000。".to_string(),
en: "Request timeout in milliseconds, default 30000.".to_string(),
}),
enums: vec![],
default: Some("30000".to_string()),
condition: None,
},
]
}
}
Loading
Loading