{"record":{"id":"66d36882bd2c2ff2","repo":"iflytek/astron-agent","slug":"8125-work-flow-dls-upload-failed-66d368","errorCode":"8125","errorMessage":"work.flow.dls.upload.failed","messagePattern":"work\\.flow\\.dls\\.upload\\.failed","errorType":"error_code","errorClass":"BusinessException","httpStatus":null,"severity":"error","filePath":"console/backend/toolkit/src/main/java/com/iflytek/astron/console/toolkit/service/workflow/WorkflowYamlParser.java","lineNumber":33,"sourceCode":"import java.util.List;\nimport java.util.Map;\n\n/** Loads and validates the portable structure of an imported workflow YAML document. */\n@Slf4j\nfinal class WorkflowYamlParser {\n    private static final int MAX_YAML_ALIASES = 50;\n    private static final int MAX_YAML_NESTING_DEPTH = 50;\n    private static final int MAX_YAML_CODE_POINTS = 20 * 1024 * 1024;\n\n    private WorkflowYamlParser() {}\n\n    static ParsedWorkflowDsl parse(InputStream inputStream) {\n        Object loaded;\n        try {\n            LoaderOptions loaderOptions = createLoaderOptions();\n            loaded = new Yaml(new SafeConstructor(loaderOptions)).load(inputStream);\n        } catch (YAMLException | ClassCastException e) {\n            throw invalidWorkflowDsl(e);\n        }\n        if (!(loaded instanceof Map<?, ?> rootMap)) {\n            throw invalidWorkflowDsl(null);\n        }\n        Map<String, Object> root = toStringKeyMap(rootMap);\n        if (!root.containsKey(\"flowMeta\") || !root.containsKey(\"flowData\")) {\n            throw invalidWorkflowDsl(null);\n        }\n        if (!(root.get(\"flowMeta\") instanceof Map<?, ?> metaRaw)\n                || !(root.get(\"flowData\") instanceof Map<?, ?> flowRaw)) {\n            throw invalidWorkflowDsl(null);\n        }\n        Map<String, Object> meta = toStringKeyMap(metaRaw);\n        Map<String, Object> flow = toStringKeyMap(flowRaw);\n        validateWorkflowMetaShape(meta);\n        validateWorkflowDslShape(flow);\n        return new ParsedWorkflowDsl(meta, flow, root.get(\"dependencyManifest\"));\n    }","sourceCodeStart":15,"sourceCodeEnd":51,"githubUrl":"https://github.com/iflytek/astron-agent/blob/5e758547a83371a5a4b29dadf4ac03e8dd527635/console/backend/toolkit/src/main/java/com/iflytek/astron/console/toolkit/service/workflow/WorkflowYamlParser.java#L15-L51","documentation":"Thrown by WorkflowYamlParser.parse when the uploaded file parses as YAML but the root is not a mapping, or the root map is missing the required top-level 'flowMeta' or 'flowData' keys. A valid workflow DSL export must be a YAML mapping containing both keys; anything else is rejected as an invalid workflow DSL.","triggerScenarios":"Uploading a YAML whose root is a list or scalar, or a valid YAML missing the flowMeta or flowData top-level section.","commonSituations":"Uploading a partial YAML that only contains flowData; renaming or deleting top-level keys during editing; concatenating exports so the root becomes a list; uploading a config file instead of a workflow export.","solutions":["Ensure the file root is a mapping containing both 'flowMeta' and 'flowData' keys","Re-export the workflow from the platform instead of reconstructing the file","Restore the deleted top-level key if it was removed during editing","Confirm the uploaded file is the plain workflow YAML export"],"exampleFix":"// before (missing flowMeta)\\nflowData:\\n  nodes: []\\n// after\\nflowMeta:\\n  name: my workflow\\n  version: 1\\nflowData:\\n  nodes: []","handlingStrategy":"validation","validationCode":"const yaml = require('js-yaml');\\nfunction validateWorkflowYaml(text) {\\n  const root = yaml.load(text);\\n  if (root == null || typeof root !== 'object' || Array.isArray(root)) throw new Error('root must be a map');\\n  for (const k of ['flowMeta','flowData']) if (!(k in root)) throw new Error(`missing ${k}`);\\n}","typeGuard":"function isWorkflowRoot(root) {\\n  return root != null && typeof root === 'object' && !Array.isArray(root)\\n    && 'flowMeta' in root && 'flowData' in root;\\n}","tryCatchPattern":"try {\\n  const root = yaml.load(text);\\n  if (!isWorkflowRoot(root)) throw new Error('missing flowMeta/flowData');\\n} catch (e) {\\n  showUserFriendlyError('The uploaded file is not a valid workflow export.');\\n}","preventionTips":["Upload only files exported by the platform","Validate YAML syntax before uploading","Never rename or remove top-level flowMeta/flowData keys"],"tags":["yaml","workflow","parse","missing-field"],"backgroundTag":"yaml-parse-error","analyzedSha":"5e758547a83371a5a4b29dadf4ac03e8dd527635","analyzedAt":"2026-09-12T08:03:51.356Z","contentChangedAt":"2026-09-12T08:03:51.356Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}