Gramforge

Images (WASM) API reference

Exports of @gramforge/images-wasm. Back to the module

Functions

buildChartTree

function
buildChartTree(input: ChartCardInput): Promise<CardNode>

buildCompletionTree

function
buildCompletionTree(input: CompletionCardInput): CardNode

buildFailureTree

function
buildFailureTree(input: FailureCardInput): CardNode

buildFleetOverviewTree

function
buildFleetOverviewTree(input: FleetOverviewCardInput): Promise<CardNode>

buildNeedsInputTree

function
buildNeedsInputTree(input: Omit<NeedsInputCardInput, "options"> & { readonly options: readonly NeedsInputOption[]; }): CardNode

buildStatusTree

function
buildStatusTree(input: StatusCardInput): CardNode

chartToSvg

function

Render a validated `ChartSpec` to an SVG string (pure, no rasterization).

chartToSvg(spec: ChartSpec, dimensions: ChartDimensions): string

col

function

A vertical flex container (`flexDirection: column`).

col(style: CardStyle, children: readonly CardNode[]): BoxNode

computeContentHash

function

SHA-256 of `bytes`, returned as a branded lowercase-hex `ContentHash`.

computeContentHash(bytes: Uint8Array): Promise<ContentHash>

containsColorEmoji

function

True when `input` contains at least one codepoint in a color-emoji presentation range (emoticons, symbols/pictographs, transport, supplemental, regional indicators, and the common Misc-Symbols/Dingbats emoji subset).

containsColorEmoji(input: string): boolean

createInMemoryFileIdCacheStore

function

A process-lifetime `Map`-backed store for development/testing.

createInMemoryFileIdCacheStore(): FileIdCacheStore

createTakumiWasmBackend

function

Create the wasm backend. Instantiation of the wasm module and font registration happen lazily on the first `renderPng` call so this factory is synchronous and side-effect-free until a render is actually requested.

createTakumiWasmBackend(inputs: TakumiWasmInputs): ImageBackend

div

function

A generic flex container.

div(style: CardStyle, children: readonly CardNode[]): BoxNode

emojiCodepoints

function

Collect the distinct emoji codepoints (as `U+XXXX` strings) in `input`.

emojiCodepoints(input: string): string[]

img

function

An image leaf carrying raw bytes (e.g. a rendered chart PNG).

img(input: { readonly src: Uint8Array; readonly width: number; readonly height: number; readonly style?: CardStyle; }): ImageNode

rasterizeSvgResvgWasm

function

Rasterize an SVG string to PNG via `@resvg/resvg-wasm` (portable). The resvg wasm binary is injected and initialized once per process.

rasterizeSvgResvgWasm(svg: string, wasm: InitInput): Promise<RasterizeResult>

recordUpload

function

Record a newly-uploaded `file_id` into the store. The single place a caller writes a `file_id` back — this package itself never performs the upload.

recordUpload(store: FileIdCacheStore, hash: ContentHash, botId: BotId, fileId: TelegramFileId): Promise<void>

renderCardWasm

function

Render a card node tree to PNG bytes via the Takumi WASM backend — a single node-free call for the common case. Reuse a backend across renders by calling {@link createTakumiWasmBackend} directly if you render many cards.

renderCardWasm(node: CardNode, options: RenderPngOptions, inputs: TakumiWasmInputs): Promise<Uint8Array>

resetDiagnostics

function

Test-only: clear the dedup set between tests.

resetDiagnostics(): void

row

function

A horizontal flex container (`flexDirection: row`).

row(style: CardStyle, children: readonly CardNode[]): BoxNode

setDiagnosticHook

function
setDiagnosticHook(fn: ((e: DiagnosticEvent) => void) | null): void

text

function

A text leaf.

text(value: string, style?: CardStyle): TextNode

toTakumiNode

function
toTakumiNode(node: CardNode): Node

warnDegraded

function
warnDegraded(context: string, detail: string): void

warnNotImplemented

function
warnNotImplemented(category: string, detail: string): void

warnUnexpected

function
warnUnexpected(context: string, detail: string, data?: Record<string, unknown>): void

Types

BackendKind

type
type BackendKind = "takumi-native" | "takumi-wasm"

BotId

type
type BotId = string & z.BRAND<"BotId">

BoxNode

type
type BoxNode = {
  readonly kind: "box";
  readonly style: CardStyle;
  readonly children: readonly CardNode[];
}

CachedFileHit

type
type CachedFileHit = { contentHash: string & z.BRAND<"ContentHash">; hit: true; fileId: string & z.BRAND<"TelegramFileId">; }

CardInput

type
type CardInput = { template: "status"; agentName: string; level: "ok" | "warn" | "error"; headline: string; detail: { kind: "none"; } | { kind: "text"; value: string; }; timestampIso: string; } | { title: string; template: "fleet-overview"; timestampIso: string; agents: { name: string; level: "ok" | "warn" | "error"; note: { kind: "none"; } | { kind: "text"; value: string; }; }[]; chart: { kind: "none"; } | { kind: "spec"; spec: { kind: "bar" | "line"; title: string; categories: string[]; series: { values: number[]; name: string; }[]; }; }; } | { options: { label: string; hint: { kind: "none"; } | { kind: "text"; value: string; }; }[]; template: "needs-input"; agentName: string; timestampIso: string; question: string; } | { template: "completion"; agentName: string; headline: string; timestampIso: string; summary: { kind: "none"; } | { kind: "text"; value: string; }; durationMs: number; } | { template: "failure"; agentName: string; headline: string; detail: { kind: "none"; } | { kind: "text"; value: string; }; timestampIso: string; } | { template: "chart"; spec: { kind: "bar" | "line"; title: string; categories: string[]; series: { values: number[]; name: string; }[]; }; caption: { kind: "none"; } | { kind: "text"; value: string; }; }

CardNode

type
type CardNode = BoxNode | TextNode | ImageNode

ChartCardInput

type
type ChartCardInput = { template: "chart"; spec: { kind: "bar" | "line"; title: string; categories: string[]; series: { values: number[]; name: string; }[]; }; caption: { kind: "none"; } | { kind: "text"; value: string; }; }

ChartKind

type
type ChartKind = "bar" | "line"

ChartSeries

type
type ChartSeries = { values: number[]; name: string; }

ChartSpec

type
type ChartSpec = { kind: "bar" | "line"; title: string; categories: string[]; series: { values: number[]; name: string; }[]; }

CompletionCardInput

type
type CompletionCardInput = { template: "completion"; agentName: string; headline: string; timestampIso: string; summary: { kind: "none"; } | { kind: "text"; value: string; }; durationMs: number; }

ContentHash

type
type ContentHash = string & z.BRAND<"ContentHash">

DiagnosticKind

type

Runtime diagnostics — the house alternative to deferred-work comments. Three functions: `warnNotImplemented`, `warnDegraded`, `warnUnexpected`. Each fires once per stable key (except `warnUnexpected`, which always fires), is greppable, and can be piped into a UI panel via {@link setDiagnosticHook}. Usage: warnDegraded("MyModule.fallback", "linear interp — cubic deferred, spec:120-140"); warnNotImplemented("MyModule.featureX", "spec §4 not yet lowered"); warnUnexpected("MyModule.parse", "expected number, got string", { value });

type DiagnosticKind = "not-implemented" | "degraded" | "unexpected"

FailureCardInput

type
type FailureCardInput = { template: "failure"; agentName: string; headline: string; detail: { kind: "none"; } | { kind: "text"; value: string; }; timestampIso: string; }

FleetAgent

type
type FleetAgent = { name: string; level: "ok" | "warn" | "error"; note: { kind: "none"; } | { kind: "text"; value: string; }; }

FleetOverviewCardInput

type
type FleetOverviewCardInput = { title: string; template: "fleet-overview"; timestampIso: string; agents: { name: string; level: "ok" | "warn" | "error"; note: { kind: "none"; } | { kind: "text"; value: string; }; }[]; chart: { kind: "none"; } | { kind: "spec"; spec: { kind: "bar" | "line"; title: string; categories: string[]; series: { values: number[]; name: string; }[]; }; }; }

FlexAlign

type
type FlexAlign = "flex-start" | "center" | "flex-end" | "stretch" | "baseline"

FlexDirection

type

The single flexbox-safe authoring format for both backends. Card templates build a neutral `CardNode` tree via `div`/`row`/`col`/`text`/ `img`. The backends convert it to their native shape (Takumi's `{ type: "container" | "text" | "image" }` nodes, or a satori element tree). `CardStyle` deliberately exposes only flexbox-compatible props — there is no CSS Grid and no free-form `style: string` escape hatch, so a template that type-checks renders consistently on Takumi and satori alike.

type FlexDirection = "row" | "column"

FlexJustify

type
type FlexJustify = "flex-start" | "center" | "flex-end" | "space-between" | "space-around" | "space-evenly"

FlexWrap

type
type FlexWrap = "nowrap" | "wrap"

ImageNode

type
type ImageNode = {
  readonly kind: "image";
  readonly style: CardStyle;
  readonly src: Uint8Array;
  readonly width: number;
  readonly height: number;
}

NeedsInputCardInput

type
type NeedsInputCardInput = { options: { label: string; hint: { kind: "none"; } | { kind: "text"; value: string; }; }[]; template: "needs-input"; agentName: string; timestampIso: string; question: string; }

NeedsInputOption

type
type NeedsInputOption = { label: string; hint: { kind: "none"; } | { kind: "text"; value: string; }; }

NetworkUsage

type
type NetworkUsage = { kind: "offline"; } | { kind: "emoji-font-fetch"; codepoints: string[]; }

ObjectFit

type
type ObjectFit = "fill" | "contain" | "cover"

RasterizeResult

type
type RasterizeResult = {
  readonly ok: true;
  readonly bytes: Uint8Array;
  readonly width: number;
  readonly height: number;
} | {
  readonly ok: false;
  readonly message: string;
}

RenderErr

type
type RenderErr = {
  readonly ok: false;
  readonly error: RenderFailure;
}

RenderFailure

type
type RenderFailure = { kind: "invalid-template-input"; issues: string[]; } | { kind: "renderer-unavailable"; attempted: ({ kind: "takumi"; } | { kind: "satori-sharp"; reason: { kind: "native-module-load-failed"; platform: string; arch: string; } | { kind: "forced-fallback"; }; })[]; } | { kind: "rasterize-failed"; message: string; } | { kind: "chart-spec-invalid"; issues: string[]; }

RenderMeta

type
type RenderMeta = { backend: { kind: "takumi"; } | { kind: "satori-sharp"; reason: { kind: "native-module-load-failed"; platform: string; arch: string; } | { kind: "forced-fallback"; }; }; contentHash: string & z.BRAND<"ContentHash">; network: { kind: "offline"; } | { kind: "emoji-font-fetch"; codepoints: string[]; }; renderMs: number; widthPx: number; heightPx: number; }

RenderOk

type
type RenderOk = {
  readonly ok: true;
  readonly bytes: Uint8Array;
  readonly meta: RenderMeta;
}

RenderResult

type
type RenderResult = RenderOk | RenderErr

RendererBackend

type
type RendererBackend = { kind: "takumi"; } | { kind: "satori-sharp"; reason: { kind: "native-module-load-failed"; platform: string; arch: string; } | { kind: "forced-fallback"; }; }

RendererFallbackReason

type
type RendererFallbackReason = { kind: "native-module-load-failed"; platform: string; arch: string; } | { kind: "forced-fallback"; }

StatusCardInput

type
type StatusCardInput = { template: "status"; agentName: string; level: "ok" | "warn" | "error"; headline: string; detail: { kind: "none"; } | { kind: "text"; value: string; }; timestampIso: string; }

StatusLevel

type
type StatusLevel = "ok" | "warn" | "error"

TelegramFileId

type
type TelegramFileId = string & z.BRAND<"TelegramFileId">

TextAlign

type
type TextAlign = "left" | "center" | "right"

TextNode

type
type TextNode = {
  readonly kind: "text";
  readonly style: CardStyle;
  readonly text: string;
}

Interfaces

CardStyle

interface

The flexbox-only style subset. Every property is optional at the type level, but there is no `[k: string]: unknown` index signature and no raw string escape hatch, so unsupported CSS (grid, position tricks) cannot be expressed.

interface CardStyle

flexDirection

property
flexDirection: FlexDirection

alignItems

property
alignItems: FlexAlign

justifyContent

property
justifyContent: FlexJustify

flexWrap

property
flexWrap: FlexWrap

flexGrow

property
flexGrow: number

flexShrink

property
flexShrink: number

flexBasis

property
flexBasis: string | number

gap

property
gap: number

padding

property
padding: string | number

margin

property
margin: string | number

width

property
width: string | number

height

property
height: string | number

minWidth

property
minWidth: string | number

maxWidth

property
maxWidth: string | number

minHeight

property
minHeight: string | number

maxHeight

property
maxHeight: string | number

backgroundColor

property
backgroundColor: string

color

property
color: string

fontSize

property
fontSize: number

fontWeight

property
fontWeight: number

fontFamily

property
fontFamily: string

lineHeight

property
lineHeight: number

letterSpacing

property
letterSpacing: number

textAlign

property
textAlign: TextAlign

borderRadius

property
borderRadius: number

borderWidth

property
borderWidth: number

borderColor

property
borderColor: string

borderStyle

property
borderStyle: "solid"

objectFit

property
objectFit: ObjectFit

opacity

property
opacity: number

ChartDimensions

interface
interface ChartDimensions

width

property
width: number

height

property
height: number

DiagnosticEvent

interface
interface DiagnosticEvent

kind

property
kind: DiagnosticKind

category

property
category: string

detail

property
detail: string

stack

property
stack: string

data

property
data: Record<string, unknown>

timestamp

property
timestamp: number

FileIdCacheStore

interface

Pluggable storage port. The in-memory default ships here; callers substitute a persistent (SQLite/Redis) implementation without any change to `renderCard`.

interface FileIdCacheStore

get

method
get(hash: ContentHash, botId: BotId): Promise<TelegramFileId | null>

set

method
set(hash: ContentHash, botId: BotId, fileId: TelegramFileId): Promise<void>

ImageBackend

interface
interface ImageBackend

kind

property
kind: BackendKind

renderPng

method
renderPng(node: CardNode, opts: RenderPngOptions): Promise<Uint8Array>

RenderPngOptions

interface
interface RenderPngOptions

width

property
width: number

height

property
height: number

TakumiWasmInputs

interface
interface TakumiWasmInputs

wasm

property

The `takumi_wasm_bg.wasm` bytes or a precompiled module.

wasm: SyncInitInput

fonts

property

Font buffers to register (e.g. a Latin/monospace font).

fonts: readonly Uint8Array<ArrayBufferLike>[]

Constants

BotIdSchema

const
const BotIdSchema: z.ZodBranded<z.ZodString, "BotId">

CHART_DIMENSIONS

const
const CHART_DIMENSIONS: RenderPngOptions

COMPLETION_DIMENSIONS

const
const COMPLETION_DIMENSIONS: RenderPngOptions

CachedFileHitSchema

const
const CachedFileHitSchema: z.ZodObject<{ hit: z.ZodLiteral<true>; fileId: z.ZodBranded<z.ZodString, "TelegramFileId">; contentHash: z.ZodBranded<z.ZodString, "ContentHash">; }, "strip", z.ZodTypeAny, { contentHash: string & z.BRAND<"ContentHash">; hit: true; fileId: string & z.BRAND<"TelegramFileId">; }, { contentHash: string; hit: true; fileId: string; }>

CardInputSchema

const
const CardInputSchema: z.ZodDiscriminatedUnion<"template", [z.ZodObject<{ template: z.ZodLiteral<"status">; agentName: z.ZodString; level: z.ZodEnum<["ok", "warn", "error"]>; headline: z.ZodString; detail: z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{ kind: z.ZodLiteral<"none">; }, "strip", z.ZodTypeAny, { kind: "none"; }, { kind: "none"; }>, z.ZodObject<{ kind: z.ZodLiteral<"text">; value: z.ZodString; }, "strip", z.ZodTypeAny, { kind: "text"; value: string; }, { kind: "text"; value: string; }>]>; timestampIso: z.ZodString; }, "strip", z.ZodTypeAny, { template: "status"; agentName: string; level: "ok" | "warn" | "error"; headline: string; detail: { kind: "none"; } | { kind: "text"; value: string; }; timestampIso: string; }, { template: "status"; agentName: string; level: "ok" | "warn" | "error"; headline: string; detail: { kind: "none"; } | { kind: "text"; value: string; }; timestampIso: string; }>, z.ZodObject<{ template: z.ZodLiteral<"fleet-overview">; title: z.ZodString; agents: z.ZodArray<z.ZodObject<{ name: z.ZodString; level: z.ZodEnum<["ok", "warn", "error"]>; note: z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{ kind: z.ZodLiteral<"none">; }, "strip", z.ZodTypeAny, { kind: "none"; }, { kind: "none"; }>, z.ZodObject<{ kind: z.ZodLiteral<"text">; value: z.ZodString; }, "strip", z.ZodTypeAny, { kind: "text"; value: string; }, { kind: "text"; value: string; }>]>; }, "strip", z.ZodTypeAny, { name: string; level: "ok" | "warn" | "error"; note: { kind: "none"; } | { kind: "text"; value: string; }; }, { name: string; level: "ok" | "warn" | "error"; note: { kind: "none"; } | { kind: "text"; value: string; }; }>, "many">; chart: z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{ kind: z.ZodLiteral<"none">; }, "strip", z.ZodTypeAny, { kind: "none"; }, { kind: "none"; }>, z.ZodObject<{ kind: z.ZodLiteral<"spec">; spec: z.ZodObject<{ kind: z.ZodEnum<["bar", "line"]>; title: z.ZodString; categories: z.ZodArray<z.ZodString, "many">; series: z.ZodArray<z.ZodObject<{ name: z.ZodString; values: z.ZodArray<z.ZodNumber, "many">; }, "strip", z.ZodTypeAny, { values: number[]; name: string; }, { values: number[]; name: string; }>, "many">; }, "strip", z.ZodTypeAny, { kind: "bar" | "line"; title: string; categories: string[]; series: { values: number[]; name: string; }[]; }, { kind: "bar" | "line"; title: string; categories: string[]; series: { values: number[]; name: string; }[]; }>; }, "strip", z.ZodTypeAny, { kind: "spec"; spec: { kind: "bar" | "line"; title: string; categories: string[]; series: { values: number[]; name: string; }[]; }; }, { kind: "spec"; spec: { kind: "bar" | "line"; title: string; categories: string[]; series: { values: number[]; name: string; }[]; }; }>]>; timestampIso: z.ZodString; }, "strip", z.ZodTypeAny, { title: string; template: "fleet-overview"; timestampIso: string; agents: { name: string; level: "ok" | "warn" | "error"; note: { kind: "none"; } | { kind: "text"; value: string; }; }[]; chart: { kind: "none"; } | { kind: "spec"; spec: { kind: "bar" | "line"; title: string; categories: string[]; series: { values: number[]; name: string; }[]; }; }; }, { title: string; template: "fleet-overview"; timestampIso: string; agents: { name: string; level: "ok" | "warn" | "error"; note: { kind: "none"; } | { kind: "text"; value: string; }; }[]; chart: { kind: "none"; } | { kind: "spec"; spec: { kind: "bar" | "line"; title: string; categories: string[]; series: { values: number[]; name: string; }[]; }; }; }>, z.ZodObject<{ template: z.ZodLiteral<"needs-input">; agentName: z.ZodString; question: z.ZodString; options: z.ZodArray<z.ZodObject<{ label: z.ZodString; hint: z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{ kind: z.ZodLiteral<"none">; }, "strip", z.ZodTypeAny, { kind: "none"; }, { kind: "none"; }>, z.ZodObject<{ kind: z.ZodLiteral<"text">; value: z.ZodString; }, "strip", z.ZodTypeAny, { kind: "text"; value: string; }, { kind: "text"; value: string; }>]>; }, "strip", z.ZodTypeAny, { label: string; hint: { kind: "none"; } | { kind: "text"; value: string; }; }, { label: string; hint: { kind: "none"; } | { kind: "text"; value: string; }; }>, "many">; timestampIso: z.ZodString; }, "strip", z.ZodTypeAny, { options: { label: string; hint: { kind: "none"; } | { kind: "text"; value: string; }; }[]; template: "needs-input"; agentName: string; timestampIso: string; question: string; }, { options: { label: string; hint: { kind: "none"; } | { kind: "text"; value: string; }; }[]; template: "needs-input"; agentName: string; timestampIso: string; question: string; }>, z.ZodObject<{ template: z.ZodLiteral<"completion">; agentName: z.ZodString; headline: z.ZodString; summary: z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{ kind: z.ZodLiteral<"none">; }, "strip", z.ZodTypeAny, { kind: "none"; }, { kind: "none"; }>, z.ZodObject<{ kind: z.ZodLiteral<"text">; value: z.ZodString; }, "strip", z.ZodTypeAny, { kind: "text"; value: string; }, { kind: "text"; value: string; }>]>; durationMs: z.ZodNumber; timestampIso: z.ZodString; }, "strip", z.ZodTypeAny, { template: "completion"; agentName: string; headline: string; timestampIso: string; summary: { kind: "none"; } | { kind: "text"; value: string; }; durationMs: number; }, { template: "completion"; agentName: string; headline: string; timestampIso: string; summary: { kind: "none"; } | { kind: "text"; value: string; }; durationMs: number; }>, z.ZodObject<{ template: z.ZodLiteral<"failure">; agentName: z.ZodString; headline: z.ZodString; detail: z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{ kind: z.ZodLiteral<"none">; }, "strip", z.ZodTypeAny, { kind: "none"; }, { kind: "none"; }>, z.ZodObject<{ kind: z.ZodLiteral<"text">; value: z.ZodString; }, "strip", z.ZodTypeAny, { kind: "text"; value: string; }, { kind: "text"; value: string; }>]>; timestampIso: z.ZodString; }, "strip", z.ZodTypeAny, { template: "failure"; agentName: string; headline: string; detail: { kind: "none"; } | { kind: "text"; value: string; }; timestampIso: string; }, { template: "failure"; agentName: string; headline: string; detail: { kind: "none"; } | { kind: "text"; value: string; }; timestampIso: string; }>, z.ZodObject<{ template: z.ZodLiteral<"chart">; spec: z.ZodObject<{ kind: z.ZodEnum<["bar", "line"]>; title: z.ZodString; categories: z.ZodArray<z.ZodString, "many">; series: z.ZodArray<z.ZodObject<{ name: z.ZodString; values: z.ZodArray<z.ZodNumber, "many">; }, "strip", z.ZodTypeAny, { values: number[]; name: string; }, { values: number[]; name: string; }>, "many">; }, "strip", z.ZodTypeAny, { kind: "bar" | "line"; title: string; categories: string[]; series: { values: number[]; name: string; }[]; }, { kind: "bar" | "line"; title: string; categories: string[]; series: { values: number[]; name: string; }[]; }>; caption: z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{ kind: z.ZodLiteral<"none">; }, "strip", z.ZodTypeAny, { kind: "none"; }, { kind: "none"; }>, z.ZodObject<{ kind: z.ZodLiteral<"text">; value: z.ZodString; }, "strip", z.ZodTypeAny, { kind: "text"; value: string; }, { kind: "text"; value: string; }>]>; }, "strip", z.ZodTypeAny, { template: "chart"; spec: { kind: "bar" | "line"; title: string; categories: string[]; series: { values: number[]; name: string; }[]; }; caption: { kind: "none"; } | { kind: "text"; value: string; }; }, { template: "chart"; spec: { kind: "bar" | "line"; title: string; categories: string[]; series: { values: number[]; name: string; }[]; }; caption: { kind: "none"; } | { kind: "text"; value: string; }; }>]>

ChartCardInputSchema

const
const ChartCardInputSchema: z.ZodObject<{ template: z.ZodLiteral<"chart">; spec: z.ZodObject<{ kind: z.ZodEnum<["bar", "line"]>; title: z.ZodString; categories: z.ZodArray<z.ZodString, "many">; series: z.ZodArray<z.ZodObject<{ name: z.ZodString; values: z.ZodArray<z.ZodNumber, "many">; }, "strip", z.ZodTypeAny, { values: number[]; name: string; }, { values: number[]; name: string; }>, "many">; }, "strip", z.ZodTypeAny, { kind: "bar" | "line"; title: string; categories: string[]; series: { values: number[]; name: string; }[]; }, { kind: "bar" | "line"; title: string; categories: string[]; series: { values: number[]; name: string; }[]; }>; caption: z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{ kind: z.ZodLiteral<"none">; }, "strip", z.ZodTypeAny, { kind: "none"; }, { kind: "none"; }>, z.ZodObject<{ kind: z.ZodLiteral<"text">; value: z.ZodString; }, "strip", z.ZodTypeAny, { kind: "text"; value: string; }, { kind: "text"; value: string; }>]>; }, "strip", z.ZodTypeAny, { template: "chart"; spec: { kind: "bar" | "line"; title: string; categories: string[]; series: { values: number[]; name: string; }[]; }; caption: { kind: "none"; } | { kind: "text"; value: string; }; }, { template: "chart"; spec: { kind: "bar" | "line"; title: string; categories: string[]; series: { values: number[]; name: string; }[]; }; caption: { kind: "none"; } | { kind: "text"; value: string; }; }>

ChartKindSchema

const
const ChartKindSchema: z.ZodEnum<["bar", "line"]>

ChartSeriesSchema

const
const ChartSeriesSchema: z.ZodObject<{ name: z.ZodString; values: z.ZodArray<z.ZodNumber, "many">; }, "strip", z.ZodTypeAny, { values: number[]; name: string; }, { values: number[]; name: string; }>

ChartSpecSchema

const
const ChartSpecSchema: z.ZodObject<{ kind: z.ZodEnum<["bar", "line"]>; title: z.ZodString; categories: z.ZodArray<z.ZodString, "many">; series: z.ZodArray<z.ZodObject<{ name: z.ZodString; values: z.ZodArray<z.ZodNumber, "many">; }, "strip", z.ZodTypeAny, { values: number[]; name: string; }, { values: number[]; name: string; }>, "many">; }, "strip", z.ZodTypeAny, { kind: "bar" | "line"; title: string; categories: string[]; series: { values: number[]; name: string; }[]; }, { kind: "bar" | "line"; title: string; categories: string[]; series: { values: number[]; name: string; }[]; }>

CompletionCardInputSchema

const
const CompletionCardInputSchema: z.ZodObject<{ template: z.ZodLiteral<"completion">; agentName: z.ZodString; headline: z.ZodString; summary: z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{ kind: z.ZodLiteral<"none">; }, "strip", z.ZodTypeAny, { kind: "none"; }, { kind: "none"; }>, z.ZodObject<{ kind: z.ZodLiteral<"text">; value: z.ZodString; }, "strip", z.ZodTypeAny, { kind: "text"; value: string; }, { kind: "text"; value: string; }>]>; durationMs: z.ZodNumber; timestampIso: z.ZodString; }, "strip", z.ZodTypeAny, { template: "completion"; agentName: string; headline: string; timestampIso: string; summary: { kind: "none"; } | { kind: "text"; value: string; }; durationMs: number; }, { template: "completion"; agentName: string; headline: string; timestampIso: string; summary: { kind: "none"; } | { kind: "text"; value: string; }; durationMs: number; }>

ContentHashSchema

const
const ContentHashSchema: z.ZodBranded<z.ZodString, "ContentHash">

DEFAULT_CHART_HEIGHT

const
const DEFAULT_CHART_HEIGHT: 480

DEFAULT_CHART_WIDTH

const
const DEFAULT_CHART_WIDTH: 800

FAILURE_DIMENSIONS

const
const FAILURE_DIMENSIONS: RenderPngOptions

FLEET_OVERVIEW_DIMENSIONS

const
const FLEET_OVERVIEW_DIMENSIONS: RenderPngOptions

FailureCardInputSchema

const
const FailureCardInputSchema: z.ZodObject<{ template: z.ZodLiteral<"failure">; agentName: z.ZodString; headline: z.ZodString; detail: z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{ kind: z.ZodLiteral<"none">; }, "strip", z.ZodTypeAny, { kind: "none"; }, { kind: "none"; }>, z.ZodObject<{ kind: z.ZodLiteral<"text">; value: z.ZodString; }, "strip", z.ZodTypeAny, { kind: "text"; value: string; }, { kind: "text"; value: string; }>]>; timestampIso: z.ZodString; }, "strip", z.ZodTypeAny, { template: "failure"; agentName: string; headline: string; detail: { kind: "none"; } | { kind: "text"; value: string; }; timestampIso: string; }, { template: "failure"; agentName: string; headline: string; detail: { kind: "none"; } | { kind: "text"; value: string; }; timestampIso: string; }>

FleetAgentSchema

const
const FleetAgentSchema: z.ZodObject<{ name: z.ZodString; level: z.ZodEnum<["ok", "warn", "error"]>; note: z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{ kind: z.ZodLiteral<"none">; }, "strip", z.ZodTypeAny, { kind: "none"; }, { kind: "none"; }>, z.ZodObject<{ kind: z.ZodLiteral<"text">; value: z.ZodString; }, "strip", z.ZodTypeAny, { kind: "text"; value: string; }, { kind: "text"; value: string; }>]>; }, "strip", z.ZodTypeAny, { name: string; level: "ok" | "warn" | "error"; note: { kind: "none"; } | { kind: "text"; value: string; }; }, { name: string; level: "ok" | "warn" | "error"; note: { kind: "none"; } | { kind: "text"; value: string; }; }>

FleetOverviewCardInputSchema

const
const FleetOverviewCardInputSchema: z.ZodObject<{ template: z.ZodLiteral<"fleet-overview">; title: z.ZodString; agents: z.ZodArray<z.ZodObject<{ name: z.ZodString; level: z.ZodEnum<["ok", "warn", "error"]>; note: z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{ kind: z.ZodLiteral<"none">; }, "strip", z.ZodTypeAny, { kind: "none"; }, { kind: "none"; }>, z.ZodObject<{ kind: z.ZodLiteral<"text">; value: z.ZodString; }, "strip", z.ZodTypeAny, { kind: "text"; value: string; }, { kind: "text"; value: string; }>]>; }, "strip", z.ZodTypeAny, { name: string; level: "ok" | "warn" | "error"; note: { kind: "none"; } | { kind: "text"; value: string; }; }, { name: string; level: "ok" | "warn" | "error"; note: { kind: "none"; } | { kind: "text"; value: string; }; }>, "many">; chart: z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{ kind: z.ZodLiteral<"none">; }, "strip", z.ZodTypeAny, { kind: "none"; }, { kind: "none"; }>, z.ZodObject<{ kind: z.ZodLiteral<"spec">; spec: z.ZodObject<{ kind: z.ZodEnum<["bar", "line"]>; title: z.ZodString; categories: z.ZodArray<z.ZodString, "many">; series: z.ZodArray<z.ZodObject<{ name: z.ZodString; values: z.ZodArray<z.ZodNumber, "many">; }, "strip", z.ZodTypeAny, { values: number[]; name: string; }, { values: number[]; name: string; }>, "many">; }, "strip", z.ZodTypeAny, { kind: "bar" | "line"; title: string; categories: string[]; series: { values: number[]; name: string; }[]; }, { kind: "bar" | "line"; title: string; categories: string[]; series: { values: number[]; name: string; }[]; }>; }, "strip", z.ZodTypeAny, { kind: "spec"; spec: { kind: "bar" | "line"; title: string; categories: string[]; series: { values: number[]; name: string; }[]; }; }, { kind: "spec"; spec: { kind: "bar" | "line"; title: string; categories: string[]; series: { values: number[]; name: string; }[]; }; }>]>; timestampIso: z.ZodString; }, "strip", z.ZodTypeAny, { title: string; template: "fleet-overview"; timestampIso: string; agents: { name: string; level: "ok" | "warn" | "error"; note: { kind: "none"; } | { kind: "text"; value: string; }; }[]; chart: { kind: "none"; } | { kind: "spec"; spec: { kind: "bar" | "line"; title: string; categories: string[]; series: { values: number[]; name: string; }[]; }; }; }, { title: string; template: "fleet-overview"; timestampIso: string; agents: { name: string; level: "ok" | "warn" | "error"; note: { kind: "none"; } | { kind: "text"; value: string; }; }[]; chart: { kind: "none"; } | { kind: "spec"; spec: { kind: "bar" | "line"; title: string; categories: string[]; series: { values: number[]; name: string; }[]; }; }; }>

NEEDS_INPUT_DIMENSIONS

const
const NEEDS_INPUT_DIMENSIONS: RenderPngOptions

NeedsInputCardInputSchema

const
const NeedsInputCardInputSchema: z.ZodObject<{ template: z.ZodLiteral<"needs-input">; agentName: z.ZodString; question: z.ZodString; options: z.ZodArray<z.ZodObject<{ label: z.ZodString; hint: z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{ kind: z.ZodLiteral<"none">; }, "strip", z.ZodTypeAny, { kind: "none"; }, { kind: "none"; }>, z.ZodObject<{ kind: z.ZodLiteral<"text">; value: z.ZodString; }, "strip", z.ZodTypeAny, { kind: "text"; value: string; }, { kind: "text"; value: string; }>]>; }, "strip", z.ZodTypeAny, { label: string; hint: { kind: "none"; } | { kind: "text"; value: string; }; }, { label: string; hint: { kind: "none"; } | { kind: "text"; value: string; }; }>, "many">; timestampIso: z.ZodString; }, "strip", z.ZodTypeAny, { options: { label: string; hint: { kind: "none"; } | { kind: "text"; value: string; }; }[]; template: "needs-input"; agentName: string; timestampIso: string; question: string; }, { options: { label: string; hint: { kind: "none"; } | { kind: "text"; value: string; }; }[]; template: "needs-input"; agentName: string; timestampIso: string; question: string; }>

NeedsInputOptionSchema

const
const NeedsInputOptionSchema: z.ZodObject<{ label: z.ZodString; hint: z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{ kind: z.ZodLiteral<"none">; }, "strip", z.ZodTypeAny, { kind: "none"; }, { kind: "none"; }>, z.ZodObject<{ kind: z.ZodLiteral<"text">; value: z.ZodString; }, "strip", z.ZodTypeAny, { kind: "text"; value: string; }, { kind: "text"; value: string; }>]>; }, "strip", z.ZodTypeAny, { label: string; hint: { kind: "none"; } | { kind: "text"; value: string; }; }, { label: string; hint: { kind: "none"; } | { kind: "text"; value: string; }; }>

NetworkUsageSchema

const
const NetworkUsageSchema: z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{ kind: z.ZodLiteral<"offline">; }, "strip", z.ZodTypeAny, { kind: "offline"; }, { kind: "offline"; }>, z.ZodObject<{ kind: z.ZodLiteral<"emoji-font-fetch">; codepoints: z.ZodArray<z.ZodString, "many">; }, "strip", z.ZodTypeAny, { kind: "emoji-font-fetch"; codepoints: string[]; }, { kind: "emoji-font-fetch"; codepoints: string[]; }>]>

RenderFailureSchema

const
const RenderFailureSchema: z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{ kind: z.ZodLiteral<"invalid-template-input">; issues: z.ZodArray<z.ZodString, "many">; }, "strip", z.ZodTypeAny, { kind: "invalid-template-input"; issues: string[]; }, { kind: "invalid-template-input"; issues: string[]; }>, z.ZodObject<{ kind: z.ZodLiteral<"renderer-unavailable">; attempted: z.ZodArray<z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{ kind: z.ZodLiteral<"takumi">; }, "strip", z.ZodTypeAny, { kind: "takumi"; }, { kind: "takumi"; }>, z.ZodObject<{ kind: z.ZodLiteral<"satori-sharp">; reason: z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{ kind: z.ZodLiteral<"native-module-load-failed">; platform: z.ZodString; arch: z.ZodString; }, "strip", z.ZodTypeAny, { kind: "native-module-load-failed"; platform: string; arch: string; }, { kind: "native-module-load-failed"; platform: string; arch: string; }>, z.ZodObject<{ kind: z.ZodLiteral<"forced-fallback">; }, "strip", z.ZodTypeAny, { kind: "forced-fallback"; }, { kind: "forced-fallback"; }>]>; }, "strip", z.ZodTypeAny, { kind: "satori-sharp"; reason: { kind: "native-module-load-failed"; platform: string; arch: string; } | { kind: "forced-fallback"; }; }, { kind: "satori-sharp"; reason: { kind: "native-module-load-failed"; platform: string; arch: string; } | { kind: "forced-fallback"; }; }>]>, "many">; }, "strip", z.ZodTypeAny, { kind: "renderer-unavailable"; attempted: ({ kind: "takumi"; } | { kind: "satori-sharp"; reason: { kind: "native-module-load-failed"; platform: string; arch: string; } | { kind: "forced-fallback"; }; })[]; }, { kind: "renderer-unavailable"; attempted: ({ kind: "takumi"; } | { kind: "satori-sharp"; reason: { kind: "native-module-load-failed"; platform: string; arch: string; } | { kind: "forced-fallback"; }; })[]; }>, z.ZodObject<{ kind: z.ZodLiteral<"rasterize-failed">; message: z.ZodString; }, "strip", z.ZodTypeAny, { kind: "rasterize-failed"; message: string; }, { kind: "rasterize-failed"; message: string; }>, z.ZodObject<{ kind: z.ZodLiteral<"chart-spec-invalid">; issues: z.ZodArray<z.ZodString, "many">; }, "strip", z.ZodTypeAny, { kind: "chart-spec-invalid"; issues: string[]; }, { kind: "chart-spec-invalid"; issues: string[]; }>]>

RenderMetaSchema

const
const RenderMetaSchema: z.ZodObject<{ backend: z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{ kind: z.ZodLiteral<"takumi">; }, "strip", z.ZodTypeAny, { kind: "takumi"; }, { kind: "takumi"; }>, z.ZodObject<{ kind: z.ZodLiteral<"satori-sharp">; reason: z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{ kind: z.ZodLiteral<"native-module-load-failed">; platform: z.ZodString; arch: z.ZodString; }, "strip", z.ZodTypeAny, { kind: "native-module-load-failed"; platform: string; arch: string; }, { kind: "native-module-load-failed"; platform: string; arch: string; }>, z.ZodObject<{ kind: z.ZodLiteral<"forced-fallback">; }, "strip", z.ZodTypeAny, { kind: "forced-fallback"; }, { kind: "forced-fallback"; }>]>; }, "strip", z.ZodTypeAny, { kind: "satori-sharp"; reason: { kind: "native-module-load-failed"; platform: string; arch: string; } | { kind: "forced-fallback"; }; }, { kind: "satori-sharp"; reason: { kind: "native-module-load-failed"; platform: string; arch: string; } | { kind: "forced-fallback"; }; }>]>; contentHash: z.ZodBranded<z.ZodString, "ContentHash">; network: z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{ kind: z.ZodLiteral<"offline">; }, "strip", z.ZodTypeAny, { kind: "offline"; }, { kind: "offline"; }>, z.ZodObject<{ kind: z.ZodLiteral<"emoji-font-fetch">; codepoints: z.ZodArray<z.ZodString, "many">; }, "strip", z.ZodTypeAny, { kind: "emoji-font-fetch"; codepoints: string[]; }, { kind: "emoji-font-fetch"; codepoints: string[]; }>]>; renderMs: z.ZodNumber; widthPx: z.ZodNumber; heightPx: z.ZodNumber; }, "strip", z.ZodTypeAny, { backend: { kind: "takumi"; } | { kind: "satori-sharp"; reason: { kind: "native-module-load-failed"; platform: string; arch: string; } | { kind: "forced-fallback"; }; }; contentHash: string & z.BRAND<"ContentHash">; network: { kind: "offline"; } | { kind: "emoji-font-fetch"; codepoints: string[]; }; renderMs: number; widthPx: number; heightPx: number; }, { backend: { kind: "takumi"; } | { kind: "satori-sharp"; reason: { kind: "native-module-load-failed"; platform: string; arch: string; } | { kind: "forced-fallback"; }; }; contentHash: string; network: { kind: "offline"; } | { kind: "emoji-font-fetch"; codepoints: string[]; }; renderMs: number; widthPx: number; heightPx: number; }>

RendererBackendSchema

const
const RendererBackendSchema: z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{ kind: z.ZodLiteral<"takumi">; }, "strip", z.ZodTypeAny, { kind: "takumi"; }, { kind: "takumi"; }>, z.ZodObject<{ kind: z.ZodLiteral<"satori-sharp">; reason: z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{ kind: z.ZodLiteral<"native-module-load-failed">; platform: z.ZodString; arch: z.ZodString; }, "strip", z.ZodTypeAny, { kind: "native-module-load-failed"; platform: string; arch: string; }, { kind: "native-module-load-failed"; platform: string; arch: string; }>, z.ZodObject<{ kind: z.ZodLiteral<"forced-fallback">; }, "strip", z.ZodTypeAny, { kind: "forced-fallback"; }, { kind: "forced-fallback"; }>]>; }, "strip", z.ZodTypeAny, { kind: "satori-sharp"; reason: { kind: "native-module-load-failed"; platform: string; arch: string; } | { kind: "forced-fallback"; }; }, { kind: "satori-sharp"; reason: { kind: "native-module-load-failed"; platform: string; arch: string; } | { kind: "forced-fallback"; }; }>]>

RendererFallbackReasonSchema

const
const RendererFallbackReasonSchema: z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{ kind: z.ZodLiteral<"native-module-load-failed">; platform: z.ZodString; arch: z.ZodString; }, "strip", z.ZodTypeAny, { kind: "native-module-load-failed"; platform: string; arch: string; }, { kind: "native-module-load-failed"; platform: string; arch: string; }>, z.ZodObject<{ kind: z.ZodLiteral<"forced-fallback">; }, "strip", z.ZodTypeAny, { kind: "forced-fallback"; }, { kind: "forced-fallback"; }>]>

STATUS_DIMENSIONS

const
const STATUS_DIMENSIONS: RenderPngOptions

StatusCardInputSchema

const
const StatusCardInputSchema: z.ZodObject<{ template: z.ZodLiteral<"status">; agentName: z.ZodString; level: z.ZodEnum<["ok", "warn", "error"]>; headline: z.ZodString; detail: z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{ kind: z.ZodLiteral<"none">; }, "strip", z.ZodTypeAny, { kind: "none"; }, { kind: "none"; }>, z.ZodObject<{ kind: z.ZodLiteral<"text">; value: z.ZodString; }, "strip", z.ZodTypeAny, { kind: "text"; value: string; }, { kind: "text"; value: string; }>]>; timestampIso: z.ZodString; }, "strip", z.ZodTypeAny, { template: "status"; agentName: string; level: "ok" | "warn" | "error"; headline: string; detail: { kind: "none"; } | { kind: "text"; value: string; }; timestampIso: string; }, { template: "status"; agentName: string; level: "ok" | "warn" | "error"; headline: string; detail: { kind: "none"; } | { kind: "text"; value: string; }; timestampIso: string; }>

StatusLevelSchema

const
const StatusLevelSchema: z.ZodEnum<["ok", "warn", "error"]>

TelegramFileIdSchema

const
const TelegramFileIdSchema: z.ZodBranded<z.ZodString, "TelegramFileId">