nexu-io/open-design · error · Error

Local CLI agent "${provider.agentId}" is not installed

Error message

Local CLI agent "${provider.agentId}" is not installed

What it means

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.

Source

Thrown at apps/daemon/src/memory-llm.ts:965

    .join('')
    .trim();
}

async function callLocalCli(provider, system, user, options) {
  if (typeof options?.localCliRunner === 'function') {
    return options.localCliRunner({
      agentId: provider.agentId,
      model: provider.model,
      system,
      user,
      projectRoot: options?.projectRoot ?? null,
      dataDir: options?.dataDir ?? null,
    });
  }

  const def = getAgentDef(provider.agentId);
  if (!def) {
    throw new Error(`Local CLI agent "${provider.agentId}" is not installed`);
  }

  let configuredAgentEnv = {};
  try {
    const appConfig = options?.dataDir ? await readAppConfig(options.dataDir) : {};
    configuredAgentEnv = agentCliEnvForAgent(appConfig.agentCliEnv, def.id);
  } catch {
    configuredAgentEnv = {};
  }

  const launch = resolveAgentLaunch(def, configuredAgentEnv);
  if (!launch?.launchPath) {
    throw new Error(`${def.name} CLI is not installed or not on PATH`);
  }

  // The memory extractor is a tool-less, JSON-only background call that never
  // reads project files, so it has no reason to run in the daemon's own cwd.
  // Falling back to process.cwd() there meant a bun-based agent (OpenCode) ran

View on GitHub (pinned to 5be4028344)

Solutions

  1. Verify provider.agentId matches a registered agent id (e.g. 'claude', 'codex', 'opencode')
  2. Reinstall or re-enable the agent if it was removed
  3. List available agents to confirm the correct id spelling
  4. Update the memory provider config to use an installed agent

Example fix

// before — typo or unregistered agent
provider = { agentId: 'cluade', model: '...' };

// after — correct registered id
provider = { agentId: 'claude', model: '...' };
Defensive patterns

Strategy: validation

Validate before calling

import { getAgentDef } from './runtimes/registry';

function assertAgentInstalled(agentId) {
  const def = getAgentDef(agentId);
  if (!def) {
    throw new Error(`Agent "${agentId}" is not registered. Available agents can be listed via 'od agent list'.`);
  }
  return def;
}

Type guard

import { getAgentDef } from './runtimes/registry';

function isAgentRegistered(agentId: string): boolean {
  return getAgentDef(agentId) !== null;
}

Prevention

When it happens

Trigger: 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').

Common situations: 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.

Related errors


AI-assisted analysis of nexu-io/open-design@5be4028344 (2026-08-12). Data as JSON: /api/errors/b50cf627611e5188. Report an issue: GitHub.