From af4c66117b53c5d0137746b8b5ee400ea6f6bd2f Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Fri, 2 Jan 2026 01:21:07 +0100 Subject: [PATCH] Fix BorderedLoader to pass theme to DynamicBorder BorderedLoader receives theme as a parameter but was creating DynamicBorder() without passing it, causing DynamicBorder to fall back to the global theme variable which is undefined when loaded via jiti (separate module cache). Added doc comment to DynamicBorder explaining the jiti issue. --- .../modes/interactive/components/bordered-loader.ts | 5 +++-- .../modes/interactive/components/dynamic-border.ts | 12 +++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/packages/coding-agent/src/modes/interactive/components/bordered-loader.ts b/packages/coding-agent/src/modes/interactive/components/bordered-loader.ts index 67126703..e83f32a4 100644 --- a/packages/coding-agent/src/modes/interactive/components/bordered-loader.ts +++ b/packages/coding-agent/src/modes/interactive/components/bordered-loader.ts @@ -8,7 +8,8 @@ export class BorderedLoader extends Container { constructor(tui: TUI, theme: Theme, message: string) { super(); - this.addChild(new DynamicBorder()); + const borderColor = (s: string) => theme.fg("border", s); + this.addChild(new DynamicBorder(borderColor)); this.loader = new CancellableLoader( tui, (s) => theme.fg("accent", s), @@ -19,7 +20,7 @@ export class BorderedLoader extends Container { this.addChild(new Spacer(1)); this.addChild(new Text(theme.fg("muted", "esc cancel"), 1, 0)); this.addChild(new Spacer(1)); - this.addChild(new DynamicBorder()); + this.addChild(new DynamicBorder(borderColor)); } get signal(): AbortSignal { diff --git a/packages/coding-agent/src/modes/interactive/components/dynamic-border.ts b/packages/coding-agent/src/modes/interactive/components/dynamic-border.ts index 76e5c7b7..2ee05ccb 100644 --- a/packages/coding-agent/src/modes/interactive/components/dynamic-border.ts +++ b/packages/coding-agent/src/modes/interactive/components/dynamic-border.ts @@ -2,15 +2,17 @@ import type { Component } from "@mariozechner/pi-tui"; import { theme } from "../theme/theme.js"; /** - * Dynamic border component that adjusts to viewport width + * Dynamic border component that adjusts to viewport width. + * + * Note: When used from hooks loaded via jiti, the global `theme` may be undefined + * because jiti creates a separate module cache. Always pass an explicit color + * function when using DynamicBorder in components exported for hook use. */ export class DynamicBorder implements Component { private color: (str: string) => string; - constructor(color?: (str: string) => string) { - // Use provided color function, or default to theme border color - // Theme may not be initialized at construction time, so we check at render time - this.color = color ?? ((str) => (theme ? theme.fg("border", str) : str)); + constructor(color: (str: string) => string = (str) => theme.fg("border", str)) { + this.color = color; } invalidate(): void {