# `MnemosyneZvex.Sidecar`

DETS-backed store for mutable per-node metadata and typed links between
nodes. Lookups by `node_type` go straight to Zvex via a filtered query —
no type-index is maintained here.

Records:

    {{:links, node_id}, %{edge_type => MapSet.t(node_id)}}
    {{:meta,  node_id}, %Mnemosyne.NodeMetadata{}}

# `t`

```elixir
@type t() :: %MnemosyneZvex.Sidecar{path: charlist(), ref: :dets.tab_name()}
```

# `close`

```elixir
@spec close(t()) :: :ok | {:error, {:dets_error, term()}}
```

Closes the underlying DETS table.

# `delete_metadata`

```elixir
@spec delete_metadata(t(), [String.t()]) :: :ok | {:error, {:dets_error, term()}}
```

Deletes metadata for the given ids.

# `get_links`

```elixir
@spec get_links(t(), String.t()) :: %{
  required(Mnemosyne.Graph.Edge.edge_type()) =&gt; MapSet.t()
}
```

Fetches the link map for a node id, defaulting to empty when absent.

# `get_metadata_many`

```elixir
@spec get_metadata_many(t(), [String.t()]) :: %{required(String.t()) =&gt; struct()}
```

Looks up metadata for many node ids; missing ids are absent from the map.

# `open`

```elixir
@spec open(Path.t()) :: {:ok, t()} | {:error, {:dets_error, term()}}
```

Opens a DETS table at the given path, creating it if needed.

# `put_link`

```elixir
@spec put_link(t(), String.t(), String.t(), Mnemosyne.Graph.Edge.edge_type()) ::
  :ok | {:error, {:dets_error, term()}}
```

Adds a bidirectional link between two nodes.

# `put_links_batch`

```elixir
@spec put_links_batch(t(), [
  {String.t(), String.t(), Mnemosyne.Graph.Edge.edge_type()}
]) ::
  :ok | {:error, {:dets_error, term()}}
```

Adds many bidirectional links in one pass (no sync).

# `put_metadata_many`

```elixir
@spec put_metadata_many(t(), %{required(String.t()) =&gt; struct()}) ::
  :ok | {:error, {:dets_error, term()}}
```

Upserts a batch of metadata entries.

# `remove_ids`

```elixir
@spec remove_ids(t(), [String.t()]) :: :ok | {:error, {:dets_error, term()}}
```

Removes the given ids from all sidecar tables and scrubs back-references
from every surviving node's link set. Mirrors
`Mnemosyne.GraphBackends.Persistence.DETS.strip_dead_refs/2`.

# `sync`

```elixir
@spec sync(t()) :: :ok | {:error, {:dets_error, term()}}
```

Flushes pending writes to disk.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
