Without an i18n entry the timeline fell through to the raw tool id and showed
"logs" next to properly named steps like "Checking executions". Adds the tool
label plus one per action, following the executions tool's pattern, and a
terminal icon instead of the generic wrench fallback.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The semantic --text-color--* tokens are tuned for text on a tinted callout
background, so in dark theme --text-color--danger resolves to --color--red-50
at 97% lightness — correct on a red banner, invisible on a neutral log surface.
Switches to palette primitives at terminal strength and matches the dev console
throughout: error red, warn yellow, info green, debug blue. Shades are chosen
per theme so yellow stays legible on a light surface too.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Colours each message by its level the way winston's colorize({ all: true })
paints the dev-mode console, so a wall of debug reads as background noise and a
failure stands out without being hunted for. `info` keeps the default body
colour: it is the baseline level and the most read, and winston's green would
collide with the success meaning it carries elsewhere in the product.
Also left-aligns the page header with the log panel. The settings header caps
itself at the content max-width and is centred by the layout, which on a
full-width page leaves a narrow heading floating over a much wider panel.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Registration was presence-gated in two places with nothing asserting it, so
neither the module-off case nor the always-loaded classification was pinned.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Routes the tool's search through the distributed grep in queue mode. Reading
only the local composite meant the agent saw this main's stream window and its
own n8n.log — so an execution that failed on a worker was invisible, which is
the question the tool exists to answer. Non-responding hosts are passed through
to the model, since "nothing matched" and "nobody looked" are otherwise the
same empty result.
Addresses log context by timestamp instead of `seq`. `seq` counts lines within
one storage tier, so it could not address a record across the ring buffer, the
cross-host stream and the rotated files: context worked only for a live record
on a single main, and silently returned nothing elsewhere.
Promotes the tool to always-loaded. Registration is already gated on the module
supplying a port, so instances without it are unaffected.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Seeds the scope picker from GET /operator-console/meta, so it is useful before
any line arrives — LOG_SCOPES lives in @n8n/config, which the browser bundle
cannot import. Observed scopes are still merged in, so a scope newer than the
bundle stays selectable.
Derives the lease renewal interval from the TTL the server reports instead of
hardcoding it against a default the client cannot see, and tolerates a missing
response body rather than taking the tail down.
Adds a View logs action on execution detail that deep-links the console
filtered to that execution, gated on the module being enabled and the user
holding orchestration:read.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Wraps WorkflowRunner.run() and JobProcessor.processJob() in an execution
AsyncLocalStorage that Logger reads, so every line an execution emits carries
executionId and workflowId without each call site repeating them.
Explicit metadata still wins, so this only fills gaps — chiefly workflowId,
which many call sites omit even when they pass executionId, leaving the
console's deep link unbuildable. Stamped in Logger rather than in the capture
layer so the labels also reach n8n.log, which the history tier reads back.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The live path was never wired: the lease armed cross-host producers, but
nothing subscribed the log source and pushed batches to the browser, so a
console only ever showed history fetched on load.
Adds LogConsumerService, which holds one subscription for the union of every
open console's filter and re-filters per session. Capture is suppressed during
delivery — Push logs each send, and those lines would otherwise be captured,
batched and delivered forever. Sessions that stop renewing are expired, so a
hard tab close cannot leave a fan-out running.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Adds the module entrypoint, REST controller, composite log source and the
Instance AI port adapter, and teaches all three sources to read backwards so a
console opens on the newest lines rather than the oldest.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Capture layer (winston transport + stdout/stderr tee behind a reentrancy
guard), ring buffer, rotated n8n.log history reader, Redis Stream fan-out with
a demand-driven lease, and the Instance AI logs tool with attested redaction.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Shared types, config surface and the LogSource interface that the capture
layer, fan-out, console UI and AI tool all build against.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>