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 {