Stack Trace
Affichez un plantage comme un développeur le lit. Votre code d’abord, les frames du framework repliées, la ligne fautive en contexte et chaque cause dans l’ordre. Analyse les stacks de Node, Chrome, Firefox, Safari, Bun, Deno et Python, avec copie, ouverture dans l’éditeur et demande de correction.
Quand la commande, l’appel d’outil ou le test d’un agent échoue, la partie utile de l’erreur est enfouie sous cinquante lignes d’internes du framework. Stack Trace place le type d’erreur et le message en premier, affiche vos propres frames en plein contraste avec fichier, ligne et colonne, et replie chaque suite de frames du framework en une ligne discrète comme « 8 framework frames · next ».
parseStackTrace lit les stacks V8 de Node, Chrome, Bun et Deno, les stacks Firefox et Safari, les frames Vitest avec le code affiché dessous et les tracebacks Python, y compris les causes chaînées issues de [cause], Caused by: et des sections Python « direct cause » et « during handling ». Il classe node_modules, node:internal, les internes de Next.js, site-packages et la bibliothèque standard comme code hors de l’app, et transforme les chemins file:// et webpack-internal en chemins de projet lisibles. Les lignes qu’il ne reconnaît pas sont conservées, jamais supprimées.
La frame où votre code a échoué peut afficher sa source avec la ligne fautive mise en évidence, grâce à Code Block. Les longs messages sont tronqués avec Show more, Copy rend le texte d’origine, et les frames s’ouvrent dans votre éditeur via getFrameHref ou onFrameClick. La variante compacte est une seule ligne « Failed: TypeError: … » pour un appel d’outil en échec, qui s’ouvre sur les mêmes frames.
Procurez-vous HextaUI Pro
Un seul paiement débloque tous les blocs, y compris les prochains. Voir les tarifs.
Ajouter le registre Pro à components.json
components.json Ajouter votre token
Créez un token sur votre page de compte et placez-le dans
.env.localsous le nomHEXTAUI_PRO_TOKEN.Ajouter le block
pnpm dlx shadcn@latest add @hextaui-pro/stack-trace
Depuis un log
Passez le texte brut d’un terminal, d’un log ou d’un résultat d’outil. getEditorHref transforme les frames en liens vscode:// ou cursor://, et Ask to fix vous donne l’erreur analysée à renvoyer à l’agent.
Avec AI SDK
Un outil qui lève une erreur se termine dans l’état output-error avec errorText. Affichez-le comme un StackTrace compact dans le ToolCall en échec, pour que l’étape tienne sur une ligne jusqu’à ce que quelqu’un l’ouvre.
Dans une error boundary Next.js
parseError lit un objet Error, avec son nom, son message et sa chaîne de causes. Affichez la trace en développement et un message simple en production.
Juste les frames
parseStackTrace et StackFrames fonctionnent seuls, par exemple pour afficher une courte stack sous chaque test en échec.
Anatomie
Les parties à composer, de l’extérieur vers l’intérieur.
| Partie | Description |
|---|---|
StackTrace | L’erreur : type, message, actions, frames et causes. Par défaut, c’est une card ; compact est une ligne qui se déplie. |
StackFrames | La liste de frames seule, avec les frames du framework repliées et l’extrait de source. |
parseStackTrace, parseError | Parseurs purs qui transforment du texte ou un objet Error en ParsedStackTrace. |
getEditorHref | Crée un lien vscode://, cursor://, windsurf:// ou zed:// pour une frame. |
StackTrace
Accepte aussi toutes les props de div sauf children.
| Prop | Type | Par défaut |
|---|---|---|
traceLe texte brut de la stack, ou une trace que vous avez analysée et enrichie vous-même. | string | ParsedStackTrace | – |
variantcompact affiche une ligne « Failed: … » qui s’ouvre sur les frames, à utiliser dans un ToolCall. | "default" | "compact" | "default" |
labelLe mot d’état avant le type d’erreur, comme « Crashed » ou « Test failed ». | string | "Failed" |
rootRacine du projet, retirée des chemins absolus. Déduite de node_modules ou .venv si elle est omise. | string | – |
getFrameHrefTransforme une frame en lien, par exemple avec getEditorHref. | (frame: StackFrame) => string | undefined | – |
onFrameClickAppelé quand on clique sur une frame. Appelez event.preventDefault() pour gérer les liens vous-même. | (frame: StackFrame, event: MouseEvent) => void | – |
onAskToFixAffiche Ask to fix et reçoit l’erreur analysée. | (trace: ParsedStackTrace) => void | – |
askLabelLibellé du bouton Ask to fix. | string | "Ask to fix" |
showSourceAffiche les lignes de source sous les frames, et l’extrait de votre frame du haut. | boolean | true |
foldReplie les suites de deux frames ou plus du framework ou internes. | boolean | true |
messageLinesLignes du message affichées avant Show more. | number | 3 |
openÉtat d’ouverture contrôlé de la variante compacte. | boolean | – |
defaultOpenIndique si la variante compacte démarre ouverte. | boolean | false |
onOpenChangeAppelé quand la variante compacte s’ouvre ou se ferme. | (open: boolean) => void | – |
StackFrames
Accepte aussi toutes les props de ol sauf children.
| Prop | Type | Par défaut |
|---|---|---|
framesFrames issues de parseStackTrace, la plus interne en premier. | StackFrame[] | – |
foldReplie les suites de frames qui ne viennent pas de l’app. | boolean | true |
showSourceAffiche les lignes de source et l’extrait de la frame du haut. | boolean | true |
getFrameHrefTransforme une frame en lien. | (frame: StackFrame) => string | undefined | – |
onFrameClickAppelé quand on clique sur une frame. | (frame: StackFrame, event: MouseEvent) => void | – |
parseStackTrace(text, options)
Renvoie un ParsedStackTrace. parseError(error, options) fait de même pour un objet Error et sa cause.
| Prop | Type | Par défaut |
|---|---|---|
textUne stack, un traceback ou la sortie de log brute qui l’entoure. | string | – |
options.rootRacine du projet à retirer des chemins absolus. | string | – |
options.classifyRemplace le type d’une frame, par exemple pour traiter un dossier vendored comme du code de framework. | (frame: StackFrame) => StackFrameKind | undefined | – |
| Prop | Type | Par défaut |
|---|---|---|
typeType d’erreur, comme TypeError ou billing.plans.PlanNotFound. | string | – |
messageLe message, qui peut tenir sur plusieurs lignes. | string | – |
framesLa plus interne en premier dans tous les langages, donc frames[0] est l’endroit où l’erreur a été levée. | StackFrame[] | – |
rawLe texte d’origine, utilisé par Copy. | string | – |
languageLe format qui a été analysé. | "javascript" | "python" | – |
codeCode d’erreur, comme ERR_MODULE_NOT_FOUND ou ECONNREFUSED. | string | – |
detailsPropriétés supplémentaires que Node affiche après les frames, comme errno et syscall. | string | – |
preambleLignes de log apparues avant l’erreur. | string | – |
causeL’erreur suivante de la chaîne, avec relation à cause ou context. | ParsedStackTrace | – |
| Prop | Type | Par défaut |
|---|---|---|
kindVotre code, une dépendance ou le runtime lui-même. | "app" | "framework" | "internal" | – |
fnNom de la fonction. Undefined pour les fonctions anonymes, qui n’affichent que leur emplacement. | string | – |
fileChemin lisible relatif au projet, comme app/api/users/route.ts. | string | – |
pathL’emplacement tel que rapporté, sans les préfixes file:// et webpack. Absolu quand la stack en avait un. | string | – |
line, columnPosition dans le fichier. | number | – |
packagePaquet auquel appartient une frame hors de l’app, comme next ou fastapi. | string | – |
source, sourceStartLignes de source et numéro de la première. Plusieurs lignes s’affichent comme extrait. | string, number | – |
rawLa ligne d’origine. Les lignes que le parseur ne reconnaît pas n’ont que raw. | string | – |
getEditorHref(frame, options)
Renvoie undefined pour les frames sans fichier sur le disque.
| Prop | Type | Par défaut |
|---|---|---|
options.editorLe schéma d’URL à utiliser. | "vscode" | "cursor" | "windsurf" | "zed" | "vscode" |
options.rootJoint aux chemins relatifs, comme ceux des frames webpack-internal. | string | – |
| Touche | Action |
|---|---|
| Tab | Parcourt les actions, Show more, les liens de frames et les lignes de frames repliées. |
| EnterSpace | Ouvre ou ferme les frames repliées, ou la ligne compacte. |
| Enter | Ouvre le lien d’une frame dans votre éditeur. |
- Les frames forment une liste ordonnée : les lecteurs d’écran annoncent leur nombre et la position de chacune.
- Les lignes repliées sont des boutons avec aria-expanded, et les frames repliées restent trouvables avec la recherche dans la page du navigateur, qui ouvre le pli.
- La vue par défaut est un groupe nommé d’après son état et son type d’erreur, et chaque cause est une section nommée « Caused by … ».
- L’état ne repose jamais sur la couleur seule : l’échec est écrit en texte à côté de son icône, et Copy annonce « Copied ».
Construit avec
Les composants HextaUI gratuits dont Stack Trace est constitué. Chacun s’installe séparément.
Code
4 fichiers, ajoutés à components/blocks/stack-trace.