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()),
remote_url: None,
metadata: json!({
"workspaceAsset": { "role": "output" },
"digitalHuman": {
"promptId": prompt_id,
"filename": filename,
@@ -1254,7 +1255,10 @@ async fn upload_asset(
prompt: None,
model: 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 file_url = format!(
+13 -2
View File
@@ -1153,7 +1153,10 @@ async fn archive_comfy_output(
prompt: Some(prompt.chars().take(1000).collect()),
model: Some("comfy-api".to_string()),
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 {
Ok(asset) => Some(json!({
@@ -1306,8 +1309,16 @@ async fn archive_video(
prompt: &str,
model: &str,
video_url: &str,
metadata: Value,
mut metadata: 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 {
user_id: auth.user_id,
source: "money-printer".to_string(),
+1
View File
@@ -4078,6 +4078,7 @@ async fn archive_native_workflow_asset(
model: None,
remote_url: None,
metadata: json!({
"workspaceAsset": { "role": "output" },
"workflowUi": {
"filename": filename,
"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(
state: AppState,
caller: WorkspaceCaller,
@@ -185,15 +199,12 @@ async fn list_assets(
};
let is_admin = matches!(caller, WorkspaceCaller::Admin);
let items = sqlx::query(
let list_sql = format!(
"SELECT *
FROM workspace_assets
WHERE deleted_at IS NULL
AND ((? = 1 AND (? IS NULL OR user_id = ?)) OR (? = 0 AND user_id = ?))
AND (
source != 'workflow-ui'
OR json_extract(metadata, '$.workflowUi.type') = 'output'
)
{WORKSPACE_OUTPUT_FILTER_SQL}
AND (? IS NULL OR source = ?)
AND (? IS NULL OR kind = ?)
AND (
@@ -204,8 +215,9 @@ async fn list_assets(
OR source LIKE ?
)
ORDER BY datetime(created_at) DESC, id DESC
LIMIT ? OFFSET ?",
)
LIMIT ? OFFSET ?"
);
let items = sqlx::query(&list_sql)
.bind(is_admin)
.bind(scoped_user_id)
.bind(scoped_user_id)
@@ -226,15 +238,12 @@ async fn list_assets(
.fetch_all(&*state.db)
.await?;
let total: i64 = sqlx::query_scalar(
let count_sql = format!(
"SELECT COUNT(*)
FROM workspace_assets
WHERE deleted_at IS NULL
AND ((? = 1 AND (? IS NULL OR user_id = ?)) OR (? = 0 AND user_id = ?))
AND (
source != 'workflow-ui'
OR json_extract(metadata, '$.workflowUi.type') = 'output'
)
{WORKSPACE_OUTPUT_FILTER_SQL}
AND (? IS NULL OR source = ?)
AND (? IS NULL OR kind = ?)
AND (
@@ -243,8 +252,9 @@ async fn list_assets(
OR prompt LIKE ?
OR model LIKE ?
OR source LIKE ?
)",
)
)"
);
let total: i64 = sqlx::query_scalar(&count_sql)
.bind(is_admin)
.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(),
model: model.clone(),
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 {
Ok(asset) => stored_assets.push(asset),
@@ -357,7 +360,10 @@ pub async fn record_image_assets_from_response(
prompt: prompt.clone(),
model: model.clone(),
remote_url: None,
metadata: json!({ "responseItem": item }),
metadata: json!({
"workspaceAsset": { "role": "output" },
"responseItem": item,
}),
};
match record_base64_asset(state, input, b64).await {
Ok(asset) => stored_assets.push(asset),