diff --git a/adk/middlewares/plantask/backend_test.go b/adk/middlewares/plantask/backend_test.go index d381ff751..ad123dd63 100644 --- a/adk/middlewares/plantask/backend_test.go +++ b/adk/middlewares/plantask/backend_test.go @@ -78,3 +78,23 @@ func (b *inMemoryBackend) Delete(ctx context.Context, req *DeleteRequest) error delete(b.files, req.FilePath) return nil } + +type baseNameLsBackend struct { + *inMemoryBackend +} + +func newBaseNameLsBackend() *baseNameLsBackend { + return &baseNameLsBackend{inMemoryBackend: newInMemoryBackend()} +} + +func (b *baseNameLsBackend) LsInfo(ctx context.Context, req *LsInfoRequest) ([]FileInfo, error) { + infos, err := b.inMemoryBackend.LsInfo(ctx, req) + if err != nil { + return nil, err + } + + for i := range infos { + infos[i].Path = filepath.Base(infos[i].Path) + } + return infos, nil +} diff --git a/adk/middlewares/plantask/task_create.go b/adk/middlewares/plantask/task_create.go index 478b14d65..9a75cae84 100644 --- a/adk/middlewares/plantask/task_create.go +++ b/adk/middlewares/plantask/task_create.go @@ -106,11 +106,15 @@ func (t *taskCreateTool) InvokableRun(ctx context.Context, argumentsInJSON strin for _, file := range files { fileName := filepath.Base(file.Path) if fileName == highWatermarkFileName { + filePath := file.Path + if !filepath.IsAbs(filePath) { + filePath = filepath.Join(t.BaseDir, filePath) + } content, readErr := t.Backend.Read(ctx, &ReadRequest{ - FilePath: file.Path, + FilePath: filePath, }) if readErr != nil { - return "", fmt.Errorf("%s read highwatermark file %s failed, err: %w", TaskCreateToolName, file.Path, readErr) + return "", fmt.Errorf("%s read highwatermark file %s failed, err: %w", TaskCreateToolName, filePath, readErr) } if content.Content != "" { var val int64 diff --git a/adk/middlewares/plantask/task_create_test.go b/adk/middlewares/plantask/task_create_test.go index e451ffbd2..70c3c5f84 100644 --- a/adk/middlewares/plantask/task_create_test.go +++ b/adk/middlewares/plantask/task_create_test.go @@ -89,3 +89,28 @@ func TestTaskCreateToolWithMetadata(t *testing.T) { assert.Equal(t, "value1", taskData.Metadata["key1"]) assert.Equal(t, "value2", taskData.Metadata["key2"]) } + +func TestTaskCreateToolWithBaseNameLsInfo(t *testing.T) { + ctx := context.Background() + backend := newBaseNameLsBackend() + baseDir := "/tmp/tasks" + lock := &sync.Mutex{} + + err := backend.Write(ctx, &WriteRequest{FilePath: filepath.Join(baseDir, highWatermarkFileName), Content: "1"}) + assert.NoError(t, err) + + tool := newTaskCreateTool(backend, baseDir, lock) + + result, err := tool.InvokableRun(ctx, `{"subject": "Second Task", "description": "Second description"}`) + assert.NoError(t, err) + assert.Equal(t, `{"result":"Task #2 created successfully: Second Task"}`, result) + + content, err := backend.Read(ctx, &ReadRequest{FilePath: filepath.Join(baseDir, "2.json")}) + assert.NoError(t, err) + + var taskData task + err = sonic.UnmarshalString(content.Content, &taskData) + assert.NoError(t, err) + assert.Equal(t, "2", taskData.ID) + assert.Equal(t, "Second Task", taskData.Subject) +} diff --git a/adk/middlewares/plantask/task_list.go b/adk/middlewares/plantask/task_list.go index 60a7d04ec..fcc0ca75e 100644 --- a/adk/middlewares/plantask/task_list.go +++ b/adk/middlewares/plantask/task_list.go @@ -74,17 +74,21 @@ func listTasks(ctx context.Context, backend Backend, baseDir string) ([]*task, e continue } + filePath := file.Path + if !filepath.IsAbs(filePath) { + filePath = filepath.Join(baseDir, filePath) + } content, err := backend.Read(ctx, &ReadRequest{ - FilePath: file.Path, + FilePath: filePath, }) if err != nil { - return nil, fmt.Errorf("%s read task file %s failed, err: %w", TaskListToolName, file.Path, err) + return nil, fmt.Errorf("%s read task file %s failed, err: %w", TaskListToolName, filePath, err) } taskData := &task{} err = sonic.UnmarshalString(content.Content, taskData) if err != nil { - return nil, fmt.Errorf("%s parse task file %s failed, err: %w", TaskListToolName, file.Path, err) + return nil, fmt.Errorf("%s parse task file %s failed, err: %w", TaskListToolName, filePath, err) } tasks = append(tasks, taskData) diff --git a/adk/middlewares/plantask/task_list_test.go b/adk/middlewares/plantask/task_list_test.go index 706f8c69c..6c9b1279f 100644 --- a/adk/middlewares/plantask/task_list_test.go +++ b/adk/middlewares/plantask/task_list_test.go @@ -58,3 +58,25 @@ func TestTaskListTool(t *testing.T) { assert.Contains(t, result, "#2 ["+taskStatusInProgress+"] Task 2") assert.Contains(t, result, "[owner: agent1]") } + +func TestTaskListToolWithBaseNameLsInfo(t *testing.T) { + ctx := context.Background() + backend := newBaseNameLsBackend() + baseDir := "/tmp/tasks" + lock := &sync.Mutex{} + + task1 := &task{ID: "1", Subject: "Task 1", Status: taskStatusPending} + task1JSON, _ := sonic.MarshalString(task1) + _ = backend.Write(ctx, &WriteRequest{FilePath: filepath.Join(baseDir, "1.json"), Content: task1JSON}) + + task2 := &task{ID: "2", Subject: "Task 2", Status: taskStatusCompleted} + task2JSON, _ := sonic.MarshalString(task2) + _ = backend.Write(ctx, &WriteRequest{FilePath: filepath.Join(baseDir, "2.json"), Content: task2JSON}) + + tool := newTaskListTool(backend, baseDir, lock) + + result, err := tool.InvokableRun(ctx, `{}`) + assert.NoError(t, err) + assert.Contains(t, result, "#1 ["+taskStatusPending+"] Task 1") + assert.Contains(t, result, "#2 ["+taskStatusCompleted+"] Task 2") +}