The workflow this serves: make a venv, install what you work with, then `pip install fluksio` into the same one. Building a second environment beside it was exactly wrong — the packages the nodes need are already here, and the Modules screen was asking for them a second time. `NODE_VENV=auto` (the default) adopts that venv. It declines in the three cases where adopting would be wrong: `managed` says otherwise, a managed venv already exists and may hold packages somebody installed on purpose, or the engine is not running from a venv at all. The images set `managed`, since the venv in them holds the app and nothing of anybody else's. An adopted venv is never written to. `uv pip sync` makes a venv hold exactly the manifest, so pointed at somebody's own environment it uninstalls their work and the engine with it — `sync()` refuses outright and `reconcile()` returns before it can be called at startup, which is where that would have happened first. The Modules screen lists what is installed and drops its editor; `pip` is how that environment changes. `fluksio serve` now names the interpreter node code runs on, which is the thing a data scientist most needs to know at that moment. `fluksio-worker` already defaulted `--python` to its own interpreter, so a GPU box works the same way — that was only ever undocumented. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012ue1tkFWB1bcGy3aWhCKpU
3628 lines
87 KiB
TypeScript
3628 lines
87 KiB
TypeScript
// This file is auto-generated by @hey-api/openapi-ts
|
|
|
|
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'
|
|
}
|
|
},
|
|
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'],
|
|
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 DTypeSchema = {
|
|
type: 'string',
|
|
enum: ['float', 'int', 'str', 'bool', 'json', 'series', 'record', 'list', 'artifact'],
|
|
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.`
|
|
} 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: ''
|
|
},
|
|
pages: {
|
|
items: {
|
|
'$ref': '#/components/schemas/PageDef-Input'
|
|
},
|
|
type: 'array',
|
|
title: 'Pages'
|
|
},
|
|
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: ''
|
|
},
|
|
pages: {
|
|
items: {
|
|
'$ref': '#/components/schemas/PageDef-Output'
|
|
},
|
|
type: 'array',
|
|
title: 'Pages'
|
|
},
|
|
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: ''
|
|
},
|
|
page_count: {
|
|
type: 'integer',
|
|
title: 'Page Count',
|
|
default: 0
|
|
},
|
|
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
|
|
}
|
|
},
|
|
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'
|
|
}
|
|
},
|
|
type: 'object',
|
|
required: ['id', 'ts', 'type', 'flow', 'node', 'detail', 'actor'],
|
|
title: 'EventRow'
|
|
} 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
|
|
}
|
|
},
|
|
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 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: ''
|
|
},
|
|
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
|
|
}
|
|
},
|
|
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'
|
|
}
|
|
},
|
|
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 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'
|
|
}
|
|
},
|
|
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',
|
|
exclusiveMinimum: 0
|
|
},
|
|
{
|
|
type: 'null'
|
|
}
|
|
],
|
|
title: 'Timeout',
|
|
description: "Seconds this node's code may run before it is stopped. This covers the first call's imports, which can be much slower than the body. Above 60 the engine may deliver its work again while it is still running — in a batch run, which never redelivers, it is an idle timeout instead: silence this long is a kill."
|
|
},
|
|
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'
|
|
}
|
|
},
|
|
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',
|
|
exclusiveMinimum: 0
|
|
},
|
|
{
|
|
type: 'null'
|
|
}
|
|
],
|
|
title: 'Timeout',
|
|
description: "Seconds this node's code may run before it is stopped. This covers the first call's imports, which can be much slower than the body. Above 60 the engine may deliver its work again while it is still running — in a batch run, which never redelivers, it is an idle timeout instead: silence this long is a kill."
|
|
},
|
|
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'
|
|
}
|
|
},
|
|
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'
|
|
}
|
|
},
|
|
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
|
|
},
|
|
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 PageDef_InputSchema = {
|
|
properties: {
|
|
id: {
|
|
type: 'string',
|
|
title: 'Id'
|
|
},
|
|
title: {
|
|
type: 'string',
|
|
title: 'Title',
|
|
default: ''
|
|
},
|
|
icon: {
|
|
type: 'string',
|
|
title: 'Icon',
|
|
default: ''
|
|
},
|
|
sections: {
|
|
items: {
|
|
'$ref': '#/components/schemas/SectionDef-Input'
|
|
},
|
|
type: 'array',
|
|
title: 'Sections'
|
|
}
|
|
},
|
|
type: 'object',
|
|
required: ['id'],
|
|
title: 'PageDef',
|
|
description: 'One tab of a dashboard.'
|
|
} as const;
|
|
|
|
export const PageDef_OutputSchema = {
|
|
properties: {
|
|
id: {
|
|
type: 'string',
|
|
title: 'Id'
|
|
},
|
|
title: {
|
|
type: 'string',
|
|
title: 'Title',
|
|
default: ''
|
|
},
|
|
icon: {
|
|
type: 'string',
|
|
title: 'Icon',
|
|
default: ''
|
|
},
|
|
sections: {
|
|
items: {
|
|
'$ref': '#/components/schemas/SectionDef-Output'
|
|
},
|
|
type: 'array',
|
|
title: 'Sections'
|
|
}
|
|
},
|
|
type: 'object',
|
|
required: ['id'],
|
|
title: 'PageDef',
|
|
description: 'One tab of a dashboard.'
|
|
} 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'
|
|
},
|
|
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 installation 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 installation 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 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 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
|
|
}
|
|
},
|
|
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'
|
|
},
|
|
params_digest: {
|
|
type: 'string',
|
|
title: 'Params Digest'
|
|
},
|
|
origin_commit: {
|
|
type: 'string',
|
|
title: 'Origin Commit',
|
|
default: ''
|
|
},
|
|
seed: {
|
|
anyOf: [
|
|
{
|
|
type: 'integer'
|
|
},
|
|
{
|
|
type: 'null'
|
|
}
|
|
],
|
|
title: 'Seed'
|
|
},
|
|
group_id: {
|
|
anyOf: [
|
|
{
|
|
type: 'string'
|
|
},
|
|
{
|
|
type: 'null'
|
|
}
|
|
],
|
|
title: 'Group Id'
|
|
},
|
|
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'
|
|
},
|
|
commit: {
|
|
type: 'string',
|
|
title: 'Commit',
|
|
default: ''
|
|
},
|
|
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'
|
|
}
|
|
},
|
|
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 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 SectionDef_InputSchema = {
|
|
properties: {
|
|
id: {
|
|
type: 'string',
|
|
title: 'Id'
|
|
},
|
|
title: {
|
|
type: 'string',
|
|
title: 'Title',
|
|
default: ''
|
|
},
|
|
widgets: {
|
|
items: {
|
|
'$ref': '#/components/schemas/WidgetDef'
|
|
},
|
|
type: 'array',
|
|
title: 'Widgets'
|
|
}
|
|
},
|
|
type: 'object',
|
|
required: ['id'],
|
|
title: 'SectionDef',
|
|
description: 'A grid of widgets under a heading.'
|
|
} as const;
|
|
|
|
export const SectionDef_OutputSchema = {
|
|
properties: {
|
|
id: {
|
|
type: 'string',
|
|
title: 'Id'
|
|
},
|
|
title: {
|
|
type: 'string',
|
|
title: 'Title',
|
|
default: ''
|
|
},
|
|
widgets: {
|
|
items: {
|
|
'$ref': '#/components/schemas/WidgetDef'
|
|
},
|
|
type: 'array',
|
|
title: 'Widgets'
|
|
}
|
|
},
|
|
type: 'object',
|
|
required: ['id'],
|
|
title: 'SectionDef',
|
|
description: 'A grid of widgets under a heading.'
|
|
} as const;
|
|
|
|
export const SeriesAnswerSchema = {
|
|
properties: {
|
|
metric: {
|
|
type: 'string',
|
|
title: 'Metric'
|
|
},
|
|
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 SweepCreateSchema = {
|
|
properties: {
|
|
runs: {
|
|
items: {
|
|
'$ref': '#/components/schemas/SweepEntry'
|
|
},
|
|
type: 'array',
|
|
title: 'Runs'
|
|
},
|
|
draft: {
|
|
type: 'boolean',
|
|
title: 'Draft',
|
|
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'
|
|
}
|
|
},
|
|
type: 'object',
|
|
title: 'SweepEntry'
|
|
} 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'
|
|
},
|
|
expires_days: {
|
|
type: 'integer',
|
|
title: 'Expires Days',
|
|
default: 365
|
|
}
|
|
},
|
|
type: 'object',
|
|
required: ['name', 'token'],
|
|
title: 'TokenIssued'
|
|
} as const;
|
|
|
|
export const TokenRequestSchema = {
|
|
properties: {
|
|
name: {
|
|
type: 'string',
|
|
title: 'Name'
|
|
}
|
|
},
|
|
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 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'
|
|
}
|
|
},
|
|
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'],
|
|
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'
|
|
}
|
|
},
|
|
type: 'object',
|
|
required: ['code', 'message'],
|
|
title: 'ValidationIssue',
|
|
description: 'A problem that keeps a flow from running correctly.'
|
|
} 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 WidgetDefSchema = {
|
|
properties: {
|
|
id: {
|
|
type: 'string',
|
|
title: 'Id'
|
|
},
|
|
type: {
|
|
type: 'string',
|
|
enum: ['stat', 'gauge', 'chart', 'markdown', 'agenda', 'notification', 'bar', 'icon', 'forecast', 'clock', 'button', '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 installation 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 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: ''
|
|
}
|
|
},
|
|
type: 'object',
|
|
required: ['name'],
|
|
title: 'WorkerInfo'
|
|
} 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'
|
|
},
|
|
params_digest: {
|
|
type: 'string',
|
|
title: 'Params Digest'
|
|
},
|
|
origin_commit: {
|
|
type: 'string',
|
|
title: 'Origin Commit',
|
|
default: ''
|
|
},
|
|
seed: {
|
|
anyOf: [
|
|
{
|
|
type: 'integer'
|
|
},
|
|
{
|
|
type: 'null'
|
|
}
|
|
],
|
|
title: 'Seed'
|
|
},
|
|
group_id: {
|
|
anyOf: [
|
|
{
|
|
type: 'string'
|
|
},
|
|
{
|
|
type: 'null'
|
|
}
|
|
],
|
|
title: 'Group Id'
|
|
},
|
|
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; |