{% extends "base.html" %} {% block title %}Log Explorer — {{ app_id }}{% endblock %} {% block extra_css %} {% endblock %} {% block content %}

manage_search Log Explorer

{# ── Paste form ─────────────────────────────────────────────────── #}
content_paste Log Explorer — Analyse Rustvello Log Lines
Paste any rustvello log block. Supports both tracing span format (runner{...}:invocation{...}:) and compact bracket format ([R(id)UUID:task]). Entity references like invocation:UUID, task:key, runner:ID become clickable links.
{% if has_input %} Clear {% endif %}
{# ── Analysis results ──────────────────────────────────────────── #} {% if let Some(analysis) = analysis.as_ref() %} {% if !analysis.has_valid %}
Could not extract context from the pasted text. Make sure each line starts with a timestamp and log level, and contains tracing span context (runner{runner_id=...}:invocation{...}:) or structured entity references like invocation:UUID.
{% else %} {# ── Per-line log display ──────────────────────────────────────── #}
Parsed Log Lines {{ analysis.lines.len() }}
{% for la in &analysis.lines %} {# ── Line card ─────────────────────────────────────────── #}
{# ── Left column: metadata & bracket refs ── #}
{% if let Some(ts) = la.parsed.timestamp.as_ref() %} {{ ts }} {% endif %} {% if let Some(level) = la.parsed.level.as_ref() %} {{ level }} {% endif %} {% if let Some(module) = la.parsed.module.as_ref() %} {{ module }} {% endif %} {% if la.parsed.is_valid %} {# Bracket runners #} {% for runner in &la.parsed.runners %} memory {{ runner.cls_abbr }}({{ runner.partial_id }}) {% endfor %} {# Worker from span context #} {% if let Some(wid) = la.parsed.worker_id.as_ref() %} engineering {% if let Some(short) = la.parsed.short_worker_id() %} W({{ short }}) {% endif %} {% endif %} {# Bracket invocation #} {% if let Some(inv_id) = la.parsed.invocation_id.as_ref() %} info {{ inv_id }} timeline {% endif %} {# Bracket task #} {% if let Some(task) = la.parsed.task_key.as_ref() %} task {{ task }} {% endif %} {% endif %}
{# ── Right column: message + entity badges ── #}
{% if !la.message_html.is_empty() %}
{{ la.message_html|safe }}
{% endif %} {% if !la.extra_entity_refs.is_empty() %}
{% for eref in &la.extra_entity_refs %} {% if eref.kind == "invocation" || eref.kind == "parent-invocation" || eref.kind == "child-invocation" || eref.kind == "new-invocation" %} info {{ eref.value }} {% if let Some(timeline_url) = eref.timeline_url %} timeline {% endif %} {% else if eref.kind == "runner" || eref.kind == "worker" %} memory {{ eref.value }} {% else if eref.kind == "task" %} task {{ eref.value }} {% else if eref.kind == "workflow" || eref.kind == "sub-workflow" || eref.kind == "parent-workflow" %} account_tree {{ eref.kind }}: {{ eref.value }} {% else %} {{ eref.kind }}: {{ eref.value }} {% endif %} {% endfor %}
{% endif %}
{% endfor %}
{# ── SVG mini-timeline ──────────────────────────────────────────── #} {% if !analysis.svg_content.is_empty() %}
Invocation Timeline open full →
{{ analysis.svg_content|safe }}
{% let histogram = analysis.histogram %} {% include "partials/histogram.html" %} {# ── Invocation detail panel (click on SVG element) ── #}
Invocation Detail
ID:
Status:
Task:
{% endif %} {# ── References panel ──────────────────────────────────────────── #} {% if !analysis.all_entity_refs.is_empty() %}
References {{ analysis.all_entity_refs.len() }}
{# Invocations #} {% if analysis.inv_ref_count > 0 %}
info Invocations ({{ analysis.inv_ref_count }})
{% for eref in &analysis.all_entity_refs %} {% if eref.kind == "invocation" || eref.kind == "parent-invocation" || eref.kind == "child-invocation" || eref.kind == "new-invocation" %} {% endif %} {% endfor %}
{% endif %} {# Runners #} {% if analysis.runner_ref_count > 0 %}
memory Runners ({{ analysis.runner_ref_count }})
{% for eref in &analysis.all_entity_refs %} {% if eref.kind == "runner" || eref.kind == "worker" %} {% endif %} {% endfor %}
{% endif %} {# Tasks #} {% if analysis.task_ref_count > 0 %}
task Tasks ({{ analysis.task_ref_count }})
{% for eref in &analysis.all_entity_refs %} {% if eref.kind == "task" %} {% endif %} {% endfor %}
{% endif %}
{% endif %} {% endif %}{# has_valid #} {% endif %}{# analysis #}
{# ── Session persistence ─────────────────────────────────────────── #} {# ── Cross-highlighting scripts ──────────────────────────────────── #} {% if let Some(analysis) = analysis.as_ref() %} {% if analysis.has_valid %} {% endif %} {% endif %} {% endblock %}