feat(bat): 暴露翻译任务状态控制

Refs #43
This commit is contained in:
2026-08-12 09:11:09 +08:00
parent 1933d6acb0
commit 974a6e18c3
17 changed files with 341 additions and 13 deletions
+13
View File
@@ -264,6 +264,15 @@ type ScheduleRunParams struct {
MaxRuns *uint64 `json:"max_runs,omitempty"`
}
// TranslationTaskUpdateParams is used by translation.task.update to persist
// provider worker state for one task in the current official release.
type TranslationTaskUpdateParams struct {
TaskID string `json:"task_id"`
Status string `json:"status"`
FailureReason string `json:"failure_reason,omitempty"`
ProviderRunID string `json:"provider_run_id,omitempty"`
}
// Ack is returned by accepted daemon control methods.
type Ack struct {
Command string `json:"command"`
@@ -483,6 +492,10 @@ func (c *Client) ScheduleRun(ctx context.Context, params ScheduleRunParams) (jso
return c.rawData(ctx, "schedule.run", params)
}
func (c *Client) TranslationTaskUpdate(ctx context.Context, params TranslationTaskUpdateParams) (json.RawMessage, error) {
return c.rawData(ctx, "translation.task.update", params)
}
func (c *Client) CatalogStatus(ctx context.Context) (json.RawMessage, error) {
return c.rawData(ctx, "catalog.status", nil)
}
+39
View File
@@ -336,6 +336,45 @@ func TestScheduleRunSendsScopeAndMaxRuns(t *testing.T) {
}
}
func TestTranslationTaskUpdateSendsWorkerParams(t *testing.T) {
client := newTestClient(t, func(t *testing.T, req testRequest) testResponse {
if req.Method != "translation.task.update" {
t.Fatalf("method = %s", req.Method)
}
var params TranslationTaskUpdateParams
if err := json.Unmarshal(req.Params, &params); err != nil {
t.Fatalf("decode params: %v", err)
}
if params.TaskID != "textunit/v-current/Scenario" ||
params.Status != "failed" ||
params.FailureReason != "provider rejected payload" ||
params.ProviderRunID != "provider-run-1" {
t.Fatalf("params = %#v", params)
}
return testResponse{
Result: testEnvelope{
OK: true,
Status: "ok",
RequestID: "req-test-translation-update",
Data: map[string]any{"task_status": "failed"},
},
}
})
raw, err := client.TranslationTaskUpdate(context.Background(), TranslationTaskUpdateParams{
TaskID: "textunit/v-current/Scenario",
Status: "failed",
FailureReason: "provider rejected payload",
ProviderRunID: "provider-run-1",
})
if err != nil {
t.Fatalf("TranslationTaskUpdate error: %v", err)
}
if !json.Valid(raw) {
t.Fatalf("invalid raw JSON: %s", string(raw))
}
}
func TestApplicationErrorReturnsAPIError(t *testing.T) {
client := newTestClient(t, func(t *testing.T, req testRequest) testResponse {
if req.Method != "task.status" {