@botpress/adk-cli
Version:
Command-line interface for the Botpress Agent Development Kit (ADK)
212 lines (202 loc) • 5.04 kB
JavaScript
// @bun
import {
getSavedCliTheme,
resolveColorScheme,
terminalThemePalette
} from "./chunk-8gqzjqmb.js";
import {
__require
} from "./chunk-dhs2bg35.js";
// src/tui/elements.ts
import {
BoxRenderable,
TextRenderable,
ScrollBoxRenderable
} from "@opentui/core";
function box(ctx, options = {}, children = []) {
const node = new BoxRenderable(ctx, options);
for (const child of children)
node.add(child);
return node;
}
function text(ctx, content, options = {}) {
return new TextRenderable(ctx, { content, ...options });
}
function scrollBox(ctx, options = {}, children = []) {
const node = new ScrollBoxRenderable(ctx, options);
for (const child of children)
node.add(child);
return node;
}
// src/tui/style.ts
import {
t,
fg,
bg,
bold,
italic,
underline,
dim,
link,
StyledText,
RGBA,
parseColor,
stringToStyledText
} from "@opentui/core";
// src/tui/keyboard.ts
function onKey(renderer, handler) {
renderer.keyInput.on("keypress", handler);
return () => renderer.keyInput.off("keypress", handler);
}
// src/tui/reactive.ts
function signal(initial) {
let value = initial;
const listeners = new Set;
const read = () => value;
read.set = (next) => {
if (Object.is(next, value))
return;
value = next;
for (const listener of listeners)
listener(value);
};
read.subscribe = (listener) => {
listeners.add(listener);
return () => {
listeners.delete(listener);
};
};
return read;
}
function bind(apply, deps) {
apply();
const disposers = deps.map((dep) => dep.subscribe(apply));
return () => {
for (const dispose of disposers)
dispose();
};
}
// src/tui/lifecycle.ts
function createScope() {
const disposers = [];
let disposed = false;
const scope = {
add(dispose) {
if (disposed) {
dispose();
return dispose;
}
disposers.push(dispose);
return dispose;
},
child() {
const c = createScope();
scope.add(() => c.dispose());
return c;
},
dispose() {
if (disposed)
return;
disposed = true;
for (let i = disposers.length - 1;i >= 0; i--) {
try {
disposers[i]();
} catch {}
}
disposers.length = 0;
},
get disposed() {
return disposed;
}
};
return scope;
}
function interval(scope, ms, fn) {
const id = setInterval(fn, ms);
id.unref?.();
return scope.add(() => clearInterval(id));
}
function timeout(scope, ms, fn) {
const id = setTimeout(fn, ms);
id.unref?.();
return scope.add(() => clearTimeout(id));
}
// src/tui/router.ts
function router(ctx, parentScope, source, build) {
const container = box(ctx, { flexDirection: "column" });
let viewScope = null;
const swap = () => {
viewScope?.dispose();
for (const child of [...container.getChildren()]) {
container.remove(child.id);
child.destroyRecursively();
}
viewScope = createScope();
container.add(build(source(), viewScope));
};
parentScope.add(() => viewScope?.dispose());
parentScope.add(bind(swap, [source]));
return container;
}
// src/tui/mount.ts
async function mount(build, config = {}) {
const { createCliRenderer } = await import("@opentui/core");
const renderer = await createCliRenderer({
screenMode: "main-screen",
exitOnCtrlC: false,
...config
});
const scope = createScope();
renderer.root.add(build(renderer, scope));
renderer.start();
let resolveExit;
const exited = new Promise((resolve) => {
resolveExit = resolve;
});
let unmounted = false;
return {
renderer,
scope,
unmount() {
if (unmounted)
return;
unmounted = true;
scope.dispose();
try {
renderer.destroy();
} catch {}
resolveExit();
},
waitUntilExit: () => exited
};
}
// src/tui/render-to-string.ts
import { createTestRenderer } from "@opentui/core/testing";
async function renderToString(build, options = {}) {
const width = options.width ?? (process.stdout.columns || 80);
const height = options.maxHeight ?? 24;
const setup = await createTestRenderer({ width, height });
try {
setup.renderer.root.alignItems = "flex-start";
setup.renderer.root.add(build(setup.renderer));
await setup.renderOnce();
return trimFrame(setup.captureCharFrame());
} finally {
setup.renderer.destroy();
}
}
function trimFrame(frame) {
const lines = frame.split(`
`).map((line) => line.replace(/\s+$/, ""));
while (lines.length > 0 && lines[lines.length - 1] === "")
lines.pop();
return lines.join(`
`);
}
// src/theme/index.ts
var darkTheme = terminalThemePalette.dark.cli;
var lightTheme = terminalThemePalette.light.cli;
var getActiveTheme = (preference = getSavedCliTheme()) => {
return resolveColorScheme(preference) === "light" ? lightTheme : darkTheme;
};
export { box, text, scrollBox, t, fg, bold, link, onKey, signal, bind, createScope, interval, timeout, router, mount, renderToString, getActiveTheme };