{"record":{"id":"2b01c7a09129adfd","repo":"continuedev/continue","slug":"skipping-input-key-with-invalid-value-type","errorCode":null,"errorMessage":"Skipping input \"${key}\" with invalid value type: ${typeof value}. Expected string.","messagePattern":"Skipping input \"(.+?)\" with invalid value type: (.+?)\\. Expected string\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"packages/config-yaml/src/load/unroll.ts","lineNumber":819,"sourceCode":"      // Convert the rule object to the expected format\n      parsedYaml = { name: rule.name, version: \"1.0.0\", rules: [rule] } as T;\n    } catch (markdownError) {\n      // If both fail, throw the original YAML error\n      throw yamlError;\n    }\n  }\n  return parsedYaml;\n}\n\nfunction inputsToFQSNs(\n  inputs: Record<string, string | undefined>,\n  blockIdentifier: PackageIdentifier,\n): Record<string, string> {\n  const renderedInputs: Record<string, string> = {};\n  for (const [key, value] of Object.entries(inputs)) {\n    // Skip undefined, null, or non-string values\n    if (value === undefined || value === null || typeof value !== \"string\") {\n      console.warn(\n        `Skipping input \"${key}\" with invalid value type: ${typeof value}. Expected string.`,\n      );\n      continue;\n    }\n\n    renderedInputs[key] = renderTemplateData(value, {\n      secrets: extractFQSNMap(value, [blockIdentifier]),\n    });\n  }\n  return renderedInputs;\n}\n\nexport function mergeOverrides<T extends Record<string, any>>(\n  block: T,\n  overrides: Partial<T>,\n): T {\n  for (const key in overrides) {\n    if (overrides.hasOwnProperty(key)) {","sourceCodeStart":801,"sourceCodeEnd":837,"githubUrl":"https://github.com/continuedev/continue/blob/5522c6f44ca0ac3528b37244818fbfa39b5af470/packages/config-yaml/src/load/unroll.ts#L801-L837","documentation":"In packages/config-yaml's unroll stage, renderInputs builds a Record<string,string> of package inputs. Any input whose value is undefined, null, or not a string (number, boolean, object, array) is skipped with this warning, because templating (renderTemplateData) only operates on strings. YAML users often write numeric or boolean input values, which YAML parses as non-string scalars.","triggerScenarios":"A YAML package config defining inputs like `count: 3` or `verbose: true` (YAML scalar types, not quoted strings) fed into the unroll/renderInputs path.","commonSituations":"Writing numeric ports, booleans, or nested maps as package inputs in config YAML; merging JSON defaults that contain numbers; forgetting quotes around values intended as strings.","solutions":["Quote the value in YAML so it parses as a string: `count: \"3\"` instead of `count: 3`","Coerce non-string inputs to strings before passing them (String(value)) if the value is meaningful","Remove inputs that are undefined/null because the key was not provided and no default exists","Keep input schemas to flat string fields only; this API explicitly expects Record<string,string>"],"exampleFix":"# before\ninputs:\n  port: 8080\n  verbose: true\n\n# after\ninputs:\n  port: \"8080\"\n  verbose: \"true\"","handlingStrategy":"validation","validationCode":"const clean = Object.fromEntries(\n  Object.entries(inputs).filter(\n    ([, v]) => typeof v === \"string\" && v.length > 0,\n  ),\n);","typeGuard":"const isStringInputs = (i: unknown): i is Record<string, string> =>\n  typeof i === \"object\" && i !== null &&\n  Object.values(i).every((v) => typeof v === \"string\");","tryCatchPattern":null,"preventionTips":["Always quote scalar input values in YAML configs","Run a schema check on inputs before unroll: every value must be a string","Coerce numbers/booleans with String() at the config boundary"],"tags":["yaml","config","type-validation","templating"],"backgroundTag":"yaml-type-mismatch","analyzedSha":"5522c6f44ca0ac3528b37244818fbfa39b5af470","analyzedAt":"2026-08-27T11:28:54.683Z","schemaVersion":2},"datasetVersion":"2026-08-27T13:17:12.746Z"}