Files
app/frontend/src/client/schemas.gen.ts
T

4918 lines
120 KiB
TypeScript

// This file is auto-generated by @hey-api/openapi-ts
export const AIConfigPublicSchema = {
properties: {
api_base: {
type: 'string',
title: 'Api Base'
},
model: {
type: 'string',
title: 'Model'
},
max_rounds: {
type: 'integer',
title: 'Max Rounds'
},
api_key_set: {
type: 'boolean',
title: 'Api Key Set'
},
api_key_masked: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Api Key Masked'
}
},
type: 'object',
required: ['api_base', 'model', 'max_rounds', 'api_key_set', 'api_key_masked'],
title: 'AIConfigPublic'
} as const;
export const AIConfigUpdateSchema = {
properties: {
api_base: {
type: 'string',
maxLength: 512,
minLength: 1,
title: 'Api Base'
},
api_key: {
anyOf: [
{
type: 'string',
maxLength: 512
},
{
type: 'null'
}
],
title: 'Api Key'
},
model: {
type: 'string',
maxLength: 128,
title: 'Model',
default: ''
},
max_rounds: {
type: 'integer',
maximum: 50,
minimum: 1,
title: 'Max Rounds',
default: 12
}
},
type: 'object',
required: ['api_base'],
title: 'AIConfigUpdate'
} as const;
export const AIModelsBodySchema = {
properties: {
api_base: {
type: 'string',
maxLength: 512,
minLength: 1,
title: 'Api Base'
},
api_key: {
anyOf: [
{
type: 'string',
maxLength: 512
},
{
type: 'null'
}
],
title: 'Api Key'
}
},
type: 'object',
required: ['api_base'],
title: 'AIModelsBody'
} as const;
export const AIStatusSchema = {
properties: {
available: {
type: 'boolean',
title: 'Available'
},
model: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Model'
}
},
type: 'object',
required: ['available', 'model'],
title: 'AIStatus'
} as const;
export const AlertsConfigSchema = {
properties: {
enabled: {
type: 'boolean',
title: 'Enabled',
default: true
},
channels: {
items: {
'$ref': '#/components/schemas/Channel'
},
type: 'array',
title: 'Channels'
},
rules: {
items: {
'$ref': '#/components/schemas/Rule'
},
type: 'array',
title: 'Rules'
}
},
type: 'object',
title: 'AlertsConfig',
description: 'The whole alerting setup, as stored and as the API sees it.'
} as const;
export const ApplyRequestSchema = {
properties: {
requirements: {
type: 'string',
title: 'Requirements',
default: ''
}
},
type: 'object',
title: 'ApplyRequest',
description: 'A pip manifest, one requirement per line.'
} as const;
export const ApplyResultSchema = {
properties: {
ok: {
type: 'boolean',
title: 'Ok'
},
output: {
type: 'string',
title: 'Output',
default: ''
}
},
type: 'object',
required: ['ok'],
title: 'ApplyResult'
} as const;
export const ArtifactRefSchema = {
properties: {
digest: {
type: 'string',
title: 'Digest'
},
size: {
type: 'integer',
title: 'Size'
},
media_type: {
type: 'string',
title: 'Media Type'
},
name: {
type: 'string',
title: 'Name',
default: ''
}
},
type: 'object',
required: ['digest', 'size', 'media_type'],
title: 'ArtifactRef'
} as const;
export const ArtifactRowSchema = {
properties: {
name: {
type: 'string',
title: 'Name'
},
node: {
type: 'string',
title: 'Node'
},
digest: {
type: 'string',
title: 'Digest'
},
size: {
type: 'integer',
title: 'Size'
},
media_type: {
type: 'string',
title: 'Media Type'
},
filename: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Filename'
}
},
type: 'object',
required: ['name', 'node', 'digest', 'size', 'media_type'],
title: 'ArtifactRow'
} as const;
export const Body_login_login_access_tokenSchema = {
properties: {
grant_type: {
anyOf: [
{
type: 'string',
pattern: '^password$'
},
{
type: 'null'
}
],
title: 'Grant Type'
},
username: {
type: 'string',
title: 'Username'
},
password: {
type: 'string',
format: 'password',
title: 'Password'
},
scope: {
type: 'string',
title: 'Scope',
default: ''
},
client_id: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Client Id'
},
client_secret: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
format: 'password',
title: 'Client Secret'
}
},
type: 'object',
required: ['username', 'password'],
title: 'Body_login-login_access_token'
} as const;
export const Body_oauth_tokenSchema = {
properties: {
grant_type: {
type: 'string',
title: 'Grant Type'
},
code: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Code'
},
redirect_uri: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Redirect Uri'
},
client_id: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Client Id'
},
code_verifier: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Code Verifier'
},
refresh_token: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Refresh Token'
},
resource: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Resource'
}
},
type: 'object',
required: ['grant_type'],
title: 'Body_oauth-token'
} as const;
export const BrainEdgeSchema = {
properties: {
source: {
type: 'string',
title: 'Source'
},
target: {
type: 'string',
title: 'Target'
},
messages: {
items: {
type: 'string'
},
type: 'array',
title: 'Messages'
}
},
type: 'object',
required: ['source', 'target'],
title: 'BrainEdge',
description: 'Messages carrying values from one neuron to another.'
} as const;
export const BrainGraphSchema = {
properties: {
nodes: {
items: {
'$ref': '#/components/schemas/BrainNode'
},
type: 'array',
title: 'Nodes'
},
edges: {
items: {
'$ref': '#/components/schemas/BrainEdge'
},
type: 'array',
title: 'Edges'
}
},
type: 'object',
title: 'BrainGraph',
description: 'Every published flow at once, merged on what its nodes talk to.'
} as const;
export const BrainNodeSchema = {
properties: {
id: {
type: 'string',
title: 'Id'
},
label: {
type: 'string',
title: 'Label'
},
kind: {
type: 'string',
title: 'Kind'
},
members: {
items: {
type: 'string'
},
type: 'array',
title: 'Members'
},
flows: {
items: {
type: 'string'
},
type: 'array',
title: 'Flows'
},
issue: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Issue',
description: 'Why this neuron cannot run, if validation found something. A failure the engine hits while running arrives over the socket instead; this is the part that is already true before anything fires, and so has to travel with the graph.'
}
},
type: 'object',
required: ['id', 'label', 'kind'],
title: 'BrainNode',
description: `One neuron: a thing the engine talks to, or a node that only computes.
Nodes of the same type pointing at the same outside thing — one broker
topic, one URL, one bucket — are a single entry here, whichever flows they
sit in. \`\`members\`\` are the \`\`flow.node_id\`\` names behind it, which is also
what the live events are keyed by.`
} as const;
export const ChannelSchema = {
properties: {
name: {
type: 'string',
title: 'Name'
},
kind: {
type: 'string',
enum: ['ntfy', 'smtp', 'webhook', 'dashboard', 'webpush'],
title: 'Kind'
},
enabled: {
type: 'boolean',
title: 'Enabled',
default: true
},
config: {
additionalProperties: true,
type: 'object',
title: 'Config'
}
},
type: 'object',
required: ['name', 'kind'],
title: 'Channel',
description: 'Somewhere to send an alert.'
} as const;
export const ChatItemSchema = {
properties: {
role: {
type: 'string',
title: 'Role'
},
content: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Content'
},
tool_calls: {
anyOf: [
{
items: {
additionalProperties: true,
type: 'object'
},
type: 'array'
},
{
type: 'null'
}
],
title: 'Tool Calls'
},
ok: {
anyOf: [
{
type: 'boolean'
},
{
type: 'null'
}
],
title: 'Ok'
},
error: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Error'
}
},
type: 'object',
required: ['role'],
title: 'ChatItem'
} as const;
export const ConnectorStatePublicSchema = {
properties: {
connector: {
type: 'string',
title: 'Connector'
},
data: {
items: {
'$ref': '#/components/schemas/StoredKey'
},
type: 'array',
title: 'Data'
},
count: {
type: 'integer',
title: 'Count'
}
},
type: 'object',
required: ['connector', 'data', 'count'],
title: 'ConnectorStatePublic'
} as const;
export const ControlNodeSchema = {
properties: {
id: {
type: 'string',
title: 'Id'
},
flow: {
type: 'string',
title: 'Flow'
},
title: {
type: 'string',
title: 'Title'
},
prompt_msg: {
type: 'string',
title: 'Prompt Msg'
},
actions_msg: {
type: 'string',
title: 'Actions Msg'
}
},
type: 'object',
required: ['id', 'flow', 'title', 'prompt_msg', 'actions_msg'],
title: 'ControlNode',
description: 'A wren node the chat can talk to: where it sends and where it reads.'
} as const;
export const DTypeSchema = {
type: 'string',
enum: ['float', 'int', 'str', 'bool', 'json', 'series', 'record', 'list', 'artifact', 'image', 'audio', 'video'],
title: 'DType',
description: `Serializable payload types.
The scalars carry what a single reading can say. The three structured ones
are declared shapes rather than "some JSON": a widget or a downstream node
knows what it is getting before anything runs, which is what lets the
dashboard picker offer a message and refuse a wrong binding.
Binary payloads — tensors, checkpoints, images — travel as \`\`artifact\`\`:
the bytes go to the artifact store and the message carries a reference to
them. That keeps everything on the wire JSON, which is what the state
backend, the queue and the worker protocol all rely on, and it means a
thirty-megabyte checkpoint never sits in Redis. Inline codecs would only be
needed for payloads too small to be worth a round trip, and nothing asks
for that yet.
\`\`image\`\`, \`\`audio\`\` and \`\`video\`\` are that same reference narrowed to a
media family, so a speech recogniser declares what it eats rather than
taking any bytes at all and finding out. Bytes still never travel as a
message: a camera publishes one reference per frame, a microphone one per
chunk. A reference may carry a \`\`meta\`\` dict — sample rate, dimensions, a
sequence number — which nothing here interprets.`
} as const;
export const DashboardDef_InputSchema = {
properties: {
name: {
type: 'string',
title: 'Name'
},
title: {
type: 'string',
title: 'Title',
default: ''
},
columns: {
type: 'integer',
maximum: 48,
minimum: 1,
title: 'Columns',
default: 12
},
canvas_width: {
type: 'integer',
maximum: 7680,
minimum: 0,
title: 'Canvas Width',
default: 1920
},
canvas_height: {
type: 'integer',
maximum: 4320,
minimum: 0,
title: 'Canvas Height',
default: 1080
},
icon: {
type: 'string',
title: 'Icon',
default: ''
},
widgets: {
items: {
'$ref': '#/components/schemas/WidgetDef'
},
type: 'array',
title: 'Widgets'
},
settings: {
additionalProperties: {
'$ref': '#/components/schemas/SettingDef'
},
type: 'object',
title: 'Settings'
},
version: {
type: 'integer',
title: 'Version',
default: 1
},
has_draft: {
type: 'boolean',
title: 'Has Draft',
default: false
}
},
type: 'object',
required: ['name'],
title: 'DashboardDef',
description: 'A dashboard as stored, and as the API hands it over.'
} as const;
export const DashboardDef_OutputSchema = {
properties: {
name: {
type: 'string',
title: 'Name'
},
title: {
type: 'string',
title: 'Title',
default: ''
},
columns: {
type: 'integer',
maximum: 48,
minimum: 1,
title: 'Columns',
default: 12
},
canvas_width: {
type: 'integer',
maximum: 7680,
minimum: 0,
title: 'Canvas Width',
default: 1920
},
canvas_height: {
type: 'integer',
maximum: 4320,
minimum: 0,
title: 'Canvas Height',
default: 1080
},
icon: {
type: 'string',
title: 'Icon',
default: ''
},
widgets: {
items: {
'$ref': '#/components/schemas/WidgetDef'
},
type: 'array',
title: 'Widgets'
},
settings: {
additionalProperties: {
'$ref': '#/components/schemas/SettingDef'
},
type: 'object',
title: 'Settings'
},
version: {
type: 'integer',
title: 'Version',
default: 1
},
has_draft: {
type: 'boolean',
title: 'Has Draft',
default: false
}
},
type: 'object',
required: ['name'],
title: 'DashboardDef',
description: 'A dashboard as stored, and as the API hands it over.'
} as const;
export const DashboardSummarySchema = {
properties: {
name: {
type: 'string',
title: 'Name'
},
title: {
type: 'string',
title: 'Title',
default: ''
},
icon: {
type: 'string',
title: 'Icon',
default: ''
},
widget_count: {
type: 'integer',
title: 'Widget Count',
default: 0
},
has_draft: {
type: 'boolean',
title: 'Has Draft',
default: false
},
version: {
type: 'integer',
title: 'Version',
default: 1
},
columns: {
type: 'integer',
title: 'Columns',
default: 12
},
footprint: {
items: {
'$ref': '#/components/schemas/WidgetFootprint'
},
type: 'array',
title: 'Footprint'
},
updated_at: {
anyOf: [
{
type: 'string',
format: 'date-time'
},
{
type: 'null'
}
],
title: 'Updated At'
}
},
type: 'object',
required: ['name'],
title: 'DashboardSummary',
description: 'A dashboard in a list, without its contents.'
} as const;
export const DashboardsPublicSchema = {
properties: {
data: {
items: {
'$ref': '#/components/schemas/DashboardSummary'
},
type: 'array',
title: 'Data'
},
count: {
type: 'integer',
title: 'Count'
}
},
type: 'object',
required: ['data', 'count'],
title: 'DashboardsPublic'
} as const;
export const DeadLetterSchema = {
properties: {
id: {
type: 'string',
title: 'Id'
},
ts: {
type: 'number',
title: 'Ts'
},
flow: {
type: 'string',
title: 'Flow'
},
node: {
type: 'string',
title: 'Node'
},
cause: {
type: 'string',
title: 'Cause'
},
reason: {
type: 'string',
title: 'Reason'
}
},
type: 'object',
required: ['id', 'ts', 'flow', 'node', 'cause', 'reason'],
title: 'DeadLetter'
} as const;
export const EndpointSchema = {
properties: {
kind: {
type: 'string',
title: 'Kind'
},
id: {
type: 'string',
title: 'Id'
},
label: {
type: 'string',
title: 'Label'
},
detail: {
type: 'string',
title: 'Detail',
default: ''
},
provides: {
items: {
type: 'string'
},
type: 'array',
title: 'Provides',
default: []
},
requires: {
items: {
type: 'string'
},
type: 'array',
title: 'Requires',
default: []
}
},
type: 'object',
required: ['kind', 'id', 'label'],
title: 'Endpoint',
description: `Something wired into this flow that is not a node in it.
A dashboard control setting one of its messages, a tile showing one, or a
node in another flow on the far side of a dotted name. The canvas draws
these so a value never appears to come from nowhere — or worse, appears to
come from whichever node happens to be drawn as a producer.`
} as const;
export const EnrollBodySchema = {
properties: {
portal_url: {
type: 'string',
maxLength: 255,
minLength: 1,
title: 'Portal Url'
},
claim_code: {
type: 'string',
maxLength: 32,
minLength: 1,
title: 'Claim Code'
}
},
type: 'object',
required: ['portal_url', 'claim_code'],
title: 'EnrollBody'
} as const;
export const EventRowSchema = {
properties: {
id: {
type: 'integer',
title: 'Id'
},
ts: {
type: 'string',
format: 'date-time',
title: 'Ts'
},
type: {
type: 'string',
title: 'Type'
},
flow: {
type: 'string',
title: 'Flow'
},
node: {
type: 'string',
title: 'Node'
},
detail: {
type: 'string',
title: 'Detail'
},
actor: {
type: 'string',
title: 'Actor'
},
run: {
type: 'string',
title: 'Run'
}
},
type: 'object',
required: ['id', 'ts', 'type', 'flow', 'node', 'detail', 'actor', 'run'],
title: 'EventRow'
} as const;
export const FlavorCreateSchema = {
properties: {
cpus: {
type: 'integer',
minimum: 1,
title: 'Cpus',
default: 1
},
gpus: {
type: 'integer',
minimum: 0,
title: 'Gpus',
default: 0
},
ram: {
type: 'integer',
minimum: 1,
title: 'Ram',
default: 2048
},
description: {
type: 'string',
maxLength: 255,
title: 'Description',
default: ''
},
name: {
type: 'string',
maxLength: 64,
title: 'Name'
}
},
type: 'object',
required: ['name'],
title: 'FlavorCreate'
} as const;
export const FlavorPublicSchema = {
properties: {
cpus: {
type: 'integer',
minimum: 1,
title: 'Cpus',
default: 1
},
gpus: {
type: 'integer',
minimum: 0,
title: 'Gpus',
default: 0
},
ram: {
type: 'integer',
minimum: 1,
title: 'Ram',
default: 2048
},
description: {
type: 'string',
maxLength: 255,
title: 'Description',
default: ''
},
name: {
type: 'string',
title: 'Name'
}
},
type: 'object',
required: ['name'],
title: 'FlavorPublic'
} as const;
export const FlavorUpdateSchema = {
properties: {
cpus: {
anyOf: [
{
type: 'integer',
minimum: 1
},
{
type: 'null'
}
],
title: 'Cpus'
},
gpus: {
anyOf: [
{
type: 'integer',
minimum: 0
},
{
type: 'null'
}
],
title: 'Gpus'
},
ram: {
anyOf: [
{
type: 'integer',
minimum: 1
},
{
type: 'null'
}
],
title: 'Ram'
},
description: {
anyOf: [
{
type: 'string',
maxLength: 255
},
{
type: 'null'
}
],
title: 'Description'
}
},
type: 'object',
title: 'FlavorUpdate',
description: 'Everything but the name: renaming would orphan the nodes that ask.'
} as const;
export const FlavorsPublicSchema = {
properties: {
data: {
items: {
'$ref': '#/components/schemas/FlavorPublic'
},
type: 'array',
title: 'Data'
},
count: {
type: 'integer',
title: 'Count'
}
},
type: 'object',
required: ['data', 'count'],
title: 'FlavorsPublic'
} as const;
export const FlowDef_InputSchema = {
properties: {
name: {
type: 'string',
title: 'Name'
},
title: {
type: 'string',
title: 'Title',
default: ''
},
nodes: {
items: {
'$ref': '#/components/schemas/NodeDef-Input'
},
type: 'array',
title: 'Nodes'
},
inputs: {
items: {
'$ref': '#/components/schemas/FlowInput-Input'
},
type: 'array',
title: 'Inputs'
},
version: {
type: 'integer',
title: 'Version',
default: 1
},
mode: {
type: 'string',
enum: ['live', 'batch'],
title: 'Mode',
description: 'A live flow reacts to what arrives: its subscriptions, schedules and webhooks run until it is stopped. A batch flow only runs when a run asks it to, from its inputs to its outputs, and is never activated.',
default: 'live'
},
outputs: {
items: {
type: 'string'
},
type: 'array',
title: 'Outputs',
description: 'Messages a batch run reports as its result, unqualified. Empty means every message the flow ends up holding.'
},
origin: {
anyOf: [
{
'$ref': '#/components/schemas/FlowOrigin'
},
{
type: 'null'
}
],
description: 'Set when the flow was declared in code elsewhere and uploaded by `fluksio sync`. Absent for a flow drawn on the canvas.'
}
},
type: 'object',
required: ['name'],
title: 'FlowDef',
description: 'One atomic flow.'
} as const;
export const FlowDef_OutputSchema = {
properties: {
name: {
type: 'string',
title: 'Name'
},
title: {
type: 'string',
title: 'Title',
default: ''
},
nodes: {
items: {
'$ref': '#/components/schemas/NodeDef-Output'
},
type: 'array',
title: 'Nodes'
},
inputs: {
items: {
'$ref': '#/components/schemas/FlowInput-Output'
},
type: 'array',
title: 'Inputs'
},
version: {
type: 'integer',
title: 'Version',
default: 1
},
mode: {
type: 'string',
enum: ['live', 'batch'],
title: 'Mode',
description: 'A live flow reacts to what arrives: its subscriptions, schedules and webhooks run until it is stopped. A batch flow only runs when a run asks it to, from its inputs to its outputs, and is never activated.',
default: 'live'
},
outputs: {
items: {
type: 'string'
},
type: 'array',
title: 'Outputs',
description: 'Messages a batch run reports as its result, unqualified. Empty means every message the flow ends up holding.'
},
origin: {
anyOf: [
{
'$ref': '#/components/schemas/FlowOrigin'
},
{
type: 'null'
}
],
description: 'Set when the flow was declared in code elsewhere and uploaded by `fluksio sync`. Absent for a flow drawn on the canvas.'
}
},
type: 'object',
required: ['name'],
title: 'FlowDef',
description: 'One atomic flow.'
} as const;
export const FlowDetailSchema = {
properties: {
definition: {
'$ref': '#/components/schemas/FlowDef-Output'
},
nodes: {
items: {
'$ref': '#/components/schemas/NodeStatusPublic'
},
type: 'array',
title: 'Nodes',
default: []
},
issues: {
items: {
'$ref': '#/components/schemas/ValidationIssue'
},
type: 'array',
title: 'Issues',
default: []
},
has_draft: {
type: 'boolean',
title: 'Has Draft',
default: false
},
enabled: {
type: 'boolean',
title: 'Enabled',
default: true
},
paused: {
type: 'boolean',
title: 'Paused',
default: false
},
endpoints: {
items: {
'$ref': '#/components/schemas/Endpoint'
},
type: 'array',
title: 'Endpoints',
default: []
}
},
type: 'object',
required: ['definition'],
title: 'FlowDetail',
description: `A flow plus how it is currently doing.
\`\`definition\`\` is the working copy — the unpublished draft when there is
one — because that is what the editor shows. \`\`nodes\`\` reports the
published flow, which is what is actually running.`
} as const;
export const FlowInput_InputSchema = {
properties: {
spec: {
'$ref': '#/components/schemas/MessageSpec'
},
initial: {
anyOf: [
{},
{
type: 'null'
}
],
title: 'Initial'
}
},
type: 'object',
required: ['spec'],
title: 'FlowInput',
description: 'A message the flow starts with rather than computes.'
} as const;
export const FlowInput_OutputSchema = {
properties: {
spec: {
'$ref': '#/components/schemas/MessageSpec'
},
initial: {
anyOf: [
{},
{
type: 'null'
}
],
title: 'Initial'
}
},
type: 'object',
required: ['spec'],
title: 'FlowInput',
description: 'A message the flow starts with rather than computes.'
} as const;
export const FlowOriginSchema = {
properties: {
kind: {
type: 'string',
const: 'python',
title: 'Kind',
default: 'python'
},
repo: {
type: 'string',
title: 'Repo',
default: ''
},
commit: {
type: 'string',
title: 'Commit',
default: ''
},
dirty: {
type: 'boolean',
title: 'Dirty',
default: false
},
declared_in: {
type: 'string',
title: 'Declared In',
default: ''
},
module: {
type: 'string',
title: 'Module',
default: ''
}
},
type: 'object',
title: 'FlowOrigin',
description: `Where a flow was declared, when that was somewhere other than here.
A flow drawn on the canvas has no origin: the store is where it lives. One
stamped with this was declared with the decorators in somebody's own
repository and put here by \`\`fluksio sync\`\`, so the node bodies below it
are generated imports and the code they run is versioned twice — once here
and once there. Its presence is what makes a flow code-defined.
Deliberately no timestamp. The store commits every change it is given, so
when a flow was last synced is a fact its own history already holds — and
one that would otherwise change on every sync, making an unchanged upload
look like a new version of the flow.`
} as const;
export const FlowRollupSchema = {
properties: {
flow: {
type: 'string',
title: 'Flow'
},
executions: {
type: 'integer',
title: 'Executions'
},
errors: {
type: 'integer',
title: 'Errors'
},
messages: {
type: 'integer',
title: 'Messages'
},
avg_ms: {
type: 'number',
title: 'Avg Ms'
},
avg_lag_ms: {
type: 'number',
title: 'Avg Lag Ms'
},
spark: {
items: {
type: 'integer'
},
type: 'array',
title: 'Spark'
},
last_error_ts: {
anyOf: [
{
type: 'number'
},
{
type: 'null'
}
],
title: 'Last Error Ts'
}
},
type: 'object',
required: ['flow', 'executions', 'errors', 'messages', 'avg_ms', 'avg_lag_ms', 'spark'],
title: 'FlowRollup'
} as const;
export const FlowRunsRowSchema = {
properties: {
flow: {
type: 'string',
title: 'Flow'
},
runs: {
type: 'integer',
title: 'Runs'
},
running: {
type: 'integer',
title: 'Running'
},
queued: {
type: 'integer',
title: 'Queued'
},
last_created_at: {
title: 'Last Created At'
}
},
type: 'object',
required: ['flow', 'runs', 'running', 'queued'],
title: 'FlowRunsRow',
description: "How much a flow has been run, for the screen's list of flows."
} as const;
export const FlowStatePublicSchema = {
properties: {
values: {
additionalProperties: {
'$ref': '#/components/schemas/fluksio__flow__schemas__MessageValue'
},
type: 'object',
title: 'Values'
},
nodes: {
items: {
'$ref': '#/components/schemas/NodeStatusPublic'
},
type: 'array',
title: 'Nodes'
}
},
type: 'object',
title: 'FlowStatePublic'
} as const;
export const FlowSummarySchema = {
properties: {
name: {
type: 'string',
title: 'Name'
},
title: {
type: 'string',
title: 'Title',
default: ''
},
mode: {
type: 'string',
enum: ['live', 'batch'],
title: 'Mode',
default: 'live'
},
node_count: {
type: 'integer',
title: 'Node Count',
default: 0
},
error_count: {
type: 'integer',
title: 'Error Count',
default: 0
},
has_draft: {
type: 'boolean',
title: 'Has Draft',
default: false
},
enabled: {
type: 'boolean',
title: 'Enabled',
default: true
},
paused: {
type: 'boolean',
title: 'Paused',
default: false
},
quarantined: {
type: 'boolean',
title: 'Quarantined',
default: false
},
version: {
type: 'integer',
title: 'Version',
default: 1
},
updated_at: {
anyOf: [
{
type: 'string',
format: 'date-time'
},
{
type: 'null'
}
],
title: 'Updated At'
}
},
type: 'object',
required: ['name'],
title: 'FlowSummary'
} as const;
export const FlowsPublicSchema = {
properties: {
data: {
items: {
'$ref': '#/components/schemas/FlowSummary'
},
type: 'array',
title: 'Data'
},
count: {
type: 'integer',
title: 'Count'
}
},
type: 'object',
required: ['data', 'count'],
title: 'FlowsPublic'
} as const;
export const HTTPValidationErrorSchema = {
properties: {
detail: {
items: {
'$ref': '#/components/schemas/ValidationError'
},
type: 'array',
title: 'Detail'
}
},
type: 'object',
title: 'HTTPValidationError'
} as const;
export const HealthSummarySchema = {
properties: {
status: {
type: 'string',
title: 'Status'
},
problems: {
items: {
type: 'string'
},
type: 'array',
title: 'Problems'
},
flows: {
additionalProperties: {
type: 'integer'
},
type: 'object',
title: 'Flows'
},
nodes: {
additionalProperties: {
type: 'integer'
},
type: 'object',
title: 'Nodes'
},
queue: {
additionalProperties: true,
type: 'object',
title: 'Queue'
},
loop_lag: {
additionalProperties: {
type: 'number'
},
type: 'object',
title: 'Loop Lag'
},
version: {
type: 'string',
title: 'Version',
default: ''
}
},
type: 'object',
required: ['status', 'problems', 'flows', 'nodes', 'queue', 'loop_lag'],
title: 'HealthSummary'
} as const;
export const HistoryPointSchema = {
properties: {
ts: {
type: 'number',
title: 'Ts'
},
value: {
type: 'number',
title: 'Value'
}
},
type: 'object',
required: ['ts', 'value'],
title: 'HistoryPoint',
description: 'One numeric value a message carried, and when.'
} as const;
export const ImportArtifactSchema = {
properties: {
name: {
type: 'string',
maxLength: 255,
minLength: 1,
title: 'Name'
},
filename: {
anyOf: [
{
type: 'string',
maxLength: 255
},
{
type: 'null'
}
],
title: 'Filename'
},
media_type: {
type: 'string',
maxLength: 128,
title: 'Media Type',
default: 'application/octet-stream'
},
content_base64: {
type: 'string',
title: 'Content Base64'
}
},
type: 'object',
required: ['name', 'content_base64'],
title: 'ImportArtifact'
} as const;
export const ImportCreateSchema = {
properties: {
runs: {
items: {
'$ref': '#/components/schemas/ImportEntry'
},
type: 'array',
title: 'Runs'
}
},
type: 'object',
title: 'ImportCreate'
} as const;
export const ImportEntrySchema = {
properties: {
flow: {
type: 'string',
title: 'Flow'
},
external_id: {
type: 'string',
maxLength: 255,
minLength: 1,
title: 'External Id'
},
params: {
additionalProperties: true,
type: 'object',
title: 'Params'
},
seed: {
anyOf: [
{
type: 'integer'
},
{
type: 'null'
}
],
title: 'Seed'
},
status: {
type: 'string',
enum: ['ok', 'error', 'cancelled'],
title: 'Status',
default: 'ok'
},
created_at: {
type: 'string',
format: 'date-time',
title: 'Created At'
},
started_at: {
anyOf: [
{
type: 'string',
format: 'date-time'
},
{
type: 'null'
}
],
title: 'Started At'
},
finished_at: {
anyOf: [
{
type: 'string',
format: 'date-time'
},
{
type: 'null'
}
],
title: 'Finished At'
},
result: {
additionalProperties: true,
type: 'object',
title: 'Result'
},
metrics: {
items: {
'$ref': '#/components/schemas/ImportMetric'
},
type: 'array',
title: 'Metrics'
},
artifacts: {
items: {
'$ref': '#/components/schemas/ImportArtifact'
},
type: 'array',
title: 'Artifacts'
},
labels: {
items: {
type: 'string'
},
type: 'array',
title: 'Labels'
},
group_id: {
anyOf: [
{
type: 'string',
maxLength: 64
},
{
type: 'null'
}
],
title: 'Group Id'
}
},
type: 'object',
required: ['flow', 'external_id', 'created_at'],
title: 'ImportEntry',
description: 'One run executed somewhere else, as it ended there.'
} as const;
export const ImportMetricSchema = {
properties: {
name: {
type: 'string',
maxLength: 128,
minLength: 1,
title: 'Name'
},
step: {
type: 'integer',
title: 'Step',
default: -1
},
ts: {
type: 'number',
title: 'Ts',
default: 0
},
value: {
type: 'number',
title: 'Value'
}
},
type: 'object',
required: ['name', 'value'],
title: 'ImportMetric'
} as const;
export const ImportedSchema = {
properties: {
external_id: {
type: 'string',
title: 'External Id'
},
id: {
type: 'string',
title: 'Id'
},
created: {
type: 'boolean',
title: 'Created'
}
},
type: 'object',
required: ['external_id', 'id', 'created'],
title: 'Imported'
} as const;
export const LibraryNodeSchema = {
properties: {
name: {
type: 'string',
title: 'Name'
},
used_by: {
items: {
type: 'string'
},
type: 'array',
title: 'Used By'
}
},
type: 'object',
required: ['name'],
title: 'LibraryNode',
description: 'A node source shared across flows, and who is using it.'
} as const;
export const MessageSchema = {
properties: {
message: {
type: 'string',
title: 'Message'
}
},
type: 'object',
required: ['message'],
title: 'Message'
} as const;
export const MessageHistorySchema = {
properties: {
message: {
type: 'string',
title: 'Message'
},
numeric: {
type: 'boolean',
title: 'Numeric',
default: false
},
points: {
items: {
'$ref': '#/components/schemas/HistoryPoint'
},
type: 'array',
title: 'Points'
}
},
type: 'object',
required: ['message'],
title: 'MessageHistory',
description: `A message's recent numeric values, oldest first.
Only numbers are recorded, so \`\`numeric\`\` tells the panel whether an empty
series means "nothing plottable here" or "nothing has arrived yet".`
} as const;
export const MessageInfoSchema = {
properties: {
name: {
type: 'string',
title: 'Name'
},
flow: {
type: 'string',
title: 'Flow'
},
dtype: {
type: 'string',
title: 'Dtype'
},
providers: {
items: {
type: 'string'
},
type: 'array',
title: 'Providers',
default: []
},
writable: {
type: 'boolean',
title: 'Writable',
default: true
},
numeric: {
type: 'boolean',
title: 'Numeric',
default: false
},
value: {
title: 'Value'
},
ts: {
anyOf: [
{
type: 'number'
},
{
type: 'null'
}
],
title: 'Ts'
}
},
type: 'object',
required: ['name', 'flow', 'dtype'],
title: 'MessageInfo',
description: 'One message, as something to bind a widget to.'
} as const;
export const MessagePointsSchema = {
properties: {
message: {
type: 'string',
title: 'Message'
},
numeric: {
type: 'boolean',
title: 'Numeric'
},
points: {
items: {
additionalProperties: {
type: 'number'
},
type: 'object'
},
type: 'array',
title: 'Points'
}
},
type: 'object',
required: ['message', 'numeric', 'points'],
title: 'MessagePoints'
} as const;
export const MessageSpecSchema = {
properties: {
name: {
type: 'string',
title: 'Name',
default: ''
},
port: {
type: 'string',
title: 'Port',
default: ''
},
dtype: {
'$ref': '#/components/schemas/DType',
default: 'float'
},
item: {
anyOf: [
{
'$ref': '#/components/schemas/DType'
},
{
type: 'null'
}
]
},
interval: {
type: 'number',
minimum: 0,
title: 'Interval',
default: 0
},
trigger: {
type: 'boolean',
title: 'Trigger',
default: true
},
stream: {
type: 'boolean',
title: 'Stream',
default: false
}
},
type: 'object',
title: 'MessageSpec',
description: `A single port of a node, and the message it is bound to.
:param name: The message this port binds to. Bare names are qualified with
the flow name at load time; empty means the port is unbound.
:param port: The identifier the node function sees. Defaults to the last
segment of \`\`name\`\`, so unqualified flows read naturally.
:param dtype: Payload type, validated on every message that passes through.
:param item: The type of each item of a \`\`list\`\` port, ignored otherwise.
Unset means \`\`record\`\`, which is what the agenda and forecast widgets
read; \`\`float\`\` is the numeric list a pipeline passes around. A list of
lists, or of series, is refused — one declared level is the point.
:param interval: Deliver at most every this many seconds; 0 is every time.
On an output it holds back publishing, on an input it holds back waking
the node. The value is never lost — state keeps the latest — only the
delivery is skipped.
:param trigger: Whether arriving values wake the node. An input with this
off is read when the node runs for some other reason, but never causes
a run and never makes the node wait — which is how a node reads a
message it also produces without depending on itself.
:param stream: On an output, that this port produces repeatedly *during* one
execution rather than once at the end — a training loss, a progress
fraction. A node emits on it by being a generator and yielding, or by
calling \`\`fluksio.emit\`\`. What it means downstream is nothing special:
a value published mid-execution is a value like any other. What it
means to a run is that the whole series is kept, which is how a run's
metrics are simply its streaming outputs rather than something logged
beside them.`
} as const;
export const MessagesPublicSchema = {
properties: {
data: {
items: {
'$ref': '#/components/schemas/MessageInfo'
},
type: 'array',
title: 'Data'
},
count: {
type: 'integer',
title: 'Count'
}
},
type: 'object',
required: ['data', 'count'],
title: 'MessagesPublic'
} as const;
export const MetricPointSchema = {
properties: {
step: {
type: 'integer',
title: 'Step'
},
ts: {
type: 'number',
title: 'Ts'
},
value: {
type: 'number',
title: 'Value'
},
name: {
type: 'string',
title: 'Name',
default: ''
}
},
type: 'object',
required: ['step', 'ts', 'value'],
title: 'MetricPoint'
} as const;
export const MetricSeriesSchema = {
properties: {
label: {
type: 'string',
title: 'Label'
},
points: {
items: {
items: {
type: 'number'
},
type: 'array'
},
type: 'array',
title: 'Points'
}
},
type: 'object',
required: ['label'],
title: 'MetricSeries',
description: 'The shape a chart widget already draws, so comparing runs is a binding.'
} as const;
export const ModulePackageSchema = {
properties: {
name: {
type: 'string',
title: 'Name'
},
version: {
type: 'string',
title: 'Version'
}
},
type: 'object',
required: ['name', 'version'],
title: 'ModulePackage',
description: 'One package installed in the venv node code runs on.'
} as const;
export const ModulesInfoSchema = {
properties: {
python_version: {
type: 'string',
title: 'Python Version',
default: ''
},
venv_path: {
type: 'string',
title: 'Venv Path',
default: ''
},
requirements: {
type: 'string',
title: 'Requirements',
default: ''
},
packages: {
items: {
'$ref': '#/components/schemas/ModulePackage'
},
type: 'array',
title: 'Packages'
},
applied: {
type: 'boolean',
title: 'Applied',
default: false
},
adopted: {
type: 'boolean',
title: 'Adopted',
default: false
}
},
type: 'object',
title: 'ModulesInfo',
description: 'The venv node code imports from, and the manifest that describes it.'
} as const;
export const NewPasswordSchema = {
properties: {
token: {
type: 'string',
title: 'Token'
},
new_password: {
type: 'string',
maxLength: 128,
minLength: 8,
title: 'New Password'
}
},
type: 'object',
required: ['token', 'new_password'],
title: 'NewPassword'
} as const;
export const NodeDef_InputSchema = {
properties: {
id: {
type: 'string',
title: 'Id'
},
type: {
type: 'string',
title: 'Type',
default: 'python'
},
title: {
type: 'string',
title: 'Title',
default: ''
},
params: {
additionalProperties: true,
type: 'object',
title: 'Params'
},
requires: {
items: {
'$ref': '#/components/schemas/MessageSpec'
},
type: 'array',
title: 'Requires'
},
provides: {
items: {
'$ref': '#/components/schemas/MessageSpec'
},
type: 'array',
title: 'Provides'
},
source_ref: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Source Ref'
},
timeout: {
anyOf: [
{
type: 'number',
minimum: 0
},
{
type: 'null'
}
],
title: 'Timeout',
description: "Seconds this node's code may be silent before it is stopped. A yield or an emit resets the clock, and the first call's imports are not charged to it. 0 disables the limit: the node runs until it finishes, and only a dead worker fails the call. Empty inherits the engine default."
},
device: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Device',
description: "Label of the worker this node's code must run on, such as 'gpu'. Empty means the engine's own workers. A run needing a label no attached worker carries waits rather than failing."
},
device_policy: {
type: 'string',
enum: ['require', 'prefer'],
title: 'Device Policy',
description: 'What to do when no worker carries `device`: wait for one, or run locally anyway.',
default: 'require'
},
cache: {
type: 'boolean',
title: 'Cache',
description: 'Whether a batch run may reuse an earlier execution of this node with the same source, settings and inputs. Turn it off for a function whose answer can change on its own.',
default: true
},
resources: {
anyOf: [
{
'$ref': '#/components/schemas/Resources'
},
{
type: 'null'
}
],
description: "What one execution of this node holds while it runs. Absent — the default — means it is not accounted for and shares the engine's workers, which is right for everything that is not compute-heavy."
},
code_files: {
additionalProperties: {
type: 'string'
},
type: 'object',
title: 'Code Files',
description: "The project modules this node's function reaches, dotted name to the file on the machine that synced it. Written by `fluksio sync`, which is the only side that can import the code and see what it imports. Empty for a node drawn on the canvas."
},
code_digest: {
type: 'string',
title: 'Code Digest',
description: 'What those modules hashed to at sync. The engine hashes them again when a run is claimed, and falls back to this when it cannot see the files — a worker on another machine.',
default: ''
}
},
type: 'object',
required: ['id'],
title: 'NodeDef',
description: `A node as stored: identity, configuration and ports.
Deliberately no canvas position. The editor lays a flow out itself, so
where a node sits is a fact about the drawing rather than about the flow —
and a graph nobody can arrange is one worth keeping small.`
} as const;
export const NodeDef_OutputSchema = {
properties: {
id: {
type: 'string',
title: 'Id'
},
type: {
type: 'string',
title: 'Type',
default: 'python'
},
title: {
type: 'string',
title: 'Title',
default: ''
},
params: {
additionalProperties: true,
type: 'object',
title: 'Params'
},
requires: {
items: {
'$ref': '#/components/schemas/MessageSpec'
},
type: 'array',
title: 'Requires'
},
provides: {
items: {
'$ref': '#/components/schemas/MessageSpec'
},
type: 'array',
title: 'Provides'
},
source_ref: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Source Ref'
},
timeout: {
anyOf: [
{
type: 'number',
minimum: 0
},
{
type: 'null'
}
],
title: 'Timeout',
description: "Seconds this node's code may be silent before it is stopped. A yield or an emit resets the clock, and the first call's imports are not charged to it. 0 disables the limit: the node runs until it finishes, and only a dead worker fails the call. Empty inherits the engine default."
},
device: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Device',
description: "Label of the worker this node's code must run on, such as 'gpu'. Empty means the engine's own workers. A run needing a label no attached worker carries waits rather than failing."
},
device_policy: {
type: 'string',
enum: ['require', 'prefer'],
title: 'Device Policy',
description: 'What to do when no worker carries `device`: wait for one, or run locally anyway.',
default: 'require'
},
cache: {
type: 'boolean',
title: 'Cache',
description: 'Whether a batch run may reuse an earlier execution of this node with the same source, settings and inputs. Turn it off for a function whose answer can change on its own.',
default: true
},
resources: {
anyOf: [
{
'$ref': '#/components/schemas/Resources'
},
{
type: 'null'
}
],
description: "What one execution of this node holds while it runs. Absent — the default — means it is not accounted for and shares the engine's workers, which is right for everything that is not compute-heavy."
},
code_files: {
additionalProperties: {
type: 'string'
},
type: 'object',
title: 'Code Files',
description: "The project modules this node's function reaches, dotted name to the file on the machine that synced it. Written by `fluksio sync`, which is the only side that can import the code and see what it imports. Empty for a node drawn on the canvas."
},
code_digest: {
type: 'string',
title: 'Code Digest',
description: 'What those modules hashed to at sync. The engine hashes them again when a run is claimed, and falls back to this when it cannot see the files — a worker on another machine.',
default: ''
}
},
type: 'object',
required: ['id'],
title: 'NodeDef',
description: `A node as stored: identity, configuration and ports.
Deliberately no canvas position. The editor lays a flow out itself, so
where a node sits is a fact about the drawing rather than about the flow —
and a graph nobody can arrange is one worth keeping small.`
} as const;
export const NodeSourceSchema = {
properties: {
code: {
type: 'string',
title: 'Code'
},
missing: {
type: 'boolean',
title: 'Missing',
default: false
}
},
type: 'object',
required: ['code'],
title: 'NodeSource',
description: 'The Python source of a node.'
} as const;
export const NodeStatusPublicSchema = {
properties: {
id: {
type: 'string',
title: 'Id'
},
status: {
type: 'string',
title: 'Status',
default: 'active'
},
error: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Error'
},
health: {
type: 'string',
enum: ['ok', 'degraded', 'down'],
title: 'Health',
default: 'ok'
},
health_detail: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Health Detail'
},
last_error: {
type: 'string',
title: 'Last Error',
default: ''
},
last_error_ts: {
anyOf: [
{
type: 'number'
},
{
type: 'null'
}
],
title: 'Last Error Ts'
}
},
type: 'object',
required: ['id'],
title: 'NodeStatusPublic',
description: 'Whether a node loaded, and how its connection is doing.'
} as const;
export const NodeTypeInfoSchema = {
properties: {
type: {
type: 'string',
title: 'Type'
},
title: {
type: 'string',
title: 'Title'
},
description: {
type: 'string',
title: 'Description'
},
params_schema: {
additionalProperties: true,
type: 'object',
title: 'Params Schema'
},
has_source: {
type: 'boolean',
title: 'Has Source',
default: false
},
runs_code: {
type: 'boolean',
title: 'Runs Code',
default: false
},
free_params: {
type: 'boolean',
title: 'Free Params',
default: false
},
plugin: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Plugin'
}
},
type: 'object',
required: ['type', 'title', 'description'],
title: 'NodeTypeInfo',
description: 'A node type the editor can offer, with its parameter schema.'
} as const;
export const OAuthAuthorizeInfoSchema = {
properties: {
client_name: {
type: 'string',
title: 'Client Name'
},
redirect_uri: {
type: 'string',
title: 'Redirect Uri'
},
scope: {
type: 'string',
title: 'Scope'
}
},
type: 'object',
required: ['client_name', 'redirect_uri', 'scope'],
title: 'OAuthAuthorizeInfo',
description: 'What the consent page shows, all of it validated server-side.'
} as const;
export const OAuthAuthorizeRequestSchema = {
properties: {
client_id: {
type: 'string',
title: 'Client Id'
},
redirect_uri: {
type: 'string',
title: 'Redirect Uri'
},
code_challenge: {
type: 'string',
title: 'Code Challenge'
},
code_challenge_method: {
type: 'string',
title: 'Code Challenge Method',
default: 'S256'
},
state: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'State'
},
resource: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Resource'
},
scope: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Scope'
}
},
type: 'object',
required: ['client_id', 'redirect_uri', 'code_challenge'],
title: 'OAuthAuthorizeRequest'
} as const;
export const OAuthAuthorizeResponseSchema = {
properties: {
redirect_url: {
type: 'string',
title: 'Redirect Url'
}
},
type: 'object',
required: ['redirect_url'],
title: 'OAuthAuthorizeResponse'
} as const;
export const OAuthClientRegisterSchema = {
properties: {
client_name: {
type: 'string',
maxLength: 128,
title: 'Client Name',
default: 'MCP client'
},
redirect_uris: {
items: {
type: 'string'
},
type: 'array',
title: 'Redirect Uris'
},
grant_types: {
anyOf: [
{
items: {
type: 'string'
},
type: 'array'
},
{
type: 'null'
}
],
title: 'Grant Types'
},
response_types: {
anyOf: [
{
items: {
type: 'string'
},
type: 'array'
},
{
type: 'null'
}
],
title: 'Response Types'
},
token_endpoint_auth_method: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Token Endpoint Auth Method'
}
},
type: 'object',
required: ['redirect_uris'],
title: 'OAuthClientRegister',
description: 'RFC 7591 dynamic client registration request.'
} as const;
export const PairRequestSchema = {
properties: {
code: {
type: 'string',
title: 'Code'
}
},
type: 'object',
required: ['code'],
title: 'PairRequest'
} as const;
export const PairStartedSchema = {
properties: {
code: {
type: 'string',
title: 'Code'
},
secret: {
type: 'string',
title: 'Secret'
},
expires_in: {
type: 'integer',
title: 'Expires In',
default: 600
}
},
type: 'object',
required: ['code', 'secret'],
title: 'PairStarted',
description: 'What the device puts on the wall, and what it polls with.'
} as const;
export const PairStatusSchema = {
properties: {
access_token: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Access Token'
},
panel: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Panel'
}
},
type: 'object',
title: 'PairStatus',
description: 'Nothing yet, or the credential and the panel it is for.'
} as const;
export const PanelDefSchema = {
properties: {
id: {
type: 'string',
title: 'Id'
},
title: {
type: 'string',
title: 'Title',
default: ''
},
dashboards: {
items: {
type: 'string'
},
type: 'array',
title: 'Dashboards'
},
touch: {
type: 'boolean',
title: 'Touch',
default: false
},
nonce: {
type: 'integer',
title: 'Nonce',
default: 0
}
},
type: 'object',
required: ['id'],
title: 'PanelDef',
description: 'One device, and what it shows.'
} as const;
export const PanelsConfigSchema = {
properties: {
panels: {
items: {
'$ref': '#/components/schemas/PanelDef'
},
type: 'array',
title: 'Panels'
}
},
type: 'object',
title: 'PanelsConfig',
description: 'Every panel this instance knows about.'
} as const;
export const PanelsPublicSchema = {
properties: {
panels: {
items: {
'$ref': '#/components/schemas/PanelDef'
},
type: 'array',
title: 'Panels'
},
frontend_host: {
type: 'string',
title: 'Frontend Host',
default: ''
}
},
type: 'object',
title: 'PanelsPublic',
description: `The panels, and the address a device should be pointed at.
The address is the server's own, because the browser's origin is not a
reliable answer to it: an admin working through the portal is on the
portal's origin, and this one is for a screen on this network.
An instance enrolled with a portal has a second address, built by the
dialog from what \`\`/cloud/status\`\` reports rather than from here — a panel
is not the thing that knows whether remote access is on.`
} as const;
export const PendingDeviceSchema = {
properties: {
device: {
type: 'string',
title: 'Device'
},
remote: {
type: 'boolean',
title: 'Remote',
default: false
}
},
type: 'object',
required: ['device'],
title: 'PendingDevice',
description: 'Who is asking, as far as the request itself says.'
} as const;
export const PlacementSchema = {
properties: {
x: {
type: 'integer',
title: 'X',
default: 0
},
y: {
type: 'integer',
title: 'Y',
default: 0
},
w: {
type: 'integer',
title: 'W',
default: 3
},
h: {
type: 'integer',
title: 'H',
default: 2
}
},
type: 'object',
title: 'Placement',
description: "Where a widget sits in its section's grid, in grid units."
} as const;
export const PrivateUserCreateSchema = {
properties: {
email: {
type: 'string',
title: 'Email'
},
password: {
type: 'string',
title: 'Password'
},
full_name: {
type: 'string',
title: 'Full Name'
},
is_verified: {
type: 'boolean',
title: 'Is Verified',
default: false
}
},
type: 'object',
required: ['email', 'password', 'full_name'],
title: 'PrivateUserCreate'
} as const;
export const PublicConfigSchema = {
properties: {
signup_enabled: {
type: 'boolean',
title: 'Signup Enabled'
}
},
type: 'object',
required: ['signup_enabled'],
title: 'PublicConfig',
description: 'What a browser needs to know about this instance before signing in.'
} as const;
export const RegisteredClientSchema = {
properties: {
id: {
type: 'string',
format: 'uuid',
title: 'Id'
},
client_name: {
type: 'string',
title: 'Client Name'
},
redirect_uris: {
items: {
type: 'string'
},
type: 'array',
title: 'Redirect Uris'
},
created_at: {
type: 'string',
format: 'date-time',
title: 'Created At'
},
active_tokens: {
type: 'integer',
title: 'Active Tokens'
},
last_authorized_at: {
anyOf: [
{
type: 'string',
format: 'date-time'
},
{
type: 'null'
}
],
title: 'Last Authorized At'
}
},
type: 'object',
required: ['id', 'client_name', 'redirect_uris', 'created_at', 'active_tokens', 'last_authorized_at'],
title: 'RegisteredClient',
description: 'A registered agent, and whether anyone actually let it in.'
} as const;
export const RegisteredClientsSchema = {
properties: {
data: {
items: {
'$ref': '#/components/schemas/RegisteredClient'
},
type: 'array',
title: 'Data'
},
count: {
type: 'integer',
title: 'Count'
}
},
type: 'object',
required: ['data', 'count'],
title: 'RegisteredClients'
} as const;
export const RemoteUserBodySchema = {
properties: {
code: {
type: 'string',
maxLength: 32,
minLength: 1,
title: 'Code'
}
},
type: 'object',
required: ['code'],
title: 'RemoteUserBody'
} as const;
export const ResourceLevelSchema = {
properties: {
total: {
type: 'integer',
title: 'Total'
},
free: {
type: 'integer',
title: 'Free'
}
},
type: 'object',
required: ['total', 'free'],
title: 'ResourceLevel'
} as const;
export const ResourcesSchema = {
properties: {
cpus: {
type: 'integer',
minimum: 1,
title: 'Cpus',
description: 'Cores held for the whole execution. Also what the thread-pool variables are set to, so a library sizing itself to the machine sizes itself to this instead.',
default: 1
},
gpus: {
type: 'integer',
minimum: 0,
title: 'Gpus',
description: 'Whole devices held for the whole execution, named to the node through CUDA_VISIBLE_DEVICES. Nothing else is given them while it runs, which is what keeps two preallocating processes apart.',
default: 0
},
ram: {
anyOf: [
{
type: 'integer',
minimum: 1
},
{
type: 'null'
}
],
title: 'Ram',
description: "Megabytes held for the whole execution; accepts '512M' or '2G'. Counted against machines that said how much they have, and ignored by those that did not — which is a machine with nothing to say about memory, not one with none."
},
flavor: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Flavor',
description: 'A stored size by name, standing in for cpus, gpus and ram. Read again every time the node is built, so editing the flavor edits what the next run gets.'
},
duration_s: {
anyOf: [
{
type: 'integer',
minimum: 1
},
{
type: 'null'
}
],
title: 'Duration S',
description: "How long one execution is expected to take; accepts '30m' or '2h'. A statement about the node for whoever is planning around it, not a limit — the limit is `timeout`."
},
env: {
additionalProperties: {
type: 'string'
},
type: 'object',
title: 'Env',
description: "Extra environment for the worker this node runs in, applied over what the allocation derives. Where a library's own tuning goes — XLA_FLAGS, XLA_PYTHON_CLIENT_MEM_FRACTION — since those are composed strings the engine must not invent."
}
},
additionalProperties: false,
type: 'object',
title: 'Resources',
description: `What one execution of a node needs to have to itself.
Declaring nothing is the default and means what it always did: the node
runs on the shared worker pool and nothing is accounted for it. That is
right for the kind of node most flows are made of — a poll, a threshold, a
message on its way somewhere.
It is wrong for the other kind. A numerical library sizes its thread pool
to every core it can see, so a handful of them at once oversubscribe the
machine badly enough to starve the engine's own event loop, and a GPU
library that preallocates most of the card deadlocks when a second one
arrives. Both are a node saying how much of the machine it takes, which is
what this is.`
} as const;
export const ResourcesSnapshotSchema = {
properties: {
cpus: {
'$ref': '#/components/schemas/ResourceLevel'
},
gpus: {
'$ref': '#/components/schemas/ResourceLevel'
},
waiting: {
items: {
'$ref': '#/components/schemas/WaitingNode'
},
type: 'array',
title: 'Waiting'
},
targets: {
items: {
'$ref': '#/components/schemas/TargetResources'
},
type: 'array',
title: 'Targets'
},
provisioners: {
items: {
additionalProperties: true,
type: 'object'
},
type: 'array',
title: 'Provisioners'
}
},
type: 'object',
required: ['cpus', 'gpus'],
title: 'ResourcesSnapshot'
} as const;
export const RuleSchema = {
properties: {
events: {
items: {
type: 'string'
},
type: 'array',
title: 'Events'
},
channels: {
items: {
type: 'string'
},
type: 'array',
title: 'Channels'
},
cooldown_s: {
type: 'number',
title: 'Cooldown S',
default: 900
}
},
type: 'object',
title: 'Rule',
description: 'Which events go to which channels.'
} as const;
export const RunCreateSchema = {
properties: {
params: {
additionalProperties: true,
type: 'object',
title: 'Params'
},
seed: {
anyOf: [
{
type: 'integer'
},
{
type: 'null'
}
],
title: 'Seed'
},
draft: {
type: 'boolean',
title: 'Draft',
default: false
},
no_cache: {
type: 'boolean',
title: 'No Cache',
default: false
},
cause: {
type: 'string',
enum: ['api', 'cli', 'sdk'],
title: 'Cause',
default: 'api'
},
idempotency_key: {
anyOf: [
{
type: 'string',
maxLength: 64
},
{
type: 'null'
}
],
title: 'Idempotency Key'
}
},
type: 'object',
title: 'RunCreate'
} as const;
export const RunDetailSchema = {
properties: {
id: {
type: 'string',
title: 'Id'
},
flow: {
type: 'string',
title: 'Flow'
},
status: {
type: 'string',
title: 'Status'
},
status_reason: {
type: 'string',
title: 'Status Reason'
},
cause: {
type: 'string',
title: 'Cause'
},
params: {
additionalProperties: true,
type: 'object',
title: 'Params'
},
passed: {
anyOf: [
{
items: {
type: 'string'
},
type: 'array'
},
{
type: 'null'
}
],
title: 'Passed'
},
params_digest: {
type: 'string',
title: 'Params Digest'
},
origin_commit: {
type: 'string',
title: 'Origin Commit',
default: ''
},
code_digest: {
type: 'string',
title: 'Code Digest',
default: ''
},
commit: {
type: 'string',
title: 'Commit',
default: ''
},
external_id: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'External Id'
},
seed: {
anyOf: [
{
type: 'integer'
},
{
type: 'null'
}
],
title: 'Seed'
},
group_id: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Group Id'
},
draft: {
type: 'boolean',
title: 'Draft',
default: false
},
labels: {
items: {
type: 'string'
},
type: 'array',
title: 'Labels'
},
created_at: {
title: 'Created At'
},
started_at: {
title: 'Started At'
},
finished_at: {
title: 'Finished At'
},
duration_ms: {
type: 'number',
title: 'Duration Ms'
},
actor: {
type: 'string',
title: 'Actor'
},
result: {
additionalProperties: true,
type: 'object',
title: 'Result'
},
flow_version: {
type: 'integer',
title: 'Flow Version',
default: 1
},
nodes: {
items: {
'$ref': '#/components/schemas/RunNodeRow'
},
type: 'array',
title: 'Nodes'
},
artifacts: {
items: {
'$ref': '#/components/schemas/ArtifactRow'
},
type: 'array',
title: 'Artifacts'
}
},
type: 'object',
required: ['id', 'flow', 'status', 'status_reason', 'cause', 'params', 'params_digest', 'seed', 'group_id', 'labels', 'created_at', 'duration_ms', 'actor'],
title: 'RunDetail'
} as const;
export const RunNodeRowSchema = {
properties: {
node: {
type: 'string',
title: 'Node'
},
status: {
type: 'string',
title: 'Status'
},
attempt: {
type: 'integer',
title: 'Attempt'
},
duration_ms: {
type: 'number',
title: 'Duration Ms'
},
worker: {
type: 'string',
title: 'Worker'
},
error: {
type: 'string',
title: 'Error'
},
logs: {
type: 'string',
title: 'Logs'
},
cache_key: {
type: 'string',
title: 'Cache Key',
default: ''
},
cached_from: {
type: 'string',
title: 'Cached From',
default: ''
}
},
type: 'object',
required: ['node', 'status', 'attempt', 'duration_ms', 'worker', 'error', 'logs'],
title: 'RunNodeRow'
} as const;
export const RunPageSchema = {
properties: {
data: {
items: {
'$ref': '#/components/schemas/fluksio__api__routes__observability__RunRow'
},
type: 'array',
title: 'Data'
},
count: {
type: 'integer',
title: 'Count'
}
},
type: 'object',
required: ['data', 'count'],
title: 'RunPage'
} as const;
export const RunRequestSchema = {
properties: {
inputs: {
additionalProperties: true,
type: 'object',
title: 'Inputs',
default: {}
}
},
type: 'object',
title: 'RunRequest'
} as const;
export const SearchEntrySchema = {
properties: {
category: {
type: 'string',
enum: ['flow', 'node', 'input', 'output', 'dashboard', 'widget', 'panel', 'secret', 'module', 'worker', 'alert'],
title: 'Category'
},
name: {
type: 'string',
title: 'Name'
},
title: {
type: 'string',
title: 'Title',
default: ''
},
parent: {
type: 'string',
title: 'Parent',
default: ''
},
kind: {
type: 'string',
title: 'Kind',
default: ''
}
},
type: 'object',
required: ['category', 'name'],
title: 'SearchEntry',
description: `One thing somebody might be looking for.
Deliberately not a route: where a category lands is the frontend's business,
and it already owns the router. This says what the thing is and what it is
called, which is all the matching needs.`
} as const;
export const SecretNamesSchema = {
properties: {
data: {
items: {
type: 'string'
},
type: 'array',
title: 'Data'
},
count: {
type: 'integer',
title: 'Count'
}
},
type: 'object',
required: ['data', 'count'],
title: 'SecretNames'
} as const;
export const SecretValueSchema = {
properties: {
value: {
type: 'string',
title: 'Value'
}
},
type: 'object',
required: ['value'],
title: 'SecretValue'
} as const;
export const SeriesAnswerSchema = {
properties: {
metric: {
type: 'string',
title: 'Metric'
},
x: {
type: 'string',
title: 'X',
default: 'step'
},
lines: {
items: {
'$ref': '#/components/schemas/MetricSeries'
},
type: 'array',
title: 'Lines'
}
},
type: 'object',
required: ['metric'],
title: 'SeriesAnswer'
} as const;
export const SeriesPointSchema = {
properties: {
ts: {
type: 'number',
title: 'Ts'
},
executions: {
type: 'integer',
title: 'Executions'
},
errors: {
type: 'integer',
title: 'Errors'
},
messages: {
type: 'integer',
title: 'Messages'
},
avg_ms: {
type: 'number',
title: 'Avg Ms'
},
max_ms: {
type: 'number',
title: 'Max Ms'
},
avg_lag_ms: {
type: 'number',
title: 'Avg Lag Ms'
}
},
type: 'object',
required: ['ts', 'executions', 'errors', 'messages', 'avg_ms', 'max_ms', 'avg_lag_ms'],
title: 'SeriesPoint'
} as const;
export const SettingDefSchema = {
properties: {
value: {
title: 'Value'
},
message: {
type: 'string',
title: 'Message',
default: ''
},
dtype: {
type: 'string',
title: 'Dtype',
default: ''
}
},
type: 'object',
title: 'SettingDef',
description: `One dashboard-wide setting: a value, and optionally where it comes from.
Unbound — no \`\`message\`\` — the setting is simply \`\`value\`\`, which is what
makes a panel that is always dark cost no flow at all. Bound, a flow drives
it live and \`\`value\`\` is the fallback: what the dashboard uses until
something arrives, and whenever the message is silent.
A schedule is not a third case. A node publishing to the bound message on a
cron *is* the schedule, which is the whole reason this is a channel rather
than a switching rule per setting.`
} as const;
export const ShareRequestSchema = {
properties: {
lib_name: {
type: 'string',
title: 'Lib Name'
}
},
type: 'object',
required: ['lib_name'],
title: 'ShareRequest'
} as const;
export const SocketTicketSchema = {
properties: {
ticket: {
type: 'string',
title: 'Ticket'
},
expires_in: {
type: 'number',
title: 'Expires In'
}
},
type: 'object',
required: ['ticket', 'expires_in'],
title: 'SocketTicket'
} as const;
export const StoredKeySchema = {
properties: {
key: {
type: 'string',
title: 'Key'
},
size: {
type: 'integer',
title: 'Size'
},
updated_at: {
type: 'string',
format: 'date-time',
title: 'Updated At'
}
},
type: 'object',
required: ['key', 'size', 'updated_at'],
title: 'StoredKey'
} as const;
export const SubscriptionSchema = {
properties: {
endpoint: {
type: 'string',
title: 'Endpoint'
},
keys: {
additionalProperties: {
type: 'string'
},
type: 'object',
title: 'Keys'
}
},
type: 'object',
required: ['endpoint'],
title: 'Subscription',
description: "What a browser handed us. Opaque apart from the endpoint's host."
} as const;
export const SweepCreateSchema = {
properties: {
runs: {
items: {
'$ref': '#/components/schemas/SweepEntry'
},
type: 'array',
title: 'Runs'
},
draft: {
type: 'boolean',
title: 'Draft',
default: false
},
no_cache: {
type: 'boolean',
title: 'No Cache',
default: false
}
},
type: 'object',
title: 'SweepCreate'
} as const;
export const SweepEntrySchema = {
properties: {
params: {
additionalProperties: true,
type: 'object',
title: 'Params'
},
seed: {
anyOf: [
{
type: 'integer'
},
{
type: 'null'
}
],
title: 'Seed'
},
idempotency_key: {
anyOf: [
{
type: 'string',
maxLength: 64
},
{
type: 'null'
}
],
title: 'Idempotency Key'
}
},
type: 'object',
title: 'SweepEntry'
} as const;
export const TargetResourcesSchema = {
properties: {
target: {
type: 'string',
title: 'Target'
},
cpus: {
'$ref': '#/components/schemas/ResourceLevel'
},
gpus: {
'$ref': '#/components/schemas/ResourceLevel'
},
ram_mb: {
anyOf: [
{
'$ref': '#/components/schemas/ResourceLevel'
},
{
type: 'null'
}
]
},
labels: {
items: {
type: 'string'
},
type: 'array',
title: 'Labels'
},
in_flight: {
type: 'integer',
title: 'In Flight',
default: 0
}
},
type: 'object',
required: ['target', 'cpus', 'gpus'],
title: 'TargetResources',
description: 'One machine: this engine, or a worker attached to it.'
} as const;
export const TokenSchema = {
properties: {
access_token: {
type: 'string',
title: 'Access Token'
},
token_type: {
type: 'string',
title: 'Token Type',
default: 'bearer'
}
},
type: 'object',
required: ['access_token'],
title: 'Token'
} as const;
export const TokenIssuedSchema = {
properties: {
name: {
type: 'string',
title: 'Name'
},
token: {
type: 'string',
title: 'Token'
},
jti: {
type: 'string',
title: 'Jti'
},
labels: {
items: {
type: 'string'
},
type: 'array',
title: 'Labels'
},
expires_days: {
type: 'integer',
title: 'Expires Days',
default: 365
}
},
type: 'object',
required: ['name', 'token', 'jti'],
title: 'TokenIssued'
} as const;
export const TokenRequestSchema = {
properties: {
name: {
type: 'string',
maxLength: 255,
minLength: 1,
title: 'Name'
},
labels: {
items: {
type: 'string'
},
type: 'array',
title: 'Labels'
}
},
type: 'object',
required: ['name'],
title: 'TokenRequest'
} as const;
export const TriggerRequestSchema = {
properties: {
values: {
additionalProperties: true,
type: 'object',
title: 'Values',
default: {}
}
},
type: 'object',
title: 'TriggerRequest'
} as const;
export const TurnBodySchema = {
properties: {
message: {
type: 'string',
maxLength: 20000,
minLength: 1,
title: 'Message'
},
flow: {
anyOf: [
{
type: 'string',
pattern: '^[a-z][a-z0-9_]*$'
},
{
type: 'null'
}
],
title: 'Flow'
}
},
type: 'object',
required: ['message'],
title: 'TurnBody'
} as const;
export const UnsubscribeSchema = {
properties: {
endpoint: {
type: 'string',
title: 'Endpoint'
}
},
type: 'object',
required: ['endpoint'],
title: 'Unsubscribe'
} as const;
export const UpdatePasswordSchema = {
properties: {
current_password: {
type: 'string',
maxLength: 128,
minLength: 8,
title: 'Current Password'
},
new_password: {
type: 'string',
maxLength: 128,
minLength: 8,
title: 'New Password'
}
},
type: 'object',
required: ['current_password', 'new_password'],
title: 'UpdatePassword'
} as const;
export const UserCreateSchema = {
properties: {
email: {
type: 'string',
maxLength: 255,
format: 'email',
title: 'Email'
},
is_active: {
type: 'boolean',
title: 'Is Active',
default: true
},
is_superuser: {
type: 'boolean',
title: 'Is Superuser',
default: false
},
full_name: {
anyOf: [
{
type: 'string',
maxLength: 255
},
{
type: 'null'
}
],
title: 'Full Name'
},
password: {
type: 'string',
maxLength: 128,
minLength: 8,
title: 'Password'
}
},
type: 'object',
required: ['email', 'password'],
title: 'UserCreate'
} as const;
export const UserPublicSchema = {
properties: {
email: {
type: 'string',
maxLength: 255,
format: 'email',
title: 'Email'
},
is_active: {
type: 'boolean',
title: 'Is Active',
default: true
},
is_superuser: {
type: 'boolean',
title: 'Is Superuser',
default: false
},
full_name: {
anyOf: [
{
type: 'string',
maxLength: 255
},
{
type: 'null'
}
],
title: 'Full Name'
},
id: {
type: 'string',
format: 'uuid',
title: 'Id'
},
portal_sub: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Portal Sub'
},
created_at: {
anyOf: [
{
type: 'string',
format: 'date-time'
},
{
type: 'null'
}
],
title: 'Created At'
}
},
type: 'object',
required: ['email', 'id'],
title: 'UserPublic'
} as const;
export const UserRegisterSchema = {
properties: {
email: {
type: 'string',
maxLength: 255,
format: 'email',
title: 'Email'
},
password: {
type: 'string',
maxLength: 128,
minLength: 8,
title: 'Password'
},
full_name: {
anyOf: [
{
type: 'string',
maxLength: 255
},
{
type: 'null'
}
],
title: 'Full Name'
}
},
type: 'object',
required: ['email', 'password'],
title: 'UserRegister'
} as const;
export const UserUpdateSchema = {
properties: {
email: {
anyOf: [
{
type: 'string',
maxLength: 255,
format: 'email'
},
{
type: 'null'
}
],
title: 'Email'
},
is_active: {
type: 'boolean',
title: 'Is Active',
default: true
},
is_superuser: {
type: 'boolean',
title: 'Is Superuser',
default: false
},
full_name: {
anyOf: [
{
type: 'string',
maxLength: 255
},
{
type: 'null'
}
],
title: 'Full Name'
},
password: {
anyOf: [
{
type: 'string',
maxLength: 128,
minLength: 8
},
{
type: 'null'
}
],
title: 'Password'
}
},
type: 'object',
title: 'UserUpdate'
} as const;
export const UserUpdateMeSchema = {
properties: {
full_name: {
anyOf: [
{
type: 'string',
maxLength: 255
},
{
type: 'null'
}
],
title: 'Full Name'
},
email: {
anyOf: [
{
type: 'string',
maxLength: 255,
format: 'email'
},
{
type: 'null'
}
],
title: 'Email'
}
},
type: 'object',
title: 'UserUpdateMe'
} as const;
export const UsersPublicSchema = {
properties: {
data: {
items: {
'$ref': '#/components/schemas/UserPublic'
},
type: 'array',
title: 'Data'
},
count: {
type: 'integer',
title: 'Count'
}
},
type: 'object',
required: ['data', 'count'],
title: 'UsersPublic'
} as const;
export const ValidationErrorSchema = {
properties: {
loc: {
items: {
anyOf: [
{
type: 'string'
},
{
type: 'integer'
}
]
},
type: 'array',
title: 'Location'
},
msg: {
type: 'string',
title: 'Message'
},
type: {
type: 'string',
title: 'Error Type'
},
input: {
title: 'Input'
},
ctx: {
type: 'object',
title: 'Context'
}
},
type: 'object',
required: ['loc', 'msg', 'type'],
title: 'ValidationError'
} as const;
export const ValidationIssueSchema = {
properties: {
code: {
type: 'string',
enum: ['cycle', 'unconnected_input', 'missing_initial_value', 'node_error', 'unauthenticated_hook', 'self_loop_needs_initial', 'missing_source', 'node_unhealthy'],
title: 'Code'
},
message: {
type: 'string',
title: 'Message'
},
flow: {
type: 'string',
title: 'Flow',
default: ''
},
nodes: {
items: {
type: 'string'
},
type: 'array',
title: 'Nodes',
default: []
},
node: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Node'
},
port: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Port'
},
message_name: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Message Name'
},
advisory: {
type: 'boolean',
title: 'Advisory',
description: 'Worth saying, but not a fault — the UI says so in a softer tone.',
readOnly: true
}
},
type: 'object',
required: ['code', 'message', 'advisory'],
title: 'ValidationIssue',
description: 'Something wrong with a flow — a fault, or merely advisory.'
} as const;
export const ValidationResultSchema = {
properties: {
issues: {
items: {
'$ref': '#/components/schemas/ValidationIssue'
},
type: 'array',
title: 'Issues',
default: []
}
},
type: 'object',
title: 'ValidationResult'
} as const;
export const WaitingNodeSchema = {
properties: {
node: {
type: 'string',
title: 'Node'
},
reason: {
type: 'string',
title: 'Reason'
},
seconds: {
type: 'number',
title: 'Seconds'
}
},
type: 'object',
required: ['node', 'reason', 'seconds'],
title: 'WaitingNode'
} as const;
export const WebPushKeySchema = {
properties: {
key: {
type: 'string',
title: 'Key'
}
},
type: 'object',
required: ['key'],
title: 'WebPushKey'
} as const;
export const WidgetDefSchema = {
properties: {
id: {
type: 'string',
title: 'Id'
},
type: {
type: 'string',
enum: ['stat', 'gauge', 'chart', 'markdown', 'agenda', 'notification', 'bar', 'icon', 'forecast', 'clock', 'media', 'player', 'embed', 'button', 'buttons', 'switch', 'slider', 'input', 'dropdown', 'color'],
title: 'Type'
},
title: {
type: 'string',
title: 'Title',
default: ''
},
layout: {
additionalProperties: {
'$ref': '#/components/schemas/Placement'
},
type: 'object',
title: 'Layout'
},
config: {
additionalProperties: true,
type: 'object',
title: 'Config'
}
},
type: 'object',
required: ['id', 'type'],
title: 'WidgetDef',
description: `One tile: what it shows or does, and where it sits.
\`\`config\`\` is per type — a chart names its series, a button names the
message it publishes — and is validated against the type below rather than
by a schema per class, because the whole set is small and closed.
A chart comes in two kinds. The default reads what the engine kept for a
message. One with \`\`source: "query"\`\` asks instead, and its config is
\`\`{source, request, request_dtype: "record", message, dtype: "series",
refresh_s, range_s}\`\`: it publishes \`\`{range_s, interval_s}\`\` to
\`\`request\`\` exactly as a slider publishes a value, and draws the \`\`series\`\`
a flow answers with on \`\`message\`\`.
A colour widget picks what it publishes with \`\`format\`\`, because fixtures
differ and a change node per tile is not the answer:
- \`\`hsv\`\` (the default) — \`\`[h, s, v]\`\`, hue 0-360 degrees, saturation and
value 0-100 percent. What the Node-RED instance this ports feeds its
3CH/4CH DMX encoders, which divide by 360 and by 100.
- \`\`rgb\`\` — \`\`[r, g, b]\`\`, each 0-255. The conventional range; the
reference's own encoders produce it after converting.
- \`\`hex\`\` — \`\`"#rrggbb"\`\`, lowercase. Conventional likewise.
The first two are a \`\`list\`\` message, the third a \`\`str\`\`, which is what
\`\`COLOR_DTYPES\`\` records and the check below holds a binding to.`
} as const;
export const WidgetFootprintSchema = {
properties: {
x: {
type: 'integer',
title: 'X',
default: 0
},
y: {
type: 'integer',
title: 'Y',
default: 0
},
w: {
type: 'integer',
title: 'W',
default: 3
},
h: {
type: 'integer',
title: 'H',
default: 2
},
type: {
type: 'string',
enum: ['stat', 'gauge', 'chart', 'markdown', 'agenda', 'notification', 'bar', 'icon', 'forecast', 'clock', 'media', 'player', 'embed', 'button', 'buttons', 'switch', 'slider', 'input', 'dropdown', 'color'],
title: 'Type'
}
},
type: 'object',
required: ['type'],
title: 'WidgetFootprint',
description: `A widget reduced to the shape it draws: what it is, and where it sits.
The whole of what sketching a dashboard's outline needs — a mosaic tile
shades a block by kind and puts it in the grid, and reads nothing else. So
no id (the drawing has no use for one), no title, no config, and one
placement rather than the layout's breakpoint per screen size.`
} as const;
export const WorkerInfoSchema = {
properties: {
name: {
type: 'string',
title: 'Name'
},
labels: {
items: {
type: 'string'
},
type: 'array',
title: 'Labels'
},
max_parallel: {
type: 'integer',
title: 'Max Parallel',
default: 1
},
in_flight: {
type: 'integer',
title: 'In Flight',
default: 0
},
attached_at: {
type: 'number',
title: 'Attached At',
default: 0
},
last_seen: {
type: 'number',
title: 'Last Seen',
default: 0
},
python: {
type: 'string',
title: 'Python',
default: ''
},
venv_digest: {
type: 'string',
title: 'Venv Digest',
default: ''
},
cpus: {
type: 'integer',
title: 'Cpus',
default: 1
},
gpus: {
type: 'integer',
title: 'Gpus',
default: 0
},
ram_mb: {
anyOf: [
{
type: 'integer'
},
{
type: 'null'
}
],
title: 'Ram Mb'
}
},
type: 'object',
required: ['name'],
title: 'WorkerInfo'
} as const;
export const WorkerTokenSchema = {
properties: {
jti: {
type: 'string',
maxLength: 32,
title: 'Jti'
},
name: {
type: 'string',
maxLength: 255,
title: 'Name'
},
labels: {
items: {
type: 'string'
},
type: 'array',
title: 'Labels'
},
created_at: {
type: 'string',
format: 'date-time',
title: 'Created At'
},
expires_at: {
type: 'string',
format: 'date-time',
title: 'Expires At'
},
revoked_at: {
anyOf: [
{
type: 'string',
format: 'date-time'
},
{
type: 'null'
}
],
title: 'Revoked At'
}
},
type: 'object',
required: ['jti', 'name', 'expires_at'],
title: 'WorkerToken',
description: 'One worker credential, by the id it carries as `jti`.'
} as const;
export const fluksio__api__routes__dashboards__PublishRequestSchema = {
properties: {
version: {
type: 'integer',
title: 'Version'
}
},
type: 'object',
required: ['version'],
title: 'PublishRequest'
} as const;
export const fluksio__api__routes__dashboards__RenameRequestSchema = {
properties: {
name: {
type: 'string',
title: 'Name'
}
},
type: 'object',
required: ['name'],
title: 'RenameRequest'
} as const;
export const fluksio__api__routes__flows__PublishRequestSchema = {
properties: {
version: {
type: 'integer',
title: 'Version'
}
},
type: 'object',
required: ['version'],
title: 'PublishRequest'
} as const;
export const fluksio__api__routes__flows__RenameRequestSchema = {
properties: {
new_name: {
type: 'string',
title: 'New Name'
}
},
type: 'object',
required: ['new_name'],
title: 'RenameRequest'
} as const;
export const fluksio__api__routes__messages__MessageValueSchema = {
properties: {
name: {
type: 'string',
title: 'Name'
},
value: {
title: 'Value'
},
ts: {
anyOf: [
{
type: 'number'
},
{
type: 'null'
}
],
title: 'Ts'
}
},
type: 'object',
required: ['name', 'value'],
title: 'MessageValue'
} as const;
export const fluksio__api__routes__messages__PublishRequestSchema = {
properties: {
value: {
title: 'Value'
},
source_kind: {
type: 'string',
title: 'Source Kind',
default: 'api'
},
source_id: {
type: 'string',
title: 'Source Id',
default: ''
},
source_label: {
type: 'string',
title: 'Source Label',
default: ''
},
source_detail: {
type: 'string',
title: 'Source Detail',
default: ''
}
},
type: 'object',
required: ['value'],
title: 'PublishRequest'
} as const;
export const fluksio__api__routes__observability__RunRowSchema = {
properties: {
id: {
type: 'string',
title: 'Id'
},
flow: {
type: 'string',
title: 'Flow'
},
source: {
type: 'string',
title: 'Source'
},
status: {
type: 'string',
title: 'Status'
},
started_at: {
type: 'string',
format: 'date-time',
title: 'Started At'
},
finished_at: {
anyOf: [
{
type: 'string',
format: 'date-time'
},
{
type: 'null'
}
],
title: 'Finished At'
},
nodes: {
type: 'integer',
title: 'Nodes'
},
errors: {
type: 'integer',
title: 'Errors'
},
duration_ms: {
type: 'number',
title: 'Duration Ms'
},
deliveries: {
type: 'integer',
title: 'Deliveries'
}
},
type: 'object',
required: ['id', 'flow', 'source', 'status', 'started_at', 'nodes', 'errors', 'duration_ms', 'deliveries'],
title: 'RunRow'
} as const;
export const fluksio__api__routes__runs__RunRowSchema = {
properties: {
id: {
type: 'string',
title: 'Id'
},
flow: {
type: 'string',
title: 'Flow'
},
status: {
type: 'string',
title: 'Status'
},
status_reason: {
type: 'string',
title: 'Status Reason'
},
cause: {
type: 'string',
title: 'Cause'
},
params: {
additionalProperties: true,
type: 'object',
title: 'Params'
},
passed: {
anyOf: [
{
items: {
type: 'string'
},
type: 'array'
},
{
type: 'null'
}
],
title: 'Passed'
},
params_digest: {
type: 'string',
title: 'Params Digest'
},
origin_commit: {
type: 'string',
title: 'Origin Commit',
default: ''
},
code_digest: {
type: 'string',
title: 'Code Digest',
default: ''
},
commit: {
type: 'string',
title: 'Commit',
default: ''
},
external_id: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'External Id'
},
seed: {
anyOf: [
{
type: 'integer'
},
{
type: 'null'
}
],
title: 'Seed'
},
group_id: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Group Id'
},
draft: {
type: 'boolean',
title: 'Draft',
default: false
},
labels: {
items: {
type: 'string'
},
type: 'array',
title: 'Labels'
},
created_at: {
title: 'Created At'
},
started_at: {
title: 'Started At'
},
finished_at: {
title: 'Finished At'
},
duration_ms: {
type: 'number',
title: 'Duration Ms'
},
actor: {
type: 'string',
title: 'Actor'
}
},
type: 'object',
required: ['id', 'flow', 'status', 'status_reason', 'cause', 'params', 'params_digest', 'seed', 'group_id', 'labels', 'created_at', 'duration_ms', 'actor'],
title: 'RunRow',
description: 'A run without its result, which is the part that can be large.'
} as const;
export const fluksio__flow__schemas__MessageValueSchema = {
properties: {
value: {
title: 'Value'
},
ts: {
anyOf: [
{
type: 'number'
},
{
type: 'null'
}
],
title: 'Ts'
}
},
type: 'object',
title: 'MessageValue',
description: 'The last payload seen on a message.'
} as const;