mirror of
https://github.com/fabro-sh/fabro.git
synced 2026-08-28 05:27:41 +00:00
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:
parent
6b0a72ddb8
commit
e2a2696141
17 changed files with 2 additions and 1275 deletions
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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::*;
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
Loading…
Add table
Reference in a new issue