新增外部生成任务结果查询

新增仅返回任务结果的 SpacetimeDB procedure

编辑器 Agent 回填改用结果查询接口

补齐客户端绑定与接口文档
This commit is contained in:
2026-07-15 13:36:00 +08:00
parent 9a6bf8d86d
commit d55f4ba71c
11 changed files with 231 additions and 7 deletions
@@ -271,6 +271,22 @@ pub struct ExternalGenerationJobProcedureResult {
pub error_message: Option<String>,
}
// Private backend read for reconciliation; it intentionally excludes job request and lease data.
#[derive(Clone, Debug, PartialEq, Eq, SpacetimeType)]
pub struct ExternalGenerationJobResultSnapshot {
pub job_id: String,
pub status: String,
pub last_error_message: Option<String>,
pub result_payload_json: Option<String>,
}
#[derive(Clone, Debug, PartialEq, Eq, SpacetimeType)]
pub struct ExternalGenerationJobResultProcedureResult {
pub ok: bool,
pub result: Option<ExternalGenerationJobResultSnapshot>,
pub error_message: Option<String>,
}
#[derive(Clone, Debug, PartialEq, Eq, SpacetimeType)]
pub struct ExternalGenerationJobSummarySnapshot {
pub job_id: String,
@@ -464,6 +480,23 @@ pub fn get_external_generation_job_and_return(
}
}
#[spacetimedb::procedure]
pub fn get_external_generation_job_result_and_return(
ctx: &mut ProcedureContext,
input: ExternalGenerationJobGetInput,
) -> ExternalGenerationJobResultProcedureResult {
let caller = ctx.sender();
match ctx.try_with_tx(|tx| {
crate::editor_project_storage::require_editor_generation_runtime_service_identity(
tx, caller,
)?;
get_external_generation_job_result_tx(tx, input.clone())
}) {
Ok(result) => single_external_generation_job_result_read_result(result),
Err(message) => failed_external_generation_job_result_read_result(message),
}
}
#[spacetimedb::procedure]
pub fn list_external_generation_jobs_and_return(
ctx: &mut ProcedureContext,
@@ -869,6 +902,14 @@ fn get_external_generation_job_tx(
ctx: &ReducerContext,
input: ExternalGenerationJobGetInput,
) -> Result<ExternalGenerationJobSnapshot, String> {
get_external_generation_job_summary_tx(ctx, input)
.map(map_external_generation_job_summary_to_compat_snapshot)
}
fn get_external_generation_job_result_tx(
ctx: &ReducerContext,
input: ExternalGenerationJobGetInput,
) -> Result<ExternalGenerationJobResultSnapshot, String> {
validate_required("external_generation_job.job_id", &input.job_id)?;
validate_required(
"external_generation_job.owner_user_id",
@@ -885,7 +926,12 @@ fn get_external_generation_job_tx(
if row.owner_user_id.trim() != owner_user_id {
return Err("external_generation_job 不存在".to_string());
}
Ok(map_external_generation_job_row(row))
Ok(ExternalGenerationJobResultSnapshot {
job_id: row.job_id,
status: row.status,
last_error_message: row.last_error_message,
result_payload_json: row.result_payload_json,
})
}
fn list_external_generation_jobs_tx(
@@ -2128,6 +2174,26 @@ fn failed_external_generation_job_result(message: String) -> ExternalGenerationJ
}
}
fn single_external_generation_job_result_read_result(
result: ExternalGenerationJobResultSnapshot,
) -> ExternalGenerationJobResultProcedureResult {
ExternalGenerationJobResultProcedureResult {
ok: true,
result: Some(result),
error_message: None,
}
}
fn failed_external_generation_job_result_read_result(
message: String,
) -> ExternalGenerationJobResultProcedureResult {
ExternalGenerationJobResultProcedureResult {
ok: false,
result: None,
error_message: Some(message),
}
}
fn single_external_generation_job_summary_result(
job: ExternalGenerationJobSummarySnapshot,
) -> ExternalGenerationJobSummaryProcedureResult {