{"record":{"id":"2ce608cc3364d935","repo":"siyuan-note/siyuan","slug":"invalid-frontend-capability-s-w","errorCode":null,"errorMessage":"invalid frontend capability [%s]: %w","messagePattern":"invalid frontend capability \\[(.+?)\\]: %w","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"kernel/agent/capability.go","lineNumber":251,"sourceCode":"\tfor _, frontend := range frontendCapabilities {\n\t\tif !validFrontendCapabilityID(frontend.ID) {\n\t\t\treturn nil, fmt.Errorf(\"invalid frontend capability ID: %s\", frontend.ID)\n\t\t}\n\t\tif strings.TrimSpace(frontend.Description) == \"\" {\n\t\t\treturn nil, fmt.Errorf(\"frontend capability description is required: %s\", frontend.ID)\n\t\t}\n\t\tif !capabilityAllowed(frontend.ID, accessContext) {\n\t\t\tcontinue\n\t\t}\n\t\tvalidationTool := &tools.Tool{\n\t\t\tName:         frontendCapabilityModelName(frontend.ID),\n\t\t\tDescription:  frontend.Description,\n\t\t\tInputSchema:  frontend.InputSchema,\n\t\t\tOutputSchema: frontend.OutputSchema,\n\t\t}\n\t\tvalidator, err := tools.CompileToolValidator(validationTool)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"invalid frontend capability [%s]: %w\", frontend.ID, err)\n\t\t}\n\t\tsource := \"native\"\n\t\tif strings.HasPrefix(frontend.ID, \"plugin/frontend/\") {\n\t\t\tsource = \"plugin\"\n\t\t}\n\t\teffects := tools.ToolEffects{}\n\t\tif frontend.Effects != nil {\n\t\t\teffects = *frontend.Effects\n\t\t}\n\t\tregistration := &capabilityRegistration{\n\t\t\tID:              frontend.ID,\n\t\t\tModelName:       validationTool.Name,\n\t\t\tTitle:           frontend.Title,\n\t\t\tDescription:     frontend.Description,\n\t\t\tSource:          source,\n\t\t\tOwnerID:         frontend.OwnerID,\n\t\t\tOwnerName:       frontend.OwnerName,\n\t\t\tRuntime:         \"browser\",","sourceCodeStart":233,"sourceCodeEnd":269,"githubUrl":"https://github.com/siyuan-note/siyuan/blob/9f775e8a12daef8255556097396f9b2739078892/kernel/agent/capability.go#L233-L269","documentation":"After building a validation tool from a frontend capability, buildCapabilitySet compiles its input/output schema with tools.CompileToolValidator. If the schema is malformed or unsupported the compile fails and the error is wrapped as 'invalid frontend capability [ID]' with the underlying reason attached via %w.","triggerScenarios":"A frontend capability registers with an InputSchema or OutputSchema that fails schema compilation (malformed JSON Schema, unsupported types, invalid required/properties structure), during buildCapabilitySet.","commonSituations":"Plugin authors hand-writing JSON Schema with typos or unsupported constructs; schemas generated dynamically that produce null/invalid types; schemas copied from OpenAPI definitions with constructs the validator does not support.","solutions":["Read the wrapped %w cause in the error to see the exact schema defect","Fix the capability's InputSchema/OutputSchema to be a valid, supported JSON Schema (correct type names, valid properties/required)","Validate the schema offline with a JSON Schema validator before registering the capability","Simplify the schema: drop unsupported keywords the compiler rejects"],"exampleFix":"// before\nInputSchema: map[string]any{\"type\": \"strng\", \"properties\": ...}\n// after\nInputSchema: map[string]any{\"type\": \"object\", \"properties\": map[string]any{...}}","handlingStrategy":"validation","validationCode":"if err := jsonschema.Validate(schemaDraft, cap.InputSchema); err != nil {\n    return err\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Lint capability schemas with a standard JSON Schema validator before registering","Start from a known-good schema template for frontend capabilities","Add a unit test that compiles every registered capability's schemas"],"tags":["go","schema","agent","capabilities"],"backgroundTag":"schema-validation-failed","analyzedSha":"9f775e8a12daef8255556097396f9b2739078892","analyzedAt":"2026-09-19T03:17:15.984Z","contentChangedAt":"2026-09-19T03:17:15.984Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}