Skip to content

Open files, context, transcript & invocations

threadle can show local text files, interactive transcripts, reconstructed session context, tool / skill / reasoning invocation dumps, and library context payloads in floating windows without leaving the UI. Use open / view for a quick read. Use open in ⟨editor⟩ (⟨/⟩) when you want to edit. Use ⇓ for the full file.


PlaceHow
Sessions detail≡ transcript → ⌗ blueprint → → workflow (transcript when the session has messages / a known path)
Files / Activityopen next to open in editor on text paths
Session blueprintDetail panel or right-click. See Blueprint actions. Topbar: ≡ transcript → ↗ urls → → workflow / ⇓ bundle
Canvas (skill, rules, agent with a source path)Right-click → open / open in … / copy path / copy content
Inspector / artifact panelSame open / open in editor pair

open only shows for paths that look like text (.md, .ts, .json, .yaml, Makefiles, .env*, and similar). Binaries stay editor-only.


NodeFloating viewers / downloads
Session rootview transcript, open context (+ materialize / download / reference)
Subagent (⎇)Same for the child session: view transcript, open context, view reasoning / download, plus ⌗ open blueprint
Reasoning (∴)view reasoning / ⇓ download reasoning
Tool / skillview invocations / ⇓ download invocations
Context payload (❝)view context (payload body) / ⇓ download payload (raw JSON)
File / rules / skillsetopen / open in … / copy path / copy content

Detail-panel buttons sit under the side list (invocations, transcript preview, edited lines). Same place as rule-file open / open in ….


  • Drag the title bar. resize from any edge or corner (min ≈ 320×200).
  • Several windows can be open. Click one to bring it forward.
  • Esc closes the frontmost window (again for the next).
  • Title-bar ⇓ downloads when possible:
  • disk files → loaded text
  • context / transcript → full context via API
  • invocations / reasoning → full dump via API (every call, not the 60-row side list)
  • Title-bar ⟨/⟩ opens in your editor (disk files directly. Context is written to ~/.config/threadle/tmp first). Invocations / reasoning are download-only (no materialize path yet).
  • Title-bar → (context windows) saves as a library reference and seeds a new workflow.
  • ✕ closes.

The title-bar dropdown picks how the body is rendered:

ModeBehavior
autoFrom the file extension, then a light content sniff for .txt / unknown
markdownRendered markdown (fenced code highlighted)
jsonPretty-printed when valid, then syntax-highlighted
txtPlain text
language modestypescript, python, shell, yaml, …

When the dropdown is auto, a small chip shows the resolved format (e.g. typescript).


Reads are capped at 1.5 MB. Larger files, session contexts, and invocation dumps still open, but only the first 1.5 MB is shown, with a banner:

preview. Showing first 1.5 MB of … · open in editor / download for the full …

SourceEndpoint
FilesGET /api/files/read?path=… → { content, size, truncated, previewMaxBytes }
ContextGET /api/sessions/:provider/context/:id?preview=1 → same shape
InvocationsGET /api/sessions/:provider/invocations/:id?kind=tool|skill|reasoning&name=…&preview=1 → same shape
PayloadGET /api/payloads/:hash → full ContextPayload JSON (viewer shows content)

Without ?preview=1, the context and invocations routes return a full .md download. Context also supports ?materialize=1 (writes under ~/.config/threadle/tmp/ and returns { path } for the editor). For invocations, name is required for tool / skill. Omit it for reasoning.


view transcript / ≡ transcript opens the interactive message list (roles, tools, thinking) in a floating window. The same viewer used in Search and the canvas inspector. Works for every provider that can return a transcript, including Codex rollouts under ~/.codex/sessions.

On Sessions detail and the blueprint topbar, ≡ transcript leads the action row when available (transcript → urls → workflow …). On the blueprint topbar, ↗ urls opens the outbound-URL modal (see Session blueprint → Outbound URLs). transcript file in session info still opens the raw on-disk JSONL when the provider exposes a path.

The transcript opens pinned to the latest page. While you stay near the bottom, new messages merge into the tail from sessions.changed / live.status events (and a ~1 s poll while the session is running or waiting). Scroll up to unpin. Use ↓ latest to jump back, or ↓ N new when unread messages accumulated off-screen. Load previous / Load more do not cancel follow. While the session is busy, the footer shows thinking (running) or waiting.


open context shows the session’s reconstructed model context. The same markdown as download context. In a floating window. Large threads are almost always preview-capped.

On a session or subagent blueprint node (detail panel or right-click):

ActionWhat it does
view transcriptFloating interactive transcript for that session (or child)
open contextFloating viewer (preview-capped when large)
open context in …Materialize full context to tmp and open in your editor
copy pathAbsolute project path to the clipboard
⇓ download contextFull context markdown download
→ workflow · referenceStore + tag reference, seed a new workflow with that context node
library · referenceStore + tag only. Drag later from Library / palette › library
view reasoningEvery thinking block for that session (subagent detail)
⌗ open blueprintChild blueprint (subagent only)

view invocations opens every call for a selected tool or skill as markdown. Reasoning nodes (and subagent detail) use the same dump labeled view reasoning.

The blueprint side list is capped at 60 rows (+N more not shown · download for full). The viewer loads the full dump from the transcript and applies the same 1.5 MB preview cap as context. When capped, the banner points you to download for the rest.

ActionWhat it does
view invocations / view reasoningFloating viewer for the full dump (preview-capped at 1.5 MB when large)
⇓ download invocations / ⇓ download reasoningUncapped markdown of every call (same as title-bar ⇓)

Each entry is pretty-printed tool input (or full thinking text for reasoning). Per-call bodies are capped around 8 KB so a single giant Write/Edit payload cannot blow the dump unboundedly.


Selecting an extracted or injected context node on the blueprint opens:

ActionWhat it does
view contextFloating viewer for the payload body
⇓ download payloadRaw payload JSON from /api/payloads/:hash

  1. On a session (or subagent) blueprint: → workflow · reference (or → in the context viewer).
  2. threadle snapshots the same markdown as open context, stores it as a transcript-excerpt payload, and tags it reference.
  3. A new graph opens with one pre-materialized context node. Wire it into agents / converters as usual.
  4. To reuse in another graph: Library or palette › library, filter reference, drag onto the canvas.

API: POST /api/context/reference with { "source": { "provider", "sessionId" } } → { hash, kind, preview, tags }.

This is the zero-friction path when you want the full reconstructed thread (thinking + full tool I/O), not a distilled brief or a default extract. Distill / extract from a context node remain available when you want a shorter or filtered capture.


  • Paths must be absolute local files. The server never writes them for the viewer. It only reads (or writes tmp materializations / payload library entries you request).
  • Content that fails the text heuristic (NUL bytes, non-text extensions) is rejected. Open in your editor instead.
  • Highlighting / markdown render skips very large bodies (~200 k chars) and falls back to plain text so the UI stays responsive.
  • Invocation / reasoning dumps are rebuilt from the session transcript on each request (read-only).