The first cut had node code call fluksio.log_metric, which was a second, undeclared way for data to leave a node: invisible to validation, absent from the canvas, and stored where the graph could not see it. That is precisely the MLflow discrepancy this framework exists to avoid, so it is gone. A node that produces values over time is a generator. Every yield is a dict keyed by output port, published the instant it happens — same port, same type check, same place on the canvas as any other value — and what it returns is its result. A port doing this declares stream: true, and a run keeps every number one takes, so experiment tracking is a consequence of the graph rather than an API beside it: a chart binds to a training curve the way it binds to a temperature. fluksio.emit writes the same ports imperatively, for where a yield cannot reach — inside a training framework's callback. In a live flow an emission also wakes what is downstream, as a subscriber publishing does; in a run it does not, because a run's graph is scheduled once and mid-node cascades would leave 'finished' with nothing to mean. The enqueued item carries no payload: the value is already in state, and one carrying it would re-apply an old emission after the node returned. Verified on the stack: 30 loss values arrived live on the flow socket during a run, attributed to the node that produced them, and the same node run on the remote worker streamed its curve back across the socket. Also caches remote compile results per worker, so attaching a GPU box does not put a network round trip in every rebuild. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AD8SfVhzXBG2nAfFcVh3iD
3243 lines
77 KiB
TypeScript
3243 lines
77 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
|
|
},
|
|
pages: {
|
|
items: {
|
|
'$ref': '#/components/schemas/PageDef-Input'
|
|
},
|
|
type: 'array',
|
|
title: 'Pages'
|
|
},
|
|
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
|
|
},
|
|
pages: {
|
|
items: {
|
|
'$ref': '#/components/schemas/PageDef-Output'
|
|
},
|
|
type: 'array',
|
|
title: 'Pages'
|
|
},
|
|
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
|
|
}
|
|
},
|
|
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 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.'
|
|
}
|
|
},
|
|
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.'
|
|
}
|
|
},
|
|
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 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/app__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
|
|
}
|
|
},
|
|
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'
|
|
},
|
|
failures_24h: {
|
|
type: 'integer',
|
|
title: 'Failures 24H'
|
|
}
|
|
},
|
|
type: 'object',
|
|
required: ['status', 'problems', 'flows', 'nodes', 'queue', 'loop_lag', 'failures_24h'],
|
|
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
|
|
}
|
|
},
|
|
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'
|
|
}
|
|
},
|
|
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 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 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'
|
|
},
|
|
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 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 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'
|
|
},
|
|
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', 'button', 'switch', 'slider', 'input', 'dropdown'],
|
|
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\`\`.`
|
|
} 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 app__api__routes__dashboards__PublishRequestSchema = {
|
|
properties: {
|
|
version: {
|
|
type: 'integer',
|
|
title: 'Version'
|
|
}
|
|
},
|
|
type: 'object',
|
|
required: ['version'],
|
|
title: 'PublishRequest'
|
|
} as const;
|
|
|
|
export const app__api__routes__dashboards__RenameRequestSchema = {
|
|
properties: {
|
|
name: {
|
|
type: 'string',
|
|
title: 'Name'
|
|
}
|
|
},
|
|
type: 'object',
|
|
required: ['name'],
|
|
title: 'RenameRequest'
|
|
} as const;
|
|
|
|
export const app__api__routes__flows__PublishRequestSchema = {
|
|
properties: {
|
|
version: {
|
|
type: 'integer',
|
|
title: 'Version'
|
|
}
|
|
},
|
|
type: 'object',
|
|
required: ['version'],
|
|
title: 'PublishRequest'
|
|
} as const;
|
|
|
|
export const app__api__routes__flows__RenameRequestSchema = {
|
|
properties: {
|
|
new_name: {
|
|
type: 'string',
|
|
title: 'New Name'
|
|
}
|
|
},
|
|
type: 'object',
|
|
required: ['new_name'],
|
|
title: 'RenameRequest'
|
|
} as const;
|
|
|
|
export const app__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 app__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 app__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 app__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'
|
|
},
|
|
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 app__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; |