affaan-m/ECC · error · anyhow::Error

memory connector {name} has no path configured

Error message

memory connector {name} has no path configured

What it means

Thrown by `sync_jsonl_memory_connector` when the connector's `settings.path` is empty (`as_os_str().is_empty()`). A JSONL file connector requires a concrete file path to open; an empty path would otherwise produce a confusing OS-level error, so the code bails early with a descriptive message naming the connector. The check runs before `File::open`.

Source

Thrown at ecc2/src/main.rs:3080

        config::MemoryConnectorConfig::DotenvFile(settings) => (
            "dotenv_file".to_string(),
            settings.path.display().to_string(),
            false,
            settings.session_id.clone(),
            settings.default_entity_type.clone(),
            settings.default_observation_type.clone(),
        ),
    }
}

fn sync_jsonl_memory_connector(
    db: &session::store::StateStore,
    name: &str,
    settings: &config::MemoryConnectorJsonlFileConfig,
    limit: usize,
) -> Result<GraphConnectorSyncStats> {
    if settings.path.as_os_str().is_empty() {
        anyhow::bail!("memory connector {name} has no path configured");
    }

    let file = File::open(&settings.path)
        .with_context(|| format!("open memory connector file {}", settings.path.display()))?;
    let reader = BufReader::new(file);
    let default_session_id = settings
        .session_id
        .as_deref()
        .map(|value| resolve_session_id(db, value))
        .transpose()?;
    let source_path = settings.path.display().to_string();
    let signature = connector_source_signature(&settings.path)?;
    if db.connector_source_is_unchanged(name, &source_path, &signature)? {
        return Ok(GraphConnectorSyncStats {
            connector_name: name.to_string(),
            skipped_unchanged_sources: 1,
            ..Default::default()
        });

View on GitHub (pinned to 01e15490f0)

Solutions

  1. Set a concrete file path in the connector config: `path = "/abs/path/to/log.jsonl"`.
  2. If using env-var interpolation, ensure the variable is set and non-empty.
  3. Validate config after edits with whatever config-check command ECC exposes, or `ecc graph connectors` to surface the connector.

Example fix

// before
[memory_connectors.feed]
type = "jsonl_file"
path = ""

// after
[memory_connectors.feed]
type = "jsonl_file"
path = "/home/user/.ecc/feed.jsonl"
Defensive patterns

Strategy: validation

Validate before calling

// Validate path at config load time
fn validate_jsonl_connector(name: &str, s: &MemoryConnectorJsonlFileConfig) -> Result<()> {
    if s.path.as_os_str().is_empty() {
        anyhow::bail!("connector {name}: jsonl_file path is empty");
    }
    Ok(())
}

Prevention

When it happens

Trigger: Configuring a `jsonl_file` connector with `path = ""` or omitting the `path` key entirely (defaulting to empty). Env-var substitution that resolves to an empty string. A config template that left the path blank.

Common situations: Copy-pasting a connector config block and forgetting to fill in the path. Conditional config that drops the path under certain profiles. Migration where the path field was renamed and the old key left empty.

Related errors


AI-assisted analysis of affaan-m/ECC@01e15490f0 (2026-08-13). Data as JSON: /api/errors/b346225c63d8631a. Report an issue: GitHub.