Understanding the Role of node_id in the Mermaid Canvas Tracing Mechanism

The node_id field serves as the unique bridge connecting offload log entries to visual nodes in the generated Mermaid flowchart, enabling bidirectional traceability between the graphical canvas and underlying tool call execution history.

In the TencentDB-Agent-Memory architecture, the node_id plays a critical role in maintaining observability across the agent's execution pipeline. This identifier creates a persistent link between raw tool call records stored in offload.jsonl and their visual representations in the interactive Mermaid Canvas, allowing developers and LLM systems to trace specific diagram nodes back to their originating execution data.

The Lifecycle of node_id in the Offload Pipeline

Initial Null State in Offload Entries

When tool call results are first persisted to the offload log, each entry defined in MemoryCore/src/offload/types.ts contains a node_id field initialized to null. This placeholder indicates that the entry has not yet been associated with a visual node in the Mermaid diagram.

// MemoryCore/src/offload/types.ts
export interface OffloadEntry {
  timestamp: string;
  node_id: string | null;      // ← null until L2 runs
  tool_call: string;
  summary: string;
  result_ref: string;
  tool_call_id: string;
  // …
}

According to the source code at lines 16-18, this null state persists through the initial L1 processing stage, awaiting the L2 Mermaid generation pipeline to assign actual identifiers.

L2 Pipeline Assignment and Back-filling

The transition from null to a concrete value occurs in MemoryCore/src/offload/pipelines/l2-mermaid.ts during the L2 processing stage. The pipeline iterates through pending offload entries and generates unique node identifiers using a structured naming convention that combines the target Mermaid filename with a sequence number.

// src/offload/pipelines/l2-mermaid.ts
for (const entry of allEntries) {
  // Skip already‑backfilled entries
  if (entry.node_id !== null && entry.node_id !== "wait") continue;

  // Map a Mermaid node (e.g. "N12") to this entry
  const mapped = `${targetMmdFile!.replace(/\.mmd$/, "")}-${nodeSeq++}`;
  entry.node_id = mapped;
}

As implemented in lines 128-147, this back-filling mechanism ensures that every visual node in the generated diagram has a corresponding persistent record in the offload log, creating the foundation for the tracing mechanism.

Bridging Visual Nodes and Execution Logs

Regex Pattern Extraction

To enable the tracing functionality, the system must first identify which tokens in the Mermaid source represent traceable nodes. The injector located at MemoryCore/src/offload/mmd-injector.ts scans the generated diagram source using a specific regex pattern to extract node identifiers.

The pattern \b(\d+-N\d+|N\d+)\b matches tokens like N12 or 12-N12, collecting these IDs for subsequent injection into the LLM context. This extraction occurs at lines 42-47, where the system builds a comprehensive list of all traceable nodes present in the current diagram.

Lookup Hints for Interactive Tracing

Once the node IDs are extracted, the injector embeds a human-readable hint directly into the Mermaid diagram block. This instruction, visible to both the LLM and end users, explains exactly how to utilize the node_id for traceability.

// src/offload/mmd-injector.ts (excerpt)
if (nodeIds.length > 0) {
  lines.push(
    `**节点索引:** 可通过 node_id 在 offload.{sessionid}.jsonl 中查找对应的工具调用记录。` +
    `如需查看某个节点对应的原始工具调用与完整结果,请在 offload.{sessionid}.jsonl 中找到对应条目的 result_ref 并读取该文件。`
  );
}

As shown in lines 53-56, this message establishes the contract for the tracing mechanism: any component rendering the canvas can resolve a node's node_id to the original tool_call_id by querying the offload log file.

Frontend Canvas Interaction

The MemoryPanel frontend renders the processed Mermaid diagram on an HTML Canvas using Sigma or the native Mermaid renderer. When a user interacts with a specific node, the UI extracts the node label (containing the node_id) and performs a lookup against the offload log or an in-memory cache.

// MemoryPanel/web/src/components/KnowledgeGraph.tsx (conceptual)
canvas.on('node:click', ({ node }) => {
  const nodeId = node.id;                 // e.g. "12-N12"
  const entry = offloadLog.find(e => e.node_id === nodeId);
  showTooltip(entry.summary, entry.result_ref);
});

This interaction pattern provides complete traceability from the graphical representation back to the underlying execution history, including timestamps, raw result references, and tool call summaries.

Summary

  • The node_id field in MemoryCore/src/offload/types.ts starts as null and acts as a placeholder for future visual association.
  • The L2 pipeline in l2-mermaid.ts assigns structured identifiers (e.g., "12-N12") during diagram generation, back-filling the offload entries.
  • The mmd-injector.ts module extracts node patterns and embeds lookup instructions enabling traceability.
  • Frontend components use the node_id to query offload.{sessionid}.jsonl and retrieve detailed execution context for any clicked canvas node.
  • This mechanism creates a bidirectional link between the Mermaid Canvas visualization and the persistent offload log storage.

Frequently Asked Questions

What is the initial value of node_id before L2 processing?

The node_id field is initialized to null in every OffloadEntry when first written to offload.jsonl. According to MemoryCore/src/offload/types.ts, this state persists until the L2 Mermaid generation pipeline explicitly assigns a string identifier during the back-filling process.

How does the system match a clicked canvas node to its offload entry?

The frontend extracts the node_id string from the clicked node's label (e.g., "12-N12") and queries the offload log for an entry where e.node_id === nodeId. This exact string match resolves to the original OffloadEntry containing the tool_call_id, summary, and result_ref fields.

What naming convention does the L2 pipeline use for node_id values?

The L2 pipeline constructs node_id values using the pattern ${targetMmdFile}-${sequence}, resulting in strings like "12-N12". This convention is implemented in MemoryCore/src/offload/pipelines/l2-mermaid.ts to ensure uniqueness across different session files while maintaining human-readable traceability.

Why does the Mermaid diagram include a Chinese lookup hint?

The Chinese instruction embedded by MemoryCore/src/offload/mmd-injector.ts serves as documentation for downstream LLM agents and UI components, instructing them to search for the node_id in offload.{sessionid}.jsonl to locate the corresponding tool call record and its associated result files.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →