`POST /runs/flows/{name}` hardcoded `cause: "api"`, so every row in the
history claimed the same origin. The body now carries an optional `cause`,
closed to the values the column knows — the dashboard sends nothing and stays
"api", `fluksio run` says "cli", and the SDK client says "sdk".
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013Gf7WaExcJ9bs3kfJXB3nK
3607 lines
87 KiB
TypeScript
3607 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: ''
|
|
},
|
|
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: ''
|
|
},
|
|
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 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: ''
|
|
},
|
|
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'
|
|
},
|
|
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
|
|
}
|
|
},
|
|
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
|
|
}
|
|
},
|
|
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 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
|
|
},
|
|
no_cache: {
|
|
type: 'boolean',
|
|
title: 'No Cache',
|
|
default: false
|
|
},
|
|
cause: {
|
|
type: 'string',
|
|
enum: ['api', 'cli', 'sdk'],
|
|
title: 'Cause',
|
|
default: 'api'
|
|
}
|
|
},
|
|
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: ''
|
|
},
|
|
commit: {
|
|
type: 'string',
|
|
title: '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'
|
|
},
|
|
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 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 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'
|
|
}
|
|
},
|
|
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'
|
|
},
|
|
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'],
|
|
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 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: ''
|
|
},
|
|
commit: {
|
|
type: 'string',
|
|
title: '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; |