{"record":{"id":"8e70f170124c322b","repo":"continuedev/continue","slug":"invalid-fqsn-format-package-slug-must-have-two-pa","errorCode":null,"errorMessage":"Invalid FQSN format: package slug must have two parts","messagePattern":"Invalid FQSN format: package slug must have two parts","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/config-yaml/src/interfaces/slugs.ts","lineNumber":187,"sourceCode":"export interface FQSN {\n  packageSlugs: PackageSlug[];\n  secretName: string;\n}\n\nexport function encodeFQSN(fqsn: FQSN): string {\n  const parts = [...fqsn.packageSlugs.map(encodePackageSlug), fqsn.secretName];\n  return parts.join(\"/\");\n}\n\nexport function decodeFQSN(fqsn: string): FQSN {\n  const parts = fqsn.split(\"/\");\n  const secretName = parts.pop()!;\n  const packageSlugs: PackageSlug[] = [];\n\n  // Process parts two at a time to decode package slugs\n  for (let i = 0; i < parts.length; i += 2) {\n    if (i + 1 >= parts.length) {\n      throw new Error(\"Invalid FQSN format: package slug must have two parts\");\n    }\n    packageSlugs.push({\n      ownerSlug: parts[i],\n      packageSlug: parts[i + 1],\n    });\n  }\n\n  return { packageSlugs, secretName };\n}\n","sourceCodeStart":169,"sourceCodeEnd":197,"githubUrl":"https://github.com/continuedev/continue/blob/5522c6f44ca0ac3528b37244818fbfa39b5af470/packages/config-yaml/src/interfaces/slugs.ts#L169-L197","documentation":"decodeFQSN splits a fully-qualified secret name into [secret, then owner/package pairs]. Package slugs consume parts two at a time; if an odd count remains, the last owner slug has no package slug and the FQSN is structurally invalid.","triggerScenarios":"decodeFQSN('owner') or decodeFQSN('secret1/owner/pkg/owner2') — any string where, after removing the secret name, the remaining segments are not evenly divisible into owner/package pairs.","commonSituations":"Hand-written FQSN strings, a secret name containing '/' being misparsed, or copy/paste truncating the FQSN.","solutions":["Check the FQSN string: it must be owner/package pairs followed by the secret name, e.g. owner/package/secret-name","If secret names contain slashes, rename them or fix the encoder","Validate with decodeFQSN.try pattern (safeParse-style wrapper) before use"],"exampleFix":"// before\ndecodeFQSN('my-owner');\n// after\ndecodeFQSN('my-owner/my-package/my-secret');","handlingStrategy":"validation","validationCode":"function isValidFQSN(fqsn: string): boolean {\n  const parts = fqsn.split('/');\n  return parts.length >= 3 && (parts.length - 1) % 2 === 0;\n}","typeGuard":null,"tryCatchPattern":"try { decodeFQSN(s); } catch (e) { /* report invalid FQSN string to user */ }","preventionTips":["Generate FQSNs with encodeFQSN rather than hand-writing","Avoid '/' in secret names","Validate before decoding user-supplied FQSNs"],"tags":["fqsn","slug","parsing","validation"],"backgroundTag":"invalid-identifier-format","analyzedSha":"5522c6f44ca0ac3528b37244818fbfa39b5af470","analyzedAt":"2026-08-27T11:28:54.683Z","schemaVersion":2},"datasetVersion":"2026-08-27T13:17:12.746Z"}