{"record":{"id":"e4f953f82fe39982","repo":"sxyazi/yazi","slug":"cannot-construct-system-event","errorCode":null,"errorMessage":"Cannot construct system event","messagePattern":"Cannot construct system event","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"yazi-dds/src/ember/ember.rs","lineNumber":87,"sourceCode":"\t\t\t\t| \"load\"\n\t\t\t\t| \"hover\"\n\t\t\t\t| \"rename\"\n\t\t\t\t| \"bulk-rename\"\n\t\t\t\t| \"@yank\"\n\t\t\t\t| \"duplicate\"\n\t\t\t\t| \"move\"\n\t\t\t\t| \"trash\"\n\t\t\t\t| \"delete\"\n\t\t\t\t| \"download\"\n\t\t\t\t| \"input\"\n\t\t\t\t| \"mount\"\n\t\t\t\t| \"theme\"\n\t\t) || kind.starts_with(\"key-\")\n\t\t\t|| kind.starts_with(\"ind-\")\n\t\t\t|| kind.starts_with(\"emit-\")\n\t\t\t|| kind.starts_with(\"relay-\")\n\t\t{\n\t\t\tbail!(\"Cannot construct system event\");\n\t\t}\n\n\t\tlet mut it = kind.bytes().peekable();\n\t\tif it.peek() == Some(&b'@') {\n\t\t\tit.next(); // Skip `@` as it's a prefix for static messages\n\t\t}\n\t\tif !it.all(|b| matches!(b, b'0'..=b'9' | b'a'..=b'z' | b'-')) {\n\t\t\tbail!(\"Kind `{kind}` must be in kebab-case\");\n\t\t}\n\n\t\tOk(())\n\t}\n}\n\nimpl<'a> Ember<'a> {\n\tpub fn kind(&self) -> &str {\n\t\tmatch self {\n\t\t\tSelf::Hi(_) => \"hi\",","sourceCodeStart":69,"sourceCodeEnd":105,"githubUrl":"https://github.com/sxyazi/yazi/blob/5f901b886b14de1f17460b6e52e9de5d67f8aba9/yazi-dds/src/ember/ember.rs#L69-L105","documentation":"Ember (DDS event) validation (yazi-dds/src/ember/ember.rs:87) forbids external construction of events whose kind collides with Yazi's own namespaces: reserved body kinds like `theme`, any `key-*`, `ind-*`, `emit-*`, or `relay-*` prefix. Attempting to validate/construct such a kind bails because only Yazi itself may emit system events.","triggerScenarios":"Calling `Ember::validate` (or constructing an Ember) with a kind string that equals a reserved kind (e.g. `theme`, `key-move`, `ind-start`) or begins with `emit-`, `relay-`, `key-`, `ind-`.","commonSituations":"Third-party plugin or remote client via `ya pub-emit`/DDS trying to emit an event that shadows Yazi's internal event names.","solutions":["Rename your event kind to something in your own namespace that does not use reserved prefixes (key-, ind-, emit-, relay-) or the reserved names like `theme`.","If broadcasting a real system event, use the designated API (`ya emit`) rather than constructing it manually.","Prefix custom events with `@` (static messages) or a unique vendor prefix."],"exampleFix":"// before\nEmber::validate(\"emit-my-event\")?;\n// after\nEmber::validate(\"my-plugin:my-event\")?;","handlingStrategy":"validation","validationCode":"const RESERVED: [&str; 1] = [\"theme\"];\nfn kind_allowed(kind: &str) -> bool {\n    !RESERVED.contains(&kind)\n        && !kind.starts_with(\"key-\")\n        && !kind.starts_with(\"ind-\")\n        && !kind.starts_with(\"emit-\")\n        && !kind.starts_with(\"relay-\")\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Namespace custom plugin events with a unique prefix that avoids key-, ind-, emit-, relay-.","Use `ya emit` for genuine system events instead of manual construction.","Keep a list of reserved kinds in your plugin and assert against it in tests."],"tags":["dds","event-kind","reserved-namespace","validation"],"backgroundTag":"reserved-event-name","analyzedSha":"5f901b886b14de1f17460b6e52e9de5d67f8aba9","analyzedAt":"2026-09-02T18:38:25.566Z","contentChangedAt":"2026-09-02T18:38:25.566Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}