{"record":{"id":"9cb4a7d7c3ed5e99","repo":"ComposioHQ/composio","slug":"experimental-subagent-could-not-determine-an-age","errorCode":null,"errorMessage":"experimental_subAgent() could not determine an agent CLI. Current master is user; install codex or claude, or pass { target: \"codex\" | \"claude\" }.","messagePattern":"experimental_subAgent\\(\\) could not determine an agent CLI\\. Current master is user; install codex or claude, or pass (.+?)\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"ts/packages/cli/src/services/run-helpers-runtime.ts","lineNumber":825,"sourceCode":"    if (\n      helperContext.master === 'claude' ||\n      helperContext.master === 'codex' ||\n      helperContext.master === 'user'\n    ) {\n      return helperContext.master;\n    }\n    return 'user';\n  };\n\n  const resolveInvokeAgentTarget = (requestedTarget?: string): 'claude' | 'codex' => {\n    if (requestedTarget === 'claude' || requestedTarget === 'codex') return requestedTarget;\n    const configuredTarget = readConfiguredExperimentalSubagentTarget(helperContext.cliConfigPath);\n    if (configuredTarget === 'claude' || configuredTarget === 'codex') return configuredTarget;\n    const detected = requestedTarget === 'user' ? 'user' : detectInvokeAgentMaster();\n    if (detected === 'codex' || detected === 'claude') return detected;\n    if (typeof Bun.which === 'function' && Bun.which('codex')) return 'codex';\n    if (typeof Bun.which === 'function' && Bun.which('claude')) return 'claude';\n    throw new Error(\n      'experimental_subAgent() could not determine an agent CLI. Current master is user; install codex or claude, or pass { target: \"codex\" | \"claude\" }.'\n    );\n  };\n\n  const experimentalSubAgentImpl = async (\n    prompt: string,\n    options: Record<string, unknown> = {}\n  ) => {\n    if (typeof prompt !== 'string' || prompt.trim().length === 0) {\n      throw new Error('experimental_subAgent() requires a non-empty prompt string.');\n    }\n    const logFilePath =\n      typeof helperContext.runLogFilePath === 'string' && helperContext.runLogFilePath.length > 0\n        ? helperContext.runLogFilePath\n        : undefined;\n    const normalizedOptions = normalizeInvokeAgentOptions(options);\n    const target = resolveInvokeAgentTarget(normalizedOptions.target);\n    const master = detectInvokeAgentMaster();","sourceCodeStart":807,"sourceCodeEnd":843,"githubUrl":"https://github.com/ComposioHQ/composio/blob/64b1b85502b1beeb2379e6c9e8bf1104504fa637/ts/packages/cli/src/services/run-helpers-runtime.ts#L807-L843","documentation":"experimental_subAgent() needs an agent CLI (codex or claude) to spawn. Target resolution checks the configured target, detects the current master, and falls back to Bun.which for both binaries; if all fail and the master is 'user' (no agent context), this error is thrown.","triggerScenarios":"Running inside a context where the master agent is 'user' (plain shell/user session), no configured experimental subagent target is set, and neither `codex` nor `claude` is on PATH (or Bun.which is unavailable).","commonSituations":"Testing subagent code from a plain script instead of inside Codex/Claude Code; agent CLIs installed via a version manager not on the PATH the CLI process sees; stripped-down CI containers without agent binaries.","solutions":["Install codex or claude and ensure the binary is on PATH","Pass an explicit target: experimental_subAgent(prompt, { target: 'codex' })","Set the configured experimental subagent target in the CLI config referenced by helperContext.cliConfigPath","Run from within a Codex or Claude Code session so the master is auto-detected"],"exampleFix":"// before\nawait experimental_subAgent('do thing'); // master is user, no CLIs found\n// after\nawait experimental_subAgent('do thing', { target: 'codex' }); // requires codex on PATH\n// or: install the CLI, e.g. npm i -g @openai/codex","handlingStrategy":"fallback","validationCode":"const cli = ['codex','claude'].find(c => typeof Bun.which === 'function' && Bun.which(c));\nif (!cli) throw new Error('no agent CLI on PATH');\nawait experimental_subAgent(prompt, { target: cli });","typeGuard":"const agentCliAvailable = (): boolean => (typeof Bun.which === 'function' && (!!Bun.which('codex') || !!Bun.which('claude')));","tryCatchPattern":"catch (e) { if (e instanceof Error && e.message.includes('could not determine an agent CLI')) { /* install codex/claude or set explicit target */ } }","preventionTips":["Install at least one agent CLI on PATH","Pass an explicit target when running outside Codex/Claude Code","Set the configured subagent target in CLI config"],"tags":["subagent","cli-not-found","path","environment"],"backgroundTag":"executable-not-found","analyzedSha":"64b1b85502b1beeb2379e6c9e8bf1104504fa637","analyzedAt":"2026-08-28T15:39:33.623Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}