{"record":{"id":"1ee2b57ff15c347c","repo":"neoclide/coc.nvim","slug":"service-id-not-found","errorCode":null,"errorMessage":"Service ${id} not found","messagePattern":"Service (.+?) not found","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/services.ts","lineNumber":233,"sourceCode":"    if (service) return Promise.resolve(service.stop())\n  }\n\n  /**\n   * @internal\n   * Best-effort stop of all registered services, used on process exit.\n   * Stops waiting after `timeout` milliseconds.\n   */\n  public stopAll(timeout = 3000): Promise<void> {\n    let all = Array.from(this.registered.values())\n    return Promise.race([\n      Promise.allSettled(all.map(s => Promise.resolve(s.stop()))).then(() => undefined),\n      wait(timeout)\n    ])\n  }\n\n  public async toggle(id: string): Promise<void> {\n    let service = this.registered.get(id)\n    if (!service) throw new Error(`Service ${id} not found`)\n    let { state } = service\n    if (state == ServiceStat.Running) {\n      await Promise.resolve(service.stop())\n    } else if (state == ServiceStat.Initial || state == ServiceStat.StartFailed) {\n      await service.start()\n    } else if (state == ServiceStat.Stopped) {\n      await service.restart()\n    }\n  }\n  /**\n   * @internal\n   */\n\n  public getServiceStats(): ServiceInfo[] {\n    let res: ServiceInfo[] = []\n    for (let [id, service] of this.registered) {\n      res.push({\n        id,","sourceCodeStart":215,"sourceCodeEnd":251,"githubUrl":"https://github.com/neoclide/coc.nvim/blob/50e974d9692461a69147d5cab146a8d3e439abe4/src/services.ts#L215-L251","documentation":"Services toggle throws when the given id has never been registered with the service manager. coc.nvim keeps registered services in a map and looks the id up before toggling its state; an unknown id means there is nothing to start or stop. It is a fail-fast guard against typos or unregistered service ids.","triggerScenarios":"Calling services.toggle(id) with an id that was never registered via registerService, or after the service was unregistered/disposed.","commonSituations":"Typo in service id in a custom extension or keymapping; service unregistered on extension deactivate before a delayed toggle call runs.","solutions":["Verify the service id by listing registered services (check how extensions register them, e.g. package.json contributes or extension source).","Fix the id string in your toggle call.","Ensure the extension providing the service is activated before toggling.","Check the service was not unregistered/disposed earlier in your code path."],"exampleFix":"// before\nawait services.toggle('lua-ls')\n// after\nawait services.toggle('lua') // use the exact id passed to registerService","handlingStrategy":"validation","validationCode":"let service = services.getService(id)\nif (!service) throw new Error(`Unknown service id: ${id}`)\nawait services.toggle(id)","typeGuard":"function hasService(id: string): boolean {\n  return services.getService(id) != null\n}","tryCatchPattern":"try {\n  await services.toggle(id)\n} catch (e) {\n  if (String(e.message).includes('not found')) logger.warn(`service ${id} missing`)\n}","preventionTips":["Keep service ids in shared constants instead of string literals.","Verify the providing extension is activated before toggling.","Guard with getService() before calling toggle.","Handle service disposal/unregistration in deactivate paths."],"tags":["services","invalid-argument"],"backgroundTag":"service-not-found","analyzedSha":"50e974d9692461a69147d5cab146a8d3e439abe4","analyzedAt":"2026-08-31T11:17:23.966Z","schemaVersion":2},"datasetVersion":"2026-09-01T08:17:40.651Z"}