fix: show only generated outputs in workspace

This commit is contained in:
boos
2026-06-06 20:03:02 +08:00
parent 5ecea182bc
commit 823ac3c25d
5 changed files with 51 additions and 19 deletions
+5 -1
View File
@@ -856,6 +856,7 @@ async fn archive_output(
model: Some("comfy-native".to_string()), model: Some("comfy-native".to_string()),
remote_url: None, remote_url: None,
metadata: json!({ metadata: json!({
"workspaceAsset": { "role": "output" },
"digitalHuman": { "digitalHuman": {
"promptId": prompt_id, "promptId": prompt_id,
"filename": filename, "filename": filename,
@@ -1254,7 +1255,10 @@ async fn upload_asset(
prompt: None, prompt: None,
model: None, model: None,
remote_url: None, remote_url: None,
metadata: json!({ "digitalHumanUpload": { "purpose": purpose, "fileName": file_name } }), metadata: json!({
"workspaceAsset": { "role": "input" },
"digitalHumanUpload": { "purpose": purpose, "fileName": file_name },
}),
}; };
let asset = workspace::record_bytes_asset(&state, input, &bytes, &mime_type).await?; let asset = workspace::record_bytes_asset(&state, input, &bytes, &mime_type).await?;
let file_url = format!( let file_url = format!(
+13 -2
View File
@@ -1153,7 +1153,10 @@ async fn archive_comfy_output(
prompt: Some(prompt.chars().take(1000).collect()), prompt: Some(prompt.chars().take(1000).collect()),
model: Some("comfy-api".to_string()), model: Some("comfy-api".to_string()),
remote_url: None, remote_url: None,
metadata: json!({ "moneyPrinter": { "backend": "comfy", "promptId": prompt_id, "raw": item } }), metadata: json!({
"workspaceAsset": { "role": "output" },
"moneyPrinter": { "backend": "comfy", "promptId": prompt_id, "raw": item },
}),
}; };
match workspace::record_bytes_asset(state, input, &bytes, &content_type).await { match workspace::record_bytes_asset(state, input, &bytes, &content_type).await {
Ok(asset) => Some(json!({ Ok(asset) => Some(json!({
@@ -1306,8 +1309,16 @@ async fn archive_video(
prompt: &str, prompt: &str,
model: &str, model: &str,
video_url: &str, video_url: &str,
metadata: Value, mut metadata: Value,
) -> Option<Value> { ) -> Option<Value> {
if let Some(object) = metadata.as_object_mut() {
object.insert("workspaceAsset".to_string(), json!({ "role": "output" }));
} else {
metadata = json!({
"workspaceAsset": { "role": "output" },
"metadata": metadata,
});
}
let input = WorkspaceAssetInput { let input = WorkspaceAssetInput {
user_id: auth.user_id, user_id: auth.user_id,
source: "money-printer".to_string(), source: "money-printer".to_string(),
+1
View File
@@ -4078,6 +4078,7 @@ async fn archive_native_workflow_asset(
model: None, model: None,
remote_url: None, remote_url: None,
metadata: json!({ metadata: json!({
"workspaceAsset": { "role": "output" },
"workflowUi": { "workflowUi": {
"filename": filename, "filename": filename,
"type": file_type, "type": file_type,
+24 -14
View File
@@ -173,6 +173,20 @@ fn row_to_json(row: sqlx::sqlite::SqliteRow) -> Value {
}) })
} }
const WORKSPACE_OUTPUT_FILTER_SQL: &str = r#"
AND status = 'completed'
AND (
json_extract(metadata, '$.workspaceAsset.role') = 'output'
OR json_extract(metadata, '$.workflowUi.type') = 'output'
OR (
source IN ('picture-agent', 'workflow-studio')
AND json_type(metadata, '$.responseItem') IS NOT NULL
)
OR json_type(metadata, '$.moneyPrinter') IS NOT NULL
OR json_type(metadata, '$.digitalHuman') IS NOT NULL
)
"#;
async fn list_assets( async fn list_assets(
state: AppState, state: AppState,
caller: WorkspaceCaller, caller: WorkspaceCaller,
@@ -185,15 +199,12 @@ async fn list_assets(
}; };
let is_admin = matches!(caller, WorkspaceCaller::Admin); let is_admin = matches!(caller, WorkspaceCaller::Admin);
let items = sqlx::query( let list_sql = format!(
"SELECT * "SELECT *
FROM workspace_assets FROM workspace_assets
WHERE deleted_at IS NULL WHERE deleted_at IS NULL
AND ((? = 1 AND (? IS NULL OR user_id = ?)) OR (? = 0 AND user_id = ?)) AND ((? = 1 AND (? IS NULL OR user_id = ?)) OR (? = 0 AND user_id = ?))
AND ( {WORKSPACE_OUTPUT_FILTER_SQL}
source != 'workflow-ui'
OR json_extract(metadata, '$.workflowUi.type') = 'output'
)
AND (? IS NULL OR source = ?) AND (? IS NULL OR source = ?)
AND (? IS NULL OR kind = ?) AND (? IS NULL OR kind = ?)
AND ( AND (
@@ -204,8 +215,9 @@ async fn list_assets(
OR source LIKE ? OR source LIKE ?
) )
ORDER BY datetime(created_at) DESC, id DESC ORDER BY datetime(created_at) DESC, id DESC
LIMIT ? OFFSET ?", LIMIT ? OFFSET ?"
) );
let items = sqlx::query(&list_sql)
.bind(is_admin) .bind(is_admin)
.bind(scoped_user_id) .bind(scoped_user_id)
.bind(scoped_user_id) .bind(scoped_user_id)
@@ -226,15 +238,12 @@ async fn list_assets(
.fetch_all(&*state.db) .fetch_all(&*state.db)
.await?; .await?;
let total: i64 = sqlx::query_scalar( let count_sql = format!(
"SELECT COUNT(*) "SELECT COUNT(*)
FROM workspace_assets FROM workspace_assets
WHERE deleted_at IS NULL WHERE deleted_at IS NULL
AND ((? = 1 AND (? IS NULL OR user_id = ?)) OR (? = 0 AND user_id = ?)) AND ((? = 1 AND (? IS NULL OR user_id = ?)) OR (? = 0 AND user_id = ?))
AND ( {WORKSPACE_OUTPUT_FILTER_SQL}
source != 'workflow-ui'
OR json_extract(metadata, '$.workflowUi.type') = 'output'
)
AND (? IS NULL OR source = ?) AND (? IS NULL OR source = ?)
AND (? IS NULL OR kind = ?) AND (? IS NULL OR kind = ?)
AND ( AND (
@@ -243,8 +252,9 @@ async fn list_assets(
OR prompt LIKE ? OR prompt LIKE ?
OR model LIKE ? OR model LIKE ?
OR source LIKE ? OR source LIKE ?
)", )"
) );
let total: i64 = sqlx::query_scalar(&count_sql)
.bind(is_admin) .bind(is_admin)
.bind(scoped_user_id) .bind(scoped_user_id)
.bind(scoped_user_id) .bind(scoped_user_id)
+8 -2
View File
@@ -338,7 +338,10 @@ pub async fn record_image_assets_from_response(
prompt: prompt.clone(), prompt: prompt.clone(),
model: model.clone(), model: model.clone(),
remote_url: Some(url.trim().to_string()), remote_url: Some(url.trim().to_string()),
metadata: json!({ "responseItem": item }), metadata: json!({
"workspaceAsset": { "role": "output" },
"responseItem": item,
}),
}; };
match record_remote_asset(state, input).await { match record_remote_asset(state, input).await {
Ok(asset) => stored_assets.push(asset), Ok(asset) => stored_assets.push(asset),
@@ -357,7 +360,10 @@ pub async fn record_image_assets_from_response(
prompt: prompt.clone(), prompt: prompt.clone(),
model: model.clone(), model: model.clone(),
remote_url: None, remote_url: None,
metadata: json!({ "responseItem": item }), metadata: json!({
"workspaceAsset": { "role": "output" },
"responseItem": item,
}),
}; };
match record_base64_asset(state, input, b64).await { match record_base64_asset(state, input, b64).await {
Ok(asset) => stored_assets.push(asset), Ok(asset) => stored_assets.push(asset),