{"record":{"id":"8a6505c85be8c947","repo":"wavetermdev/waveterm","slug":"invalid-origin-value-s-must-be-start-or-end","errorCode":null,"errorMessage":"invalid origin value '%s': must be 'start' or 'end'","messagePattern":"invalid origin value '(.+?)': must be 'start' or 'end'","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/aiusechat/tools_readfile.go","lineNumber":53,"sourceCode":"\tif input == nil {\n\t\treturn nil, fmt.Errorf(\"input is required\")\n\t}\n\n\tif err := utilfn.ReUnmarshal(result, input); err != nil {\n\t\treturn nil, fmt.Errorf(\"invalid input format: %w\", err)\n\t}\n\n\tif result.Filename == \"\" {\n\t\treturn nil, fmt.Errorf(\"missing filename parameter\")\n\t}\n\n\tif result.Origin == nil {\n\t\torigin := \"start\"\n\t\tresult.Origin = &origin\n\t}\n\n\tif *result.Origin != \"start\" && *result.Origin != \"end\" {\n\t\treturn nil, fmt.Errorf(\"invalid origin value '%s': must be 'start' or 'end'\", *result.Origin)\n\t}\n\n\tif result.Offset == nil {\n\t\toffset := 0\n\t\tresult.Offset = &offset\n\t}\n\n\tif *result.Offset < 0 {\n\t\treturn nil, fmt.Errorf(\"offset must be non-negative, got %d\", *result.Offset)\n\t}\n\n\tif result.Count == nil {\n\t\tcount := ReadFileDefaultLineCount\n\t\tresult.Count = &count\n\t}\n\n\tif *result.Count < 1 {\n\t\treturn nil, fmt.Errorf(\"count must be at least 1, got %d\", *result.Count)","sourceCodeStart":35,"sourceCodeEnd":71,"githubUrl":"https://github.com/wavetermdev/waveterm/blob/a4447c1563b2df285ab89e76c82f91e1a1a49c1e/pkg/aiusechat/tools_readfile.go#L35-L71","documentation":"The optional \"origin\" parameter controls where offset counting starts and must be exactly \"start\" or \"end\". Any other string is rejected at parse time so the callback never applies an undefined seek semantic.","triggerScenarios":"Passing origin values like \"beginning\", \"top\", \"0\", \"middle\", or locale variants; uppercase \"Start\" also fails because the check is case-sensitive.","commonSituations":"Agents paraphrasing enum values; ports from other file-read APIs using \"begin\"/\"end\" conventions; prompt templates hard-coding the wrong token.","solutions":["Use origin \"start\" (default) or \"end\" verbatim, lowercase.","Omit \"origin\" entirely to get the default \"start\".","Validate against the enum before calling: origin == \"start\" || origin == \"end\"."],"exampleFix":"// before\n{\"filename\": \"/tmp/a.txt\", \"origin\": \"beginning\"}\n// after\n{\"filename\": \"/tmp/a.txt\", \"origin\": \"start\"}","handlingStrategy":"validation","validationCode":"if origin !== undefined && origin !== 'start' && origin !== 'end' {\n  throw new Error(\"origin must be 'start' or 'end'\")\n}","typeGuard":"func validOrigin(s string) bool { return s == \"start\" || s == \"end\" }","tryCatchPattern":"params, err := parseReadTextFileInput(input)\nif err != nil && strings.HasPrefix(err.Error(), \"invalid origin value\") {\n    // coerce: default to \"start\" and retry\n}","preventionTips":["Only emit the literals \"start\" or \"end\"","Omit origin when default (start) is intended","Lowercase-normalize any computed origin value"],"tags":["input-validation","enum","tooling"],"backgroundTag":"invalid-enum-value","analyzedSha":"a4447c1563b2df285ab89e76c82f91e1a1a49c1e","analyzedAt":"2026-09-01T15:26:23.972Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}