From 08ca4da691e08b4dd58cf47d3e438f8c7899c7ae Mon Sep 17 00:00:00 2001 From: dailz Date: Mon, 20 Apr 2026 13:41:28 +0800 Subject: [PATCH] fix(service): inject WORK_DIR and map file_ids before param validation Previously ValidateParams ran before WORK_DIR injection and file_ids mapping, causing required parameter missing errors for auto-handled params. Now the execution order is: inject WORK_DIR, map file_ids to file params, validate, resolve. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus --- internal/service/task_service.go | 39 +++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/internal/service/task_service.go b/internal/service/task_service.go index 258c0aa..7a5f393 100644 --- a/internal/service/task_service.go +++ b/internal/service/task_service.go @@ -284,16 +284,43 @@ func (s *TaskService) ProcessTask(ctx context.Context, taskID int64) error { } } + // 16a. Auto-inject WORK_DIR if the app defines it as a parameter. + // The work directory is created by the server, not provided by the user. + for _, p := range params { + if p.Name == "WORK_DIR" { + values["WORK_DIR"] = workDir + break + } + } + + // 16b. Map input_file_ids to file-type parameters by order. + // User selects files via FilePicker; we assign their IDs to file/directory + // params sequentially so the backend can resolve them to filenames later. + var inputFileIDs []int64 + if len(task.InputFileIDs) > 0 { + if err := json.Unmarshal(task.InputFileIDs, &inputFileIDs); err != nil { + return fail(model.TaskStepSubmitting, fmt.Sprintf("parse input file ids: %v", err)) + } + } + if len(inputFileIDs) > 0 { + fileParamIdx := 0 + for _, p := range params { + if p.Type != model.ParamTypeFile && p.Type != model.ParamTypeDirectory { + continue + } + if fileParamIdx < len(inputFileIDs) { + values[p.Name] = strconv.FormatInt(inputFileIDs[fileParamIdx], 10) + fileParamIdx++ + } + } + } + + // 16c. Validate all params (WORK_DIR and file params now have values). if err := ValidateParams(params, values); err != nil { return fail(model.TaskStepSubmitting, err.Error()) } - if strings.Contains(app.ScriptTemplate, "$WORK_DIR") { - values["WORK_DIR"] = workDir - } - - // Resolve file-type parameters: user sends file_id, we replace with filename. - // Only query the database if there are file/directory-type parameters with values. + // 16d. Resolve file-type parameter values: file_id → filename. var fileLookupIDs []int64 for _, p := range params { if p.Type != model.ParamTypeFile && p.Type != model.ParamTypeDirectory {