diff --git a/ui/web/src/i18n/locales/en/cron.json b/ui/web/src/i18n/locales/en/cron.json index 1951e88c..16d2ffba 100644 --- a/ui/web/src/i18n/locales/en/cron.json +++ b/ui/web/src/i18n/locales/en/cron.json @@ -147,7 +147,8 @@ "envVars": "{{count}} vars", "commandJson": "Command JSON", "commandJsonHelp": "Edit the command payload as JSON. argv is required and must be a non-empty string array.", - "invalidCommandJson": "Invalid command JSON: argv must be a non-empty array." + "invalidCommandJson": "Invalid command JSON: argv must be a non-empty array.", + "commandArgvHelp": "One argument per line. Use sh / -c / your script for shell syntax." }, "stateless": "Stateless", "statelessHelp": "Skip session persistence. Each run starts fresh without loading previous messages. Saves tokens for crons that don't need past context.", diff --git a/ui/web/src/i18n/locales/ko/cron.json b/ui/web/src/i18n/locales/ko/cron.json index a9a02d36..10e142a0 100644 --- a/ui/web/src/i18n/locales/ko/cron.json +++ b/ui/web/src/i18n/locales/ko/cron.json @@ -147,7 +147,8 @@ "envVars": "{{count}}개", "commandJson": "명령 JSON", "commandJsonHelp": "명령 payload를 JSON으로 수정합니다. argv는 필수이며 비어 있지 않은 문자열 배열이어야 합니다.", - "invalidCommandJson": "명령 JSON이 올바르지 않습니다: argv는 비어 있지 않은 배열이어야 합니다." + "invalidCommandJson": "명령 JSON이 올바르지 않습니다: argv는 비어 있지 않은 배열이어야 합니다.", + "commandArgvHelp": "한 줄에 인자 하나씩 입력하세요. shell 문법은 sh / -c / script 형태를 사용하세요." }, "stateless": "상태 없음", "statelessHelp": "세션 지속성 건너뜁니다. 각 실행은 이전 메시지 없이 새로 시작됩니다. 이전 컨텍스트가 필요 없는 cron의 토큰을 절약합니다.", diff --git a/ui/web/src/i18n/locales/vi/cron.json b/ui/web/src/i18n/locales/vi/cron.json index 189d7273..cdf3d1a2 100644 --- a/ui/web/src/i18n/locales/vi/cron.json +++ b/ui/web/src/i18n/locales/vi/cron.json @@ -147,7 +147,8 @@ "envVars": "{{count}} biến", "commandJson": "JSON lệnh", "commandJsonHelp": "Chỉnh sửa payload lệnh dưới dạng JSON. argv là bắt buộc và phải là mảng chuỗi không rỗng.", - "invalidCommandJson": "JSON lệnh không hợp lệ: argv phải là mảng không rỗng." + "invalidCommandJson": "JSON lệnh không hợp lệ: argv phải là mảng không rỗng.", + "commandArgvHelp": "Mỗi dòng là một đối số. Dùng sh / -c / script nếu cần cú pháp shell." }, "stateless": "Không trạng thái", "statelessHelp": "Bỏ qua lưu session. Mỗi lần chạy bắt đầu mới. Tiết kiệm token cho các cron không cần context cũ.", diff --git a/ui/web/src/i18n/locales/zh/cron.json b/ui/web/src/i18n/locales/zh/cron.json index c69d9e84..b5178c61 100644 --- a/ui/web/src/i18n/locales/zh/cron.json +++ b/ui/web/src/i18n/locales/zh/cron.json @@ -147,7 +147,8 @@ "envVars": "{{count}}个变量", "commandJson": "命令 JSON", "commandJsonHelp": "以 JSON 编辑命令 payload。argv 必填,且必须是非空字符串数组。", - "invalidCommandJson": "命令 JSON 无效:argv 必须是非空数组。" + "invalidCommandJson": "命令 JSON 无效:argv 必须是非空数组。", + "commandArgvHelp": "每行一个参数。如需 shell 语法,请使用 sh / -c / script。" }, "stateless": "无状态", "statelessHelp": "跳过会话持久化。每次运行从零开始。为不需要历史上下文的定时任务节省令牌。", diff --git a/ui/web/src/pages/cron/cron-form-dialog.tsx b/ui/web/src/pages/cron/cron-form-dialog.tsx index 25f2779d..c38af03c 100644 --- a/ui/web/src/pages/cron/cron-form-dialog.tsx +++ b/ui/web/src/pages/cron/cron-form-dialog.tsx @@ -41,7 +41,12 @@ export function CronFormDialog({ open, onOpenChange, onSubmit }: CronFormDialogP name: "", payloadKind: "agent_turn", message: "", - commandJson: JSON.stringify({ argv: ["sh", "-c", "echo hello"] }, null, 2), + commandArgvText: "sh\n-c\necho hello", + commandCwd: "", + commandTimeoutSeconds: "", + commandNoOutputTimeoutSeconds: "", + commandOutputMaxBytes: "", + commandInput: "", agentId: "", scheduleKind: "every", everyValue: "60", @@ -63,7 +68,14 @@ export function CronFormDialog({ open, onOpenChange, onSubmit }: CronFormDialogP } const command = data.payloadKind === "command" - ? JSON.parse(data.commandJson || "{}") as CronCommandSpec + ? { + argv: (data.commandArgvText || "").split("\n").map((v) => v.trim()).filter(Boolean), + cwd: data.commandCwd?.trim() || undefined, + timeoutSeconds: data.commandTimeoutSeconds ? Number(data.commandTimeoutSeconds) : undefined, + noOutputTimeoutSeconds: data.commandNoOutputTimeoutSeconds ? Number(data.commandNoOutputTimeoutSeconds) : undefined, + outputMaxBytes: data.commandOutputMaxBytes ? Number(data.commandOutputMaxBytes) : undefined, + input: data.commandInput || undefined, + } satisfies CronCommandSpec : undefined; await onSubmit({ @@ -200,18 +212,41 @@ export function CronFormDialog({ open, onOpenChange, onSubmit }: CronFormDialogP )} ) : ( -
{errors.commandJson.message}
- ) : ( -{t("detail.commandJsonHelp")}
- )} +{errors.commandArgvText.message}
+ ) : ( +{t("detail.commandArgvHelp")}
+ )} +{errors.commandTimeoutSeconds.message}
} +{errors.commandNoOutputTimeoutSeconds.message}
} +{errors.commandOutputMaxBytes.message}
} +