{"record":{"id":"b50cf627611e5188","repo":"nexu-io/open-design","slug":"local-cli-agent-provider-agentid-is-not-insta","errorCode":null,"errorMessage":"Local CLI agent \"${provider.agentId}\" is not installed","messagePattern":"Local CLI agent \"(.+?)\" is not installed","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"apps/daemon/src/memory-llm.ts","lineNumber":965,"sourceCode":"    .join('')\n    .trim();\n}\n\nasync function callLocalCli(provider, system, user, options) {\n  if (typeof options?.localCliRunner === 'function') {\n    return options.localCliRunner({\n      agentId: provider.agentId,\n      model: provider.model,\n      system,\n      user,\n      projectRoot: options?.projectRoot ?? null,\n      dataDir: options?.dataDir ?? null,\n    });\n  }\n\n  const def = getAgentDef(provider.agentId);\n  if (!def) {\n    throw new Error(`Local CLI agent \"${provider.agentId}\" is not installed`);\n  }\n\n  let configuredAgentEnv = {};\n  try {\n    const appConfig = options?.dataDir ? await readAppConfig(options.dataDir) : {};\n    configuredAgentEnv = agentCliEnvForAgent(appConfig.agentCliEnv, def.id);\n  } catch {\n    configuredAgentEnv = {};\n  }\n\n  const launch = resolveAgentLaunch(def, configuredAgentEnv);\n  if (!launch?.launchPath) {\n    throw new Error(`${def.name} CLI is not installed or not on PATH`);\n  }\n\n  // The memory extractor is a tool-less, JSON-only background call that never\n  // reads project files, so it has no reason to run in the daemon's own cwd.\n  // Falling back to process.cwd() there meant a bun-based agent (OpenCode) ran","sourceCodeStart":947,"sourceCodeEnd":983,"githubUrl":"https://github.com/nexu-io/open-design/blob/5be4028344c2eb4c667c5a97bda8f750c5597ef7/apps/daemon/src/memory-llm.ts#L947-L983","documentation":"getAgentDef(provider.agentId) returned null, meaning the agentId is not found in the daemon's runtime agent registry (AGENT_DEFS). The memory extractor requires a registered agent definition to resolve its CLI launch path, environment, and argument builder.","triggerScenarios":"The memory provider configuration references an agentId that is not registered in AGENT_DEFS; the agent plugin was uninstalled but the provider config still references it; the agentId has a typo (e.g. 'cluade' instead of 'claude').","commonSituations":"User configured a custom agent that was later removed or disabled; agent plugin uninstalled but provider config not updated; typo in agentId; agent registry not loaded due to startup error.","solutions":["Verify provider.agentId matches a registered agent id (e.g. 'claude', 'codex', 'opencode')","Reinstall or re-enable the agent if it was removed","List available agents to confirm the correct id spelling","Update the memory provider config to use an installed agent"],"exampleFix":"// before — typo or unregistered agent\nprovider = { agentId: 'cluade', model: '...' };\n\n// after — correct registered id\nprovider = { agentId: 'claude', model: '...' };","handlingStrategy":"validation","validationCode":"import { getAgentDef } from './runtimes/registry';\n\nfunction assertAgentInstalled(agentId) {\n  const def = getAgentDef(agentId);\n  if (!def) {\n    throw new Error(`Agent \"${agentId}\" is not registered. Available agents can be listed via 'od agent list'.`);\n  }\n  return def;\n}","typeGuard":"import { getAgentDef } from './runtimes/registry';\n\nfunction isAgentRegistered(agentId: string): boolean {\n  return getAgentDef(agentId) !== null;\n}","tryCatchPattern":null,"preventionTips":["Validate agentId against the registry before configuring it as a memory provider","Keep agent plugin installations in sync with provider configurations","Use exact agent id strings from the registry listing"],"tags":["agent-cli","memory-extraction","configuration","registry"],"backgroundTag":null,"analyzedSha":"5be4028344c2eb4c667c5a97bda8f750c5597ef7","analyzedAt":"2026-08-12T12:03:58.812Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}