feat: render the status line as a themed widget in the TUI and document it
omp strips ANSI from extension status text, so setStatus drops the theme colors. String widgets keep them: in the TUI the line is a belowEditor widget and the plain footer entry is cleared; other modes keep setStatus.
This commit is contained in:
1 parent
ca05b58f38
commit
9435ff709b
4 files changed
+97
-7
No files matched your search
@@ -318,6 +318,63 @@ test("Status runtime updates the status bar and exposes bridge lines", () => {
|
||||
]);
|
||||
});
|
||||
|
||||
test("Status runtime keeps theme colors in the TUI through a widget and stays plain elsewhere", () => {
|
||||
const createContext = (mode: string | undefined) => {
|
||||
const events: string[] = [];
|
||||
return {
|
||||
events,
|
||||
ctx: {
|
||||
mode,
|
||||
ui: {
|
||||
theme: statusBarTheme,
|
||||
setStatus: (key: string, text: string | undefined) => {
|
||||
events.push(`status:${key}:${text}`);
|
||||
},
|
||||
setWidget: (
|
||||
key: string,
|
||||
content: string[] | undefined,
|
||||
options?: { placement?: string },
|
||||
) => {
|
||||
events.push(`widget:${key}:${options?.placement}:${content?.join("|")}`);
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
};
|
||||
const runtime = createTelegramStatusRuntime({
|
||||
getStatusBarState: () => ({
|
||||
hasBotToken: true,
|
||||
pollingActive: true,
|
||||
paired: true,
|
||||
compactionInProgress: false,
|
||||
processing: false,
|
||||
queuedStatus: "",
|
||||
}),
|
||||
getBridgeStatusLineState: () => {
|
||||
throw new Error("not used");
|
||||
},
|
||||
});
|
||||
|
||||
const tui = createContext("tui");
|
||||
runtime.updateStatus(tui.ctx);
|
||||
assert.equal(tui.events.length, 2);
|
||||
assert.match(tui.events[0], /^widget:telegram:belowEditor:<accent>telegram<\/accent> <success>\S+ connected<\/success>$/);
|
||||
assert.equal(tui.events[1], "status:telegram:undefined");
|
||||
|
||||
for (const mode of ["rpc", "json", "print", undefined]) {
|
||||
const other = createContext(mode);
|
||||
runtime.updateStatus(other.ctx);
|
||||
assert.equal(other.events.length, 1, String(mode));
|
||||
assert.match(other.events[0], /^status:telegram:<accent>telegram<\/accent> <success>\S+ connected<\/success>$/);
|
||||
}
|
||||
|
||||
const noWidgetApi = createContext("tui");
|
||||
delete (noWidgetApi.ctx.ui as { setWidget?: unknown }).setWidget;
|
||||
runtime.updateStatus(noWidgetApi.ctx);
|
||||
assert.equal(noWidgetApi.events.length, 1);
|
||||
assert.match(noWidgetApi.events[0], /^status:telegram:/);
|
||||
});
|
||||
|
||||
test("Status lines expose thread reconciliation state", () => {
|
||||
const lines = buildTelegramBridgeStatusLines({
|
||||
botUsername: "demo_bot",
|
||||
|
||||
Reference in new issue
Block a user