chore: remove workflows and steer endpoints

Remove GET /workflows, GET /workflows/{name}, GET /workflows/{name}/runs,
and POST /runs/{id}/steer from the OpenAPI spec, server routes, demo
fixtures, pagination tests, docs navigation, and generated TS client.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Bryan Helmkamp 2026-04-07 08:25:54 -04:00
parent 6b0a72ddb8
commit e2a2696141
17 changed files with 2 additions and 1275 deletions

View file

@ -867,36 +867,6 @@ paths:
schema:
$ref: "#/components/schemas/ErrorResponse"
/api/v1/runs/{id}/steer:
post:
operationId: steerRun
tags: [Human-in-the-Loop]
summary: Steer Run
description: Sends inline guidance to a running agent, targeting a specific file and line. The guidance is delivered asynchronously.
parameters:
- $ref: "#/components/parameters/RunId"
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/SteerRequest"
responses:
"202":
description: Steering accepted for processing
"404":
description: Run not found
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
"409":
description: Run is not in a steerable state
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
/api/v1/runs/{id}/preview:
post:
operationId: generatePreviewUrl
@ -1072,71 +1042,6 @@ paths:
schema:
$ref: "#/components/schemas/ErrorResponse"
# ── Workflows ─────────────────────────────────────────────────────────
/api/v1/workflows:
get:
operationId: listWorkflows
tags: [Workflows]
summary: List Workflows
description: Returns a paginated list of workflow definitions available for execution.
parameters:
- $ref: "#/components/parameters/PageLimit"
- $ref: "#/components/parameters/PageOffset"
responses:
"200":
description: Paginated list of workflows
content:
application/json:
schema:
$ref: "#/components/schemas/PaginatedWorkflowList"
/api/v1/workflows/{name}:
get:
operationId: retrieveWorkflow
tags: [Workflows]
summary: Retrieve Workflow
description: Returns the full detail of a workflow including its Graphviz graph, resolved settings, and description.
parameters:
- $ref: "#/components/parameters/WorkflowName"
responses:
"200":
description: Workflow detail
content:
application/json:
schema:
$ref: "#/components/schemas/WorkflowDetail"
"404":
description: Workflow not found
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
/api/v1/workflows/{name}/runs:
get:
operationId: listWorkflowRuns
tags: [Workflows]
summary: List Workflow Runs
description: Returns a paginated list of runs filtered to a specific workflow.
parameters:
- $ref: "#/components/parameters/WorkflowName"
- $ref: "#/components/parameters/PageLimit"
- $ref: "#/components/parameters/PageOffset"
responses:
"200":
description: Paginated list of runs
content:
application/json:
schema:
$ref: "#/components/schemas/PaginatedRunList"
"404":
description: Workflow not found
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
# ── Insights ──────────────────────────────────────────────────────────
/api/v1/insights/queries:
@ -1686,15 +1591,6 @@ components:
type: string
example: q-001
WorkflowName:
name: name
in: path
required: true
description: URL-safe slug identifying a workflow definition.
schema:
type: string
example: fix_build
InsightQueryId:
name: id
in: path
@ -1791,20 +1687,6 @@ components:
meta:
$ref: "#/components/schemas/PaginationMeta"
PaginatedWorkflowList:
description: Paginated list of workflows.
type: object
required:
- data
- meta
properties:
data:
type: array
items:
$ref: "#/components/schemas/WorkflowListItem"
meta:
$ref: "#/components/schemas/PaginationMeta"
PaginatedModelList:
description: Paginated list of models.
type: object
@ -3329,34 +3211,6 @@ components:
description: Total runtime in seconds.
example: 3501.0
WorkflowSchedule:
description: Schedule configuration for a workflow.
type: object
required:
- expression
properties:
expression:
type: string
description: Cron-like schedule expression.
example: "0 */6 * * *"
next_run:
type: string
format: date-time
description: ISO 8601 timestamp of the next scheduled run.
example: "2025-09-15T18:00:00Z"
WorkflowLastRun:
description: Information about a workflow's most recent run.
type: object
required:
- ran_at
properties:
ran_at:
type: string
format: date-time
description: ISO 8601 timestamp of the most recent run.
example: "2025-09-15T12:00:00Z"
UsageStageRef:
description: Reference to a usage stage.
type: object
@ -3777,19 +3631,6 @@ components:
items:
$ref: "#/components/schemas/UsageByModel"
SteerRequest:
description: Request body for sending inline steering guidance to a running agent.
type: object
required:
- guidance
properties:
location:
$ref: "#/components/schemas/CodeLocation"
guidance:
type: string
description: Guidance text for the agent.
example: Use a sliding window algorithm instead of fixed window.
PreviewUrlRequest:
description: Request body for generating a preview URL from a sandbox port.
type: object
@ -3880,67 +3721,6 @@ components:
items:
$ref: "#/components/schemas/SandboxFileEntry"
# ── Workflow Schemas ─────────────────────────────────────────────────
WorkflowListItem:
description: Summary of a workflow shown in list views.
type: object
required:
- name
- slug
- filename
properties:
name:
type: string
description: Human-readable workflow name.
example: Fix Build
slug:
type: string
description: URL-safe slug used in API paths.
example: fix_build
filename:
type: string
description: Graphviz graph filename.
example: fix_build.fabro
last_run:
$ref: "#/components/schemas/WorkflowLastRun"
schedule:
$ref: "#/components/schemas/WorkflowSchedule"
WorkflowDetail:
description: Full detail of a workflow definition including graph and resolved settings.
type: object
required:
- name
- slug
- filename
- description
- settings
- graph
properties:
name:
type: string
description: Human-readable workflow name.
example: Fix Build
slug:
type: string
description: URL-safe slug used in API paths.
example: fix_build
filename:
type: string
description: Graphviz graph filename.
example: fix_build.fabro
description:
type: string
description: Prose description of what the workflow does.
example: Automatically diagnoses and fixes CI build failures.
settings:
$ref: "#/components/schemas/RunSettings"
graph:
type: string
description: Graphviz DOT language source defining the workflow graph.
example: "digraph fix_build { rankdir=LR; start -> diagnose -> fix -> validate }"
# ── Insights Schemas ─────────────────────────────────────────────────
SavedQuery:

View file

@ -199,7 +199,6 @@
"pages": [
"GET /api/v1/runs/{id}/questions",
"POST /api/v1/runs/{id}/questions/{qid}/answer",
"POST /api/v1/runs/{id}/steer",
"POST /api/v1/runs/{id}/preview"
]
},
@ -221,15 +220,6 @@
}
]
},
{
"group": "Workflows",
"icon": "diagram-project",
"pages": [
"GET /api/v1/workflows",
"GET /api/v1/workflows/{name}",
"GET /api/v1/workflows/{name}/runs"
]
},
{
"group": "More",
"icon": "ellipsis",

View file

@ -11,14 +11,12 @@ A steering message is injected into the agent's conversation as a user-role mess
The delivery flow:
1. You send a `POST /api/v1/runs/{id}/steer` request with your guidance text
1. You send a steering request with your guidance text
2. The message is queued on the agent session's steering queue
3. Before the next LLM call, Fabro drains the queue and injects each message as a `Steering` turn in the conversation history
4. The LLM sees the guidance alongside its existing context and adjusts accordingly
Steering is **asynchronous** — the API returns `202 Accepted` immediately. The agent picks up the message at its next natural pause point (between tool calls), not mid-execution.
See the [Steer Run API reference](/api-reference/human-in-the-loop/steer-run) for the full request and response schema.
Steering is **asynchronous** — the agent picks up the message at its next natural pause point (between tool calls), not mid-execution.
## When steering is delivered

View file

@ -113,14 +113,6 @@ pub(crate) async fn get_run_settings(
(StatusCode::OK, Json(runs::settings())).into_response()
}
pub(crate) async fn steer_run_stub(
_auth: AuthenticatedService,
State(_state): State<Arc<AppState>>,
Path(_id): Path<String>,
) -> Response {
StatusCode::ACCEPTED.into_response()
}
pub(crate) async fn generate_preview_url_stub(
_auth: AuthenticatedService,
State(_state): State<Arc<AppState>>,
@ -275,40 +267,6 @@ pub(crate) async fn get_run_graph(
crate::server::render_graph_bytes(dot_source, fabro_graphviz::render::GraphFormat::Svg).await
}
// ── Workflows ──────────────────────────────────────────────────────────
pub(crate) async fn list_workflows(
_auth: AuthenticatedService,
State(_state): State<Arc<AppState>>,
Query(pagination): Query<PaginationParams>,
) -> Response {
paginated_response(workflows::list_items(), &pagination)
}
pub(crate) async fn get_workflow(
_auth: AuthenticatedService,
State(_state): State<Arc<AppState>>,
Path(name): Path<String>,
) -> Response {
match workflows::detail(&name) {
Some(detail) => (StatusCode::OK, Json(detail)).into_response(),
None => ApiError::not_found("Workflow not found.").into_response(),
}
}
pub(crate) async fn list_workflow_runs(
_auth: AuthenticatedService,
State(_state): State<Arc<AppState>>,
Path(name): Path<String>,
Query(pagination): Query<PaginationParams>,
) -> Response {
let items: Vec<_> = runs::list_items()
.into_iter()
.filter(|r| r.workflow.slug == name)
.collect();
paginated_response(items, &pagination)
}
pub(crate) async fn list_secrets(
_auth: AuthenticatedService,
State(_state): State<Arc<AppState>>,
@ -1396,378 +1354,6 @@ mod usage {
}
}
mod workflows {
use super::ts;
use fabro_api::types::*;
pub(super) fn list_items() -> Vec<WorkflowListItem> {
vec![
WorkflowListItem {
name: "Fix Build".into(),
slug: "fix_build".into(),
filename: "fix_build.fabro".into(),
last_run: Some(WorkflowLastRun {
ran_at: ts("2025-09-15T12:00:00Z"),
}),
schedule: None,
},
WorkflowListItem {
name: "Implement Feature".into(),
slug: "implement".into(),
filename: "implement.fabro".into(),
last_run: Some(WorkflowLastRun {
ran_at: ts("2025-09-11T10:00:00Z"),
}),
schedule: None,
},
WorkflowListItem {
name: "Sync Drift".into(),
slug: "sync_drift".into(),
filename: "sync_drift.fabro".into(),
last_run: Some(WorkflowLastRun {
ran_at: ts("2025-09-14T14:00:00Z"),
}),
schedule: None,
},
WorkflowListItem {
name: "Expand Product".into(),
slug: "expand".into(),
filename: "expand.fabro".into(),
last_run: Some(WorkflowLastRun {
ran_at: ts("2025-09-01T08:00:00Z"),
}),
schedule: None,
},
]
}
fn run_settings_to_api(cfg: fabro_types::Settings) -> RunSettings {
fn strip_nulls(val: serde_json::Value) -> serde_json::Value {
match val {
serde_json::Value::Object(map) => serde_json::Value::Object(
map.into_iter()
.filter(|(_, v)| !v.is_null())
.map(|(k, v)| (k, strip_nulls(v)))
.collect(),
),
serde_json::Value::Array(arr) => {
serde_json::Value::Array(arr.into_iter().map(strip_nulls).collect())
}
other => other,
}
}
let val = strip_nulls(serde_json::to_value(cfg).unwrap());
serde_json::from_value(val).unwrap()
}
pub(super) fn detail(name: &str) -> Option<WorkflowDetail> {
let items = [
WorkflowDetail {
name: "Fix Build".into(), slug: "fix_build".into(), filename: "fix_build.fabro".into(),
description: "Automatically diagnoses and fixes CI build failures by analyzing error logs, identifying root causes, and applying targeted code changes.".into(),
settings: run_settings_to_api(fabro_types::Settings {
version: Some(1),
goal: Some("Diagnose and fix CI build failures".into()),
graph: Some("fix_build.fabro".into()),
work_dir: None,
llm: Some(fabro_config::run::LlmSettings {
model: Some("claude-sonnet".into()),
provider: None,
fallbacks: None,
}),
setup: None,
sandbox: Some(fabro_config::sandbox::SandboxSettings {
provider: Some("daytona".into()),
preserve: None,
devcontainer: None,
local: None,
daytona: Some(fabro_sandbox::daytona::DaytonaConfig {
auto_stop_interval: Some(60),
labels: Some(std::collections::HashMap::from([
("project".into(), "fix-build".into()),
])),
snapshot: Some(fabro_sandbox::daytona::DaytonaSnapshotConfig {
name: "fix-build-dev".into(),
cpu: Some(4),
memory: Some(8),
disk: Some(10),
dockerfile: None,
}),
network: None,
skip_clone: false,
}),
env: None,
}),
vars: Some(std::collections::HashMap::from([
("repo_url".into(), "https://github.com/org/service".into()),
("branch".into(), "main".into()),
])),
hooks: vec![],
checkpoint: Default::default(),
pull_request: None,
artifacts: None,
mcp_servers: Default::default(),
github: None,
..Default::default()
}),
graph: r#"digraph fix_build {
graph [
goal="Diagnose and fix CI build failures",
label="Fix Build"
]
rankdir=LR
start [shape=Mdiamond, label="Start"]
exit [shape=Msquare, label="Exit"]
diagnose [label="Diagnose Failure", prompt="@prompts/fix_build/diagnose.md", reasoning_effort="high"]
fix [label="Apply Fix", prompt="@prompts/fix_build/fix.md"]
validate [label="Run Build", prompt="@prompts/fix_build/validate.md", goal_gate=true]
gate [shape=diamond, label="Build passing?"]
start -> diagnose -> fix -> validate -> gate
gate -> exit [label="Yes", condition="outcome=success"]
gate -> diagnose [label="No", condition="outcome!=success", max_visits=3]
}
"#.into(),
},
WorkflowDetail {
name: "Implement Feature".into(), slug: "implement".into(), filename: "implement.fabro".into(),
description: "Generates production-ready code from a technical blueprint, including tests, documentation, and a pull request ready for review.".into(),
settings: run_settings_to_api(fabro_types::Settings {
version: Some(1),
goal: Some("Implement feature from technical blueprint".into()),
graph: Some("implement.fabro".into()),
work_dir: None,
llm: Some(fabro_config::run::LlmSettings {
model: Some("claude-sonnet".into()),
provider: None,
fallbacks: None,
}),
setup: Some(fabro_config::run::SetupSettings {
commands: vec!["bun install".into(), "bun run typecheck".into()],
timeout_ms: Some(120_000),
}),
sandbox: Some(fabro_config::sandbox::SandboxSettings {
provider: Some("daytona".into()),
preserve: None,
devcontainer: None,
local: None,
daytona: Some(fabro_sandbox::daytona::DaytonaConfig {
auto_stop_interval: Some(120),
labels: Some(std::collections::HashMap::from([
("project".into(), "implement".into()),
("team".into(), "engineering".into()),
])),
snapshot: Some(fabro_sandbox::daytona::DaytonaSnapshotConfig {
name: "implement-dev".into(),
cpu: Some(4),
memory: Some(8),
disk: Some(20),
dockerfile: None,
}),
network: None,
skip_clone: false,
}),
env: None,
}),
vars: Some(std::collections::HashMap::from([
("spec_path".into(), "specs/feature.md".into()),
("test_framework".into(), "vitest".into()),
])),
hooks: vec![],
checkpoint: Default::default(),
pull_request: None,
artifacts: None,
mcp_servers: Default::default(),
github: None,
..Default::default()
}),
graph: r#"digraph implement {
graph [
goal="",
label="Implement"
]
rankdir=LR
start [shape=Mdiamond, label="Start"]
exit [shape=Msquare, label="Exit"]
strategy [shape=hexagon, label="Choose decomposition strategy:"]
subgraph cluster_impl {
label="Implementation Loop"
node [fidelity="full", thread_id="impl"]
plan [label="Plan Implementation", prompt="@prompts/implement/plan.md", reasoning_effort="high"]
implement [label="Implement", prompt="@prompts/implement/implement.md"]
review [label="Review", prompt="@prompts/implement/review.md"]
validate [label="Validate", prompt="@prompts/implement/validate.md", goal_gate=true]
fix [label="Fix Failures", prompt="@prompts/implement/fix.md", max_visits=3]
}
start -> strategy
strategy -> plan [label="[L] Layer-by-layer"]
strategy -> plan [label="[F] Feature slice"]
strategy -> plan [label="[P] Embarrassingly parallel"]
strategy -> plan [label="[S] Sequential / linear"]
plan -> implement -> review -> validate
validate -> exit [condition="outcome=success"]
validate -> fix [condition="outcome!=success", label="Fix"]
fix -> validate
}
"#.into(),
},
WorkflowDetail {
name: "Sync Drift".into(), slug: "sync_drift".into(), filename: "sync_drift.fabro".into(),
description: "Detects configuration and code drift between environments, then generates reconciliation patches to bring everything back in sync.".into(),
settings: run_settings_to_api(fabro_types::Settings {
version: Some(1),
goal: Some("Detect and reconcile configuration drift across environments".into()),
graph: Some("sync_drift.fabro".into()),
work_dir: None,
llm: Some(fabro_config::run::LlmSettings {
model: Some("claude-sonnet".into()),
provider: None,
fallbacks: None,
}),
setup: None,
sandbox: Some(fabro_config::sandbox::SandboxSettings {
provider: Some("daytona".into()),
preserve: None,
devcontainer: None,
local: None,
daytona: Some(fabro_sandbox::daytona::DaytonaConfig {
auto_stop_interval: Some(120),
labels: Some(std::collections::HashMap::from([
("project".into(), "sync-drift".into()),
("team".into(), "platform".into()),
])),
snapshot: Some(fabro_sandbox::daytona::DaytonaSnapshotConfig {
name: "sync-drift-dev".into(),
cpu: Some(2),
memory: Some(4),
disk: Some(10),
dockerfile: None,
}),
network: None,
skip_clone: false,
}),
env: None,
}),
vars: Some(std::collections::HashMap::from([
("source_env".into(), "production".into()),
("target_env".into(), "staging".into()),
("drift_threshold".into(), "warn".into()),
])),
hooks: vec![],
checkpoint: Default::default(),
pull_request: None,
artifacts: None,
mcp_servers: Default::default(),
github: None,
..Default::default()
}),
graph: r#"digraph sync {
graph [
goal="Detect and resolve drift between product docs, architecture docs, and code",
label="Sync"
]
rankdir=LR
start [shape=Mdiamond, label="Start"]
exit [shape=Msquare, label="Exit"]
detect [label="Detect Drift", prompt="@prompts/sync/detect.md", reasoning_effort="high"]
propose [label="Propose Changes", prompt="@prompts/sync/propose.md"]
review [shape=hexagon, label="Review Changes"]
apply [label="Apply Changes", prompt="@prompts/sync/apply.md"]
start -> detect
detect -> exit [condition="context.drift_found=false", label="No drift"]
detect -> propose [condition="context.drift_found=true", label="Drift found"]
propose -> review
review -> apply [label="[A] Accept"]
review -> propose [label="[R] Revise"]
apply -> exit
}
"#.into(),
},
WorkflowDetail {
name: "Expand Product".into(), slug: "expand".into(), filename: "expand.fabro".into(),
description: "Evolves the product by analyzing usage patterns and specifications to propose and implement incremental improvements.".into(),
settings: run_settings_to_api(fabro_types::Settings {
version: Some(1),
goal: Some("Propose and implement incremental product improvements".into()),
graph: Some("expand.fabro".into()),
work_dir: None,
llm: Some(fabro_config::run::LlmSettings {
model: Some("claude-sonnet".into()),
provider: None,
fallbacks: None,
}),
setup: None,
sandbox: Some(fabro_config::sandbox::SandboxSettings {
provider: Some("daytona".into()),
preserve: None,
devcontainer: None,
local: None,
daytona: Some(fabro_sandbox::daytona::DaytonaConfig {
auto_stop_interval: Some(180),
labels: Some(std::collections::HashMap::from([
("project".into(), "expand".into()),
("team".into(), "product".into()),
])),
snapshot: Some(fabro_sandbox::daytona::DaytonaSnapshotConfig {
name: "expand-dev".into(),
cpu: Some(2),
memory: Some(4),
disk: Some(10),
dockerfile: None,
}),
network: None,
skip_clone: false,
}),
env: None,
}),
vars: Some(std::collections::HashMap::from([
("analytics_window".into(), "30d".into()),
("min_confidence".into(), "0.8".into()),
])),
hooks: vec![],
checkpoint: Default::default(),
pull_request: None,
artifacts: None,
mcp_servers: Default::default(),
github: None,
..Default::default()
}),
graph: r#"digraph expand {
graph [
goal="",
label="Expand"
]
rankdir=LR
start [shape=Mdiamond, label="Start"]
exit [shape=Msquare, label="Exit"]
propose [label="Propose Changes", prompt="@prompts/expand/propose.md", reasoning_effort="high"]
approve [shape=hexagon, label="Approve Changes"]
execute [label="Execute Changes", prompt="@prompts/expand/execute.md"]
start -> propose -> approve
approve -> execute [label="[A] Accept"]
approve -> propose [label="[R] Revise"]
execute -> exit
}
"#.into(),
},
];
items.into_iter().find(|w| w.slug == name)
}
}
mod insights {
use super::ts;
use fabro_api::types::*;

View file

@ -439,7 +439,6 @@ fn demo_routes() -> Router<Arc<AppState>> {
)
.route("/runs/{id}/usage", get(demo::get_run_usage))
.route("/runs/{id}/settings", get(demo::get_run_settings))
.route("/runs/{id}/steer", post(demo::steer_run_stub))
.route("/runs/{id}/preview", post(demo::generate_preview_url_stub))
.route("/runs/{id}/ssh", post(demo::create_ssh_access_stub))
.route(
@ -450,9 +449,6 @@ fn demo_routes() -> Router<Arc<AppState>> {
"/runs/{id}/sandbox/file",
get(demo::get_sandbox_file_stub).put(demo::put_sandbox_file_stub),
)
.route("/workflows", get(demo::list_workflows))
.route("/workflows/{name}", get(demo::get_workflow))
.route("/workflows/{name}/runs", get(demo::list_workflow_runs))
.route(
"/insights/queries",
get(demo::list_saved_queries).post(demo::save_query_stub),

View file

@ -45,14 +45,6 @@ struct PaginatedEndpoint {
}
const ENDPOINTS: &[PaginatedEndpoint] = &[
PaginatedEndpoint {
path: "/api/v1/workflows",
name: "listWorkflows",
},
PaginatedEndpoint {
path: "/api/v1/workflows/implement/runs",
name: "listWorkflowRuns",
},
PaginatedEndpoint {
path: "/api/v1/insights/queries",
name: "listSavedQueries",

View file

@ -12,7 +12,6 @@ api/secrets-api.ts
api/settings-api.ts
api/system-api.ts
api/usage-api.ts
api/workflows-api.ts
base.ts
common.ts
configuration.ts
@ -102,7 +101,6 @@ models/paginated-run-list.ts
models/paginated-run-stage-list.ts
models/paginated-saved-query-list.ts
models/paginated-stage-turn-list.ts
models/paginated-workflow-list.ts
models/pagination-meta.ts
models/preflight-check-detail.ts
models/preflight-check-report.ts
@ -167,7 +165,6 @@ models/stage-status.ts
models/stage-turn.ts
models/start-run-request.ts
models/status-reason.ts
models/steer-request.ts
models/store-run-summary.ts
models/submit-answer-request.ts
models/system-info-response.ts
@ -184,10 +181,6 @@ models/usage-totals.ts
models/user-response.ts
models/web-settings.ts
models/webhook-settings.ts
models/workflow-detail.ts
models/workflow-diagnostic.ts
models/workflow-last-run.ts
models/workflow-list-item.ts
models/workflow-reference.ts
models/workflow-schedule.ts
models/write-blob-response.ts

View file

@ -27,5 +27,4 @@ export * from './api/secrets-api';
export * from './api/settings-api';
export * from './api/system-api';
export * from './api/usage-api';
export * from './api/workflows-api';

View file

@ -36,8 +36,6 @@ import type { SshAccessRequest } from '../models';
// @ts-ignore
import type { SshAccessResponse } from '../models';
// @ts-ignore
import type { SteerRequest } from '../models';
// @ts-ignore
import type { SubmitAnswerRequest } from '../models';
/**
* HumanInTheLoopApi - axios parameter creator
@ -341,52 +339,6 @@ export const HumanInTheLoopApiAxiosParamCreator = function (configuration?: Conf
options: localVarRequestOptions,
};
},
/**
* Sends inline guidance to a running agent, targeting a specific file and line. The guidance is delivered asynchronously.
* @summary Steer Run
* @param {string} id Unique run identifier (ULID).
* @param {SteerRequest} steerRequest
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
steerRun: async (id: string, steerRequest: SteerRequest, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'id' is not null or undefined
assertParamExists('steerRun', 'id', id)
// verify required parameter 'steerRequest' is not null or undefined
assertParamExists('steerRun', 'steerRequest', steerRequest)
const localVarPath = `/api/v1/runs/{id}/steer`
.replace(`{${"id"}}`, encodeURIComponent(String(id)));
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions;
if (configuration) {
baseOptions = configuration.baseOptions;
}
const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options};
const localVarHeaderParameter = {} as any;
const localVarQueryParameter = {} as any;
// authentication mTLS required
await setApiKeyToObject(localVarHeaderParameter, "X-mTLS-Client-CN", configuration)
// authentication BearerAuth required
// http bearer authentication required
await setBearerAuthToObject(localVarHeaderParameter, configuration)
localVarHeaderParameter['Content-Type'] = 'application/json';
localVarHeaderParameter['Accept'] = 'application/json';
setSearchParams(localVarUrlObj, localVarQueryParameter);
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
localVarRequestOptions.data = serializeDataIfNeeded(steerRequest, localVarRequestOptions, configuration)
return {
url: toPathString(localVarUrlObj),
options: localVarRequestOptions,
};
},
/**
* Submits an answer to a pending question. The answer can be freeform text or a selected option key, depending on the question type.
* @summary Submit Run Answer
@ -533,20 +485,6 @@ export const HumanInTheLoopApiFp = function(configuration?: Configuration) {
const localVarOperationServerBasePath = operationServerMap['HumanInTheLoopApi.putSandboxFile']?.[localVarOperationServerIndex]?.url;
return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
},
/**
* Sends inline guidance to a running agent, targeting a specific file and line. The guidance is delivered asynchronously.
* @summary Steer Run
* @param {string} id Unique run identifier (ULID).
* @param {SteerRequest} steerRequest
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async steerRun(id: string, steerRequest: SteerRequest, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<void>> {
const localVarAxiosArgs = await localVarAxiosParamCreator.steerRun(id, steerRequest, options);
const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
const localVarOperationServerBasePath = operationServerMap['HumanInTheLoopApi.steerRun']?.[localVarOperationServerIndex]?.url;
return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
},
/**
* Submits an answer to a pending question. The answer can be freeform text or a selected option key, depending on the question type.
* @summary Submit Run Answer
@ -640,17 +578,6 @@ export const HumanInTheLoopApiFactory = function (configuration?: Configuration,
putSandboxFile(id: string, path: string, body: File, options?: RawAxiosRequestConfig): AxiosPromise<void> {
return localVarFp.putSandboxFile(id, path, body, options).then((request) => request(axios, basePath));
},
/**
* Sends inline guidance to a running agent, targeting a specific file and line. The guidance is delivered asynchronously.
* @summary Steer Run
* @param {string} id Unique run identifier (ULID).
* @param {SteerRequest} steerRequest
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
steerRun(id: string, steerRequest: SteerRequest, options?: RawAxiosRequestConfig): AxiosPromise<void> {
return localVarFp.steerRun(id, steerRequest, options).then((request) => request(axios, basePath));
},
/**
* Submits an answer to a pending question. The answer can be freeform text or a selected option key, depending on the question type.
* @summary Submit Run Answer
@ -745,18 +672,6 @@ export class HumanInTheLoopApi extends BaseAPI {
return HumanInTheLoopApiFp(this.configuration).putSandboxFile(id, path, body, options).then((request) => request(this.axios, this.basePath));
}
/**
* Sends inline guidance to a running agent, targeting a specific file and line. The guidance is delivered asynchronously.
* @summary Steer Run
* @param {string} id Unique run identifier (ULID).
* @param {SteerRequest} steerRequest
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
public steerRun(id: string, steerRequest: SteerRequest, options?: RawAxiosRequestConfig) {
return HumanInTheLoopApiFp(this.configuration).steerRun(id, steerRequest, options).then((request) => request(this.axios, this.basePath));
}
/**
* Submits an answer to a pending question. The answer can be freeform text or a selected option key, depending on the question type.
* @summary Submit Run Answer

View file

@ -1,312 +0,0 @@
/* tslint:disable */
/* eslint-disable */
/**
* Fabro Run API
* HTTP API for managing Fabro workflow run executions.
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import type { Configuration } from '../configuration';
import type { AxiosPromise, AxiosInstance, RawAxiosRequestConfig } from 'axios';
import globalAxios from 'axios';
// Some imports not used depending on template conditions
// @ts-ignore
import { DUMMY_BASE_URL, assertParamExists, setApiKeyToObject, setBasicAuthToObject, setBearerAuthToObject, setOAuthToObject, setSearchParams, serializeDataIfNeeded, toPathString, createRequestFunction, replaceWithSerializableTypeIfNeeded } from '../common';
// @ts-ignore
import { BASE_PATH, COLLECTION_FORMATS, type RequestArgs, BaseAPI, RequiredError, operationServerMap } from '../base';
// @ts-ignore
import type { ErrorResponse } from '../models';
// @ts-ignore
import type { PaginatedRunList } from '../models';
// @ts-ignore
import type { PaginatedWorkflowList } from '../models';
// @ts-ignore
import type { WorkflowDetail } from '../models';
/**
* WorkflowsApi - axios parameter creator
*/
export const WorkflowsApiAxiosParamCreator = function (configuration?: Configuration) {
return {
/**
* Returns a paginated list of runs filtered to a specific workflow.
* @summary List Workflow Runs
* @param {string} name URL-safe slug identifying a workflow definition.
* @param {number} [pageLimit] Maximum number of items to return per page.
* @param {number} [pageOffset] Number of items to skip before returning results.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
listWorkflowRuns: async (name: string, pageLimit?: number, pageOffset?: number, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'name' is not null or undefined
assertParamExists('listWorkflowRuns', 'name', name)
const localVarPath = `/api/v1/workflows/{name}/runs`
.replace(`{${"name"}}`, encodeURIComponent(String(name)));
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions;
if (configuration) {
baseOptions = configuration.baseOptions;
}
const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options};
const localVarHeaderParameter = {} as any;
const localVarQueryParameter = {} as any;
// authentication mTLS required
await setApiKeyToObject(localVarHeaderParameter, "X-mTLS-Client-CN", configuration)
// authentication BearerAuth required
// http bearer authentication required
await setBearerAuthToObject(localVarHeaderParameter, configuration)
if (pageLimit !== undefined) {
localVarQueryParameter['page[limit]'] = pageLimit;
}
if (pageOffset !== undefined) {
localVarQueryParameter['page[offset]'] = pageOffset;
}
localVarHeaderParameter['Accept'] = 'application/json';
setSearchParams(localVarUrlObj, localVarQueryParameter);
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
return {
url: toPathString(localVarUrlObj),
options: localVarRequestOptions,
};
},
/**
* Returns a paginated list of workflow definitions available for execution.
* @summary List Workflows
* @param {number} [pageLimit] Maximum number of items to return per page.
* @param {number} [pageOffset] Number of items to skip before returning results.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
listWorkflows: async (pageLimit?: number, pageOffset?: number, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
const localVarPath = `/api/v1/workflows`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions;
if (configuration) {
baseOptions = configuration.baseOptions;
}
const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options};
const localVarHeaderParameter = {} as any;
const localVarQueryParameter = {} as any;
// authentication mTLS required
await setApiKeyToObject(localVarHeaderParameter, "X-mTLS-Client-CN", configuration)
// authentication BearerAuth required
// http bearer authentication required
await setBearerAuthToObject(localVarHeaderParameter, configuration)
if (pageLimit !== undefined) {
localVarQueryParameter['page[limit]'] = pageLimit;
}
if (pageOffset !== undefined) {
localVarQueryParameter['page[offset]'] = pageOffset;
}
localVarHeaderParameter['Accept'] = 'application/json';
setSearchParams(localVarUrlObj, localVarQueryParameter);
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
return {
url: toPathString(localVarUrlObj),
options: localVarRequestOptions,
};
},
/**
* Returns the full detail of a workflow including its Graphviz graph, resolved settings, and description.
* @summary Retrieve Workflow
* @param {string} name URL-safe slug identifying a workflow definition.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
retrieveWorkflow: async (name: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'name' is not null or undefined
assertParamExists('retrieveWorkflow', 'name', name)
const localVarPath = `/api/v1/workflows/{name}`
.replace(`{${"name"}}`, encodeURIComponent(String(name)));
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions;
if (configuration) {
baseOptions = configuration.baseOptions;
}
const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options};
const localVarHeaderParameter = {} as any;
const localVarQueryParameter = {} as any;
// authentication mTLS required
await setApiKeyToObject(localVarHeaderParameter, "X-mTLS-Client-CN", configuration)
// authentication BearerAuth required
// http bearer authentication required
await setBearerAuthToObject(localVarHeaderParameter, configuration)
localVarHeaderParameter['Accept'] = 'application/json';
setSearchParams(localVarUrlObj, localVarQueryParameter);
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
return {
url: toPathString(localVarUrlObj),
options: localVarRequestOptions,
};
},
}
};
/**
* WorkflowsApi - functional programming interface
*/
export const WorkflowsApiFp = function(configuration?: Configuration) {
const localVarAxiosParamCreator = WorkflowsApiAxiosParamCreator(configuration)
return {
/**
* Returns a paginated list of runs filtered to a specific workflow.
* @summary List Workflow Runs
* @param {string} name URL-safe slug identifying a workflow definition.
* @param {number} [pageLimit] Maximum number of items to return per page.
* @param {number} [pageOffset] Number of items to skip before returning results.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async listWorkflowRuns(name: string, pageLimit?: number, pageOffset?: number, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<PaginatedRunList>> {
const localVarAxiosArgs = await localVarAxiosParamCreator.listWorkflowRuns(name, pageLimit, pageOffset, options);
const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
const localVarOperationServerBasePath = operationServerMap['WorkflowsApi.listWorkflowRuns']?.[localVarOperationServerIndex]?.url;
return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
},
/**
* Returns a paginated list of workflow definitions available for execution.
* @summary List Workflows
* @param {number} [pageLimit] Maximum number of items to return per page.
* @param {number} [pageOffset] Number of items to skip before returning results.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async listWorkflows(pageLimit?: number, pageOffset?: number, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<PaginatedWorkflowList>> {
const localVarAxiosArgs = await localVarAxiosParamCreator.listWorkflows(pageLimit, pageOffset, options);
const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
const localVarOperationServerBasePath = operationServerMap['WorkflowsApi.listWorkflows']?.[localVarOperationServerIndex]?.url;
return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
},
/**
* Returns the full detail of a workflow including its Graphviz graph, resolved settings, and description.
* @summary Retrieve Workflow
* @param {string} name URL-safe slug identifying a workflow definition.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async retrieveWorkflow(name: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<WorkflowDetail>> {
const localVarAxiosArgs = await localVarAxiosParamCreator.retrieveWorkflow(name, options);
const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
const localVarOperationServerBasePath = operationServerMap['WorkflowsApi.retrieveWorkflow']?.[localVarOperationServerIndex]?.url;
return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
},
}
};
/**
* WorkflowsApi - factory interface
*/
export const WorkflowsApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) {
const localVarFp = WorkflowsApiFp(configuration)
return {
/**
* Returns a paginated list of runs filtered to a specific workflow.
* @summary List Workflow Runs
* @param {string} name URL-safe slug identifying a workflow definition.
* @param {number} [pageLimit] Maximum number of items to return per page.
* @param {number} [pageOffset] Number of items to skip before returning results.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
listWorkflowRuns(name: string, pageLimit?: number, pageOffset?: number, options?: RawAxiosRequestConfig): AxiosPromise<PaginatedRunList> {
return localVarFp.listWorkflowRuns(name, pageLimit, pageOffset, options).then((request) => request(axios, basePath));
},
/**
* Returns a paginated list of workflow definitions available for execution.
* @summary List Workflows
* @param {number} [pageLimit] Maximum number of items to return per page.
* @param {number} [pageOffset] Number of items to skip before returning results.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
listWorkflows(pageLimit?: number, pageOffset?: number, options?: RawAxiosRequestConfig): AxiosPromise<PaginatedWorkflowList> {
return localVarFp.listWorkflows(pageLimit, pageOffset, options).then((request) => request(axios, basePath));
},
/**
* Returns the full detail of a workflow including its Graphviz graph, resolved settings, and description.
* @summary Retrieve Workflow
* @param {string} name URL-safe slug identifying a workflow definition.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
retrieveWorkflow(name: string, options?: RawAxiosRequestConfig): AxiosPromise<WorkflowDetail> {
return localVarFp.retrieveWorkflow(name, options).then((request) => request(axios, basePath));
},
};
};
/**
* WorkflowsApi - object-oriented interface
*/
export class WorkflowsApi extends BaseAPI {
/**
* Returns a paginated list of runs filtered to a specific workflow.
* @summary List Workflow Runs
* @param {string} name URL-safe slug identifying a workflow definition.
* @param {number} [pageLimit] Maximum number of items to return per page.
* @param {number} [pageOffset] Number of items to skip before returning results.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
public listWorkflowRuns(name: string, pageLimit?: number, pageOffset?: number, options?: RawAxiosRequestConfig) {
return WorkflowsApiFp(this.configuration).listWorkflowRuns(name, pageLimit, pageOffset, options).then((request) => request(this.axios, this.basePath));
}
/**
* Returns a paginated list of workflow definitions available for execution.
* @summary List Workflows
* @param {number} [pageLimit] Maximum number of items to return per page.
* @param {number} [pageOffset] Number of items to skip before returning results.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
public listWorkflows(pageLimit?: number, pageOffset?: number, options?: RawAxiosRequestConfig) {
return WorkflowsApiFp(this.configuration).listWorkflows(pageLimit, pageOffset, options).then((request) => request(this.axios, this.basePath));
}
/**
* Returns the full detail of a workflow including its Graphviz graph, resolved settings, and description.
* @summary Retrieve Workflow
* @param {string} name URL-safe slug identifying a workflow definition.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
public retrieveWorkflow(name: string, options?: RawAxiosRequestConfig) {
return WorkflowsApiFp(this.configuration).retrieveWorkflow(name, options).then((request) => request(this.axios, this.basePath));
}
}

View file

@ -82,7 +82,6 @@ export * from './paginated-run-list';
export * from './paginated-run-stage-list';
export * from './paginated-saved-query-list';
export * from './paginated-stage-turn-list';
export * from './paginated-workflow-list';
export * from './pagination-meta';
export * from './preflight-check-detail';
export * from './preflight-check-report';
@ -147,7 +146,6 @@ export * from './stage-status';
export * from './stage-turn';
export * from './start-run-request';
export * from './status-reason';
export * from './steer-request';
export * from './store-run-summary';
export * from './submit-answer-request';
export * from './system-info-response';
@ -164,10 +162,6 @@ export * from './usage-totals';
export * from './user-response';
export * from './web-settings';
export * from './webhook-settings';
export * from './workflow-detail';
export * from './workflow-diagnostic';
export * from './workflow-last-run';
export * from './workflow-list-item';
export * from './workflow-reference';
export * from './workflow-schedule';
export * from './write-blob-response';

View file

@ -1,30 +0,0 @@
/* tslint:disable */
/* eslint-disable */
/**
* Fabro Run API
* HTTP API for managing Fabro workflow run executions.
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
// May contain unused imports in some cases
// @ts-ignore
import type { PaginationMeta } from './pagination-meta';
// May contain unused imports in some cases
// @ts-ignore
import type { WorkflowListItem } from './workflow-list-item';
/**
* Paginated list of workflows.
*/
export interface PaginatedWorkflowList {
'data': Array<WorkflowListItem>;
'meta': PaginationMeta;
}

View file

@ -1,30 +0,0 @@
/* tslint:disable */
/* eslint-disable */
/**
* Fabro Run API
* HTTP API for managing Fabro workflow run executions.
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
// May contain unused imports in some cases
// @ts-ignore
import type { CodeLocation } from './code-location';
/**
* Request body for sending inline steering guidance to a running agent.
*/
export interface SteerRequest {
'location'?: CodeLocation;
/**
* Guidance text for the agent.
*/
'guidance': string;
}

View file

@ -1,46 +0,0 @@
/* tslint:disable */
/* eslint-disable */
/**
* Fabro Run API
* HTTP API for managing Fabro workflow run executions.
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
// May contain unused imports in some cases
// @ts-ignore
import type { RunSettings } from './run-settings';
/**
* Full detail of a workflow definition including graph and resolved settings.
*/
export interface WorkflowDetail {
/**
* Human-readable workflow name.
*/
'name': string;
/**
* URL-safe slug used in API paths.
*/
'slug': string;
/**
* Graphviz graph filename.
*/
'filename': string;
/**
* Prose description of what the workflow does.
*/
'description': string;
'settings': RunSettings;
/**
* Graphviz DOT language source defining the workflow graph.
*/
'graph': string;
}

View file

@ -1,26 +0,0 @@
/* tslint:disable */
/* eslint-disable */
/**
* Fabro Run API
* HTTP API for managing Fabro workflow run executions.
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
/**
* Information about a workflow\'s most recent run.
*/
export interface WorkflowLastRun {
/**
* ISO 8601 timestamp of the most recent run.
*/
'ran_at': string;
}

View file

@ -1,42 +0,0 @@
/* tslint:disable */
/* eslint-disable */
/**
* Fabro Run API
* HTTP API for managing Fabro workflow run executions.
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
// May contain unused imports in some cases
// @ts-ignore
import type { WorkflowLastRun } from './workflow-last-run';
// May contain unused imports in some cases
// @ts-ignore
import type { WorkflowSchedule } from './workflow-schedule';
/**
* Summary of a workflow shown in list views.
*/
export interface WorkflowListItem {
/**
* Human-readable workflow name.
*/
'name': string;
/**
* URL-safe slug used in API paths.
*/
'slug': string;
/**
* Graphviz graph filename.
*/
'filename': string;
'last_run'?: WorkflowLastRun;
'schedule'?: WorkflowSchedule;
}

View file

@ -1,30 +0,0 @@
/* tslint:disable */
/* eslint-disable */
/**
* Fabro Run API
* HTTP API for managing Fabro workflow run executions.
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
/**
* Schedule configuration for a workflow.
*/
export interface WorkflowSchedule {
/**
* Cron-like schedule expression.
*/
'expression': string;
/**
* ISO 8601 timestamp of the next scheduled run.
*/
'next_run'?: string;
}