{"record":{"id":"b47e84d6030a9a5e","repo":"jackwener/OpenCLI","slug":"duration-must-be-an-integer-between-1-and-3600-s","errorCode":null,"errorMessage":"--duration must be an integer between 1 and 3600 seconds","messagePattern":"--duration must be an integer between 1 and 3600 seconds","errorType":"validation","errorClass":"ArgumentError","httpStatus":null,"severity":"error","filePath":"clis/trae-cn/utils.js","lineNumber":56,"sourceCode":"  const limit = value === undefined || value === null ? fallback : Number(value);\n  if (!Number.isInteger(limit) || limit < 1 || limit > 200) {\n    throw new ArgumentError('--limit must be an integer between 1 and 200');\n  }\n  return limit;\n}\n\nexport function normalizeMaxChars(value, fallback = 6000) {\n  const maxChars = value === undefined || value === null ? fallback : Number(value);\n  if (!Number.isInteger(maxChars) || maxChars < 0 || maxChars > 1_000_000) {\n    throw new ArgumentError('--max-chars must be an integer between 0 and 1000000');\n  }\n  return maxChars;\n}\n\nexport function normalizeDuration(value, fallback = 30) {\n  const duration = value === undefined || value === null ? fallback : Number(value);\n  if (!Number.isInteger(duration) || duration < 1 || duration > 3600) {\n    throw new ArgumentError('--duration must be an integer between 1 and 3600 seconds');\n  }\n  return duration;\n}\n\nexport function normalizeInterval(value, fallback = 2) {\n  const interval = value === undefined || value === null ? fallback : Number(value);\n  if (!Number.isInteger(interval) || interval < 1 || interval > 300) {\n    throw new ArgumentError('--interval must be an integer between 1 and 300 seconds');\n  }\n  return interval;\n}\n\nexport function normalizeApprovalKinds(value, fallback = TRAE_CN_APPROVAL_DEFAULT_KINDS.join(',')) {\n  const raw = value === undefined || value === null || value === '' ? fallback : value;\n  const parts = Array.isArray(raw) ? raw : String(raw).split(',');\n  const expanded = [];\n  for (const part of parts) {\n    const item = String(part || '').trim().toLowerCase();","sourceCodeStart":38,"sourceCodeEnd":74,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/trae-cn/utils.js#L38-L74","documentation":"normalizeDuration in utils.js throws an ArgumentError when the --duration value is not an integer between 1 and 3600 seconds. Duration controls how long watch-mode streaming runs; the cap prevents runaway sessions of more than an hour.","triggerScenarios":"Running watch/stream commands with `--duration 0`, `--duration 7200`, `--duration 0.5`, `--duration forever`, or an empty-string value.","commonSituations":"Wanting an indefinite watch (--duration 0 or 999999); passing minutes instead of seconds (--duration 5 meaning 5 minutes); empty env interpolation.","solutions":["Pass an integer between 1 and 3600, e.g. --duration 300.","Omit --duration to use the 30-second default.","Convert minutes to seconds: 5 minutes -> --duration 300.","For longer observation, loop multiple watch invocations capped at 3600 each."],"exampleFix":"// before\nopencli trae-cn watch --stream true --duration 0\n// after\nopencli trae-cn watch --stream true --duration 3600","handlingStrategy":"validation","validationCode":"function assertDuration(v, fallback = 30) {\n  const n = v === undefined || v === null ? fallback : Number(v);\n  if (!Number.isInteger(n) || n < 1 || n > 3600) throw new Error(`Invalid --duration: ${JSON.stringify(v)}; must be an integer 1-3600 seconds`);\n  return n;\n}","typeGuard":"function isValidDuration(v) {\n  return v === undefined || v === null ||\n    (Number.isInteger(Number(v)) && Number(v) >= 1 && Number(v) <= 3600);\n}","tryCatchPattern":"try {\n  return await watchStream(duration);\n} catch (e) {\n  if (e instanceof ArgumentError && e.message.includes('--duration')) {\n    return watchStream(Math.min(Math.max(Number(duration) || 30, 1), 3600));\n  }\n  throw e;\n}","preventionTips":["There is no 'forever' value; use the 3600 maximum.","Convert minutes to seconds before passing (5 min -> 300).","For longer observation, loop repeated watch invocations.","Omit --duration to accept the 30s default."],"tags":["argument-validation","cli","input-validation"],"backgroundTag":"invalid-cli-argument","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}