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
- Set a concrete file path in the connector config: `path = "/abs/path/to/log.jsonl"`.
- If using env-var interpolation, ensure the variable is set and non-empty.
- 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
- Add a config-validation step at startup that fails fast on empty paths.
- Use absolute paths to avoid ambiguity.
- Template config files with a placeholder that fails validation until filled in.
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
- memory connector {name} path is not a directory: {}
- Unknown memory connector: {name}
- --config-dir must be an existing absolute directory.
- connector name required unless --all is set
- invalid qualification configuration
AI-assisted analysis of affaan-m/ECC@01e15490f0 (2026-08-13).
Data as JSON: /api/errors/b346225c63d8631a.
Report an issue: GitHub.