langchain-ai/deepagents · error · RuntimeError

shell.allow_list is missing from the configuration manifest

Error message

shell.allow_list is missing from the configuration manifest

What it means

`_resolve_shell_allow_list` reads the `shell.allow_list` option through the configuration manifest (`get_option`); if the option is absent from the manifest it raises `RuntimeError`. This is an internal-consistency guard: the code expects the manifest to declare this option, so a missing entry means a broken/incomplete install or manifest.

Source

Thrown at libs/code/deepagents_code/client/non_interactive.py:1687

        )


def _resolve_shell_allow_list() -> list[str] | None:
    """Resolve the non-interactive shell policy.

    Returns:
        The configured allow-list, or `None` when shell access is disabled.

    Raises:
        RuntimeError: If the option is absent from the manifest.
    """
    from deepagents_code.config_manifest import _emit_ranked_diagnostics, get_option
    from deepagents_code.configuration.resolver import get_config_resolver

    option = get_option("shell.allow_list")
    if option is None:
        msg = "shell.allow_list is missing from the configuration manifest"
        raise RuntimeError(msg)
    resolved = get_config_resolver().get(option)
    _emit_ranked_diagnostics(option, resolved)
    return cast("list[str] | None", resolved.value)


def _make_hitl_decision(
    action_request: ActionRequest, console: Console
) -> dict[str, str]:
    """Decide whether to approve or reject a single action request.

    This function is only invoked when a restrictive shell allow-list is
    configured (not `all`). When shell is disabled or unrestricted,
    `interrupt_on` is empty and this function is bypassed entirely.

    Shell tools are always gated: if an allow-list is configured, the command
    is validated against it; if no allow-list is configured, shell commands
    are rejected outright (defense-in-depth — the caller should disable
    shell tools when no allow-list is present, but this function fails

View on GitHub (pinned to a1af029e6e)

Solutions

  1. Reinstall/upgrade `deepagents-code` so the config manifest and client code come from the same version.
  2. Check that no local module named `deepagents_code/config_manifest.py` shadows the real one.
  3. Verify `shell.allow_list` is registered in the package's manifest definitions and, if this is a fork, add the option to the manifest.
  4. Clear stale build artifacts (`*.egg-info`, `__pycache__`) and reinstall.

Example fix

// before: stale mixed install
pip show deepagents-code  # version X, but manifest lacks shell.allow_list
// after
pip install --force-reinstall deepagents-code==<same-latest-version>
Defensive patterns

Strategy: validation

Validate before calling

from deepagents_code.config_manifest import get_option
if get_option("shell.allow_list") is None:
    raise SystemExit("config manifest is incomplete: reinstall deepagents-code")

Try / catch

try:
    run_non_interactive(task)
except RuntimeError as exc:
    if "missing from the configuration manifest" in str(exc):
        reinstall_or_report(exc)  # version-consistency fault, not user error

Prevention

When it happens

Trigger: `get_option("shell.allow_list")` returns `None` while resolving the shell allow list during `_make_hitl_decision` or `run_non_interactive` — i.e. the installed `config_manifest` does not register the `shell.allow_list` option.

Common situations: Partially upgraded packages where `deepagents_code.config_manifest` and `client.non_interactive` versions are out of sync; vendored or monkey-patched manifest registries that dropped the option; import shadowing by a stale local `config_manifest` module.

Related errors


AI-assisted analysis of langchain-ai/deepagents@a1af029e6e (2026-08-29). Data as JSON: /api/errors/2c1ae158987693ef. Report an issue: GitHub.