{"record":{"id":"c64a1d8bc3a7d460","repo":"deepseek-ai/deepseek-harness","slug":"lsp-stdio-server-ids-must-be-non-empty-strings","errorCode":null,"errorMessage":"lsp-stdio: server ids must be non-empty strings","messagePattern":"lsp-stdio: server ids must be non-empty strings","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/lsp/lsp-stdio/src/index.ts","lineNumber":143,"sourceCode":" */\nexport async function apply(ctx: Context, config: Config): Promise<void> {\n  const entries = Object.entries(config.servers)\n  if (entries.length === 0) throw new Error('lsp-stdio: servers must contain at least one server')\n\n  const setupAbort = new AbortController()\n  const stopSetupCancellation = ctx.on('internal/plugin', (fiber) => {\n    // An async plugin callback must observe its own disposal before Cordis can\n    // run effect cleanup, because unload otherwise waits for this callback.\n    if (fiber === ctx.fiber && fiber.uid === null) {\n      setupAbort.abort(new Error('lsp-stdio setup disposed'))\n    }\n  })\n\n  // Resolve every server-local setting before registration so a bad later command or bound cannot\n  // publish an earlier provider. Registry-level mapping conflicts are rolled back below.\n  const providers = await (async () => {\n    const lookups = entries.map(async ([providerId, rawConfig]) => {\n      if (providerId.trim() === '') throw new Error('lsp-stdio: server ids must be non-empty strings')\n      const resolved = rawConfig as ResolvedServerConfig\n      validateServerConfig(providerId, resolved)\n      const executable = await ctx.subprocess.resolveExecutable(\n        resolved.command,\n        resolved.env,\n        setupAbort.signal,\n      )\n      setupAbort.signal.throwIfAborted()\n      return new LocalLspProvider(\n        providerId,\n        ctx.fs,\n        resolved,\n        executable,\n        spec => ctx.subprocess.spawn(spec),\n      )\n    })\n    try {\n      return await Promise.all(lookups)","sourceCodeStart":125,"sourceCodeEnd":161,"githubUrl":"https://github.com/deepseek-ai/deepseek-harness/blob/b150a551b8d465e31e418e1b2eaf5e79bbb7d28e/packages/lsp/lsp-stdio/src/index.ts#L125-L161","documentation":"Error \"lsp-stdio: server ids must be non-empty strings\" thrown in deepseek-ai/deepseek-harness.","triggerScenarios":"Thrown at packages/lsp/lsp-stdio/src/index.ts:143 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Give every server a non-empty string id."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"b150a551b8d465e31e418e1b2eaf5e79bbb7d28e","analyzedAt":"2026-08-24T18:12:29.105Z","schemaVersion":2},"datasetVersion":"2026-08-24T22:17:12.610Z"}