Prefix API routes with /api/v1

This commit is contained in:
Bryan Helmkamp 2026-03-30 16:00:50 -04:00
parent c866c18207
commit 55df05fe43
89 changed files with 1459 additions and 426 deletions

View file

@ -48,7 +48,7 @@ const WEB_DEFAULTS: WebConfig = {
};
const API_DEFAULTS: ApiConfig = {
base_url: "http://localhost:3000",
base_url: "http://localhost:3000/api/v1",
authentication_strategy: "jwt",
};

View file

@ -54,7 +54,7 @@ See [Server Configuration](/administration/server-configuration) for the full `s
In server mode, workflows are submitted via the REST API and executed in the background:
```bash
curl -X POST http://localhost:3000/runs \
curl -X POST http://localhost:3000/api/v1/runs \
-H "Content-Type: application/json" \
-d '{"workflow": "implement-feature", "goal": "Add user authentication"}'
```
@ -63,7 +63,7 @@ The server returns immediately with a run ID. A background scheduler promotes qu
## Run lifecycle
1. **Submit** — `POST /runs` creates the run with status `Queued`.
1. **Submit** — `POST /api/v1/runs` creates the run with status `Queued`.
2. **Schedule** — The scheduler picks up queued runs up to `max_concurrent_runs`.
3. **Execute** — The engine walks the graph, streaming events to all subscribers.
4. **Complete** — The run transitions to `Completed`, `Failed`, or `Cancelled`.
@ -116,13 +116,13 @@ The CLI can delegate commands to a running Fabro server instead of executing loc
mode = "server"
[server]
base_url = "https://fabro.example.com:3000"
base_url = "https://fabro.example.com:3000/api/v1"
```
Or use the `--server-url` flag:
```bash
fabro --server-url https://fabro.example.com:3000 model list
fabro --server-url https://fabro.example.com:3000/api/v1 model list
```
This applies to commands like `fabro model list`, `fabro llm chat`, and `fabro exec`. See [User Configuration](/reference/user-configuration#mode) for the full options including mTLS setup.

View file

@ -17,7 +17,7 @@ max_concurrent_runs = 8
data_dir = "/var/lib/fabro"
[api]
base_url = "https://fabro.example.com"
base_url = "https://fabro.example.com/api/v1"
[api.tls]
cert = "/etc/fabro/tls/cert.pem"

View file

@ -3,7 +3,7 @@ title: "Client SDKs"
description: "Language-specific clients generated from the Fabro OpenAPI spec"
---
The Fabro API is defined by an OpenAPI 3.1 specification (`docs/api-reference/fabro-api.yaml` in the repository) that serves as the single source of truth for all endpoints, request/response schemas, and parameter definitions. The spec is also available at runtime from the server at `GET /openapi.json`. Both client SDKs below are generated directly from this spec.
The Fabro API is defined by an OpenAPI 3.1 specification (`docs/api-reference/fabro-api.yaml` in the repository) that serves as the single source of truth for all endpoints, request/response schemas, and parameter definitions. The spec is also available at runtime from the server at `GET /api/v1/openapi.json`. Both client SDKs below are generated directly from this spec.
## TypeScript (Axios)

View file

@ -22,7 +22,7 @@ Requests **without** the header are routed to the real API as usual, so demo and
### With curl
```bash
curl http://localhost:3000/runs -H "X-Fabro-Demo: 1"
curl http://localhost:3000/api/v1/runs -H "X-Fabro-Demo: 1"
```
### With the Web UI
@ -54,5 +54,5 @@ Demo mode implements every API endpoint. Read endpoints return static data repre
## Limitations
- **No state changes.** Write operations return a success response but nothing is persisted. Creating a run returns a fixed ID; it won't appear in subsequent list calls.
- **No SSE streaming.** Event stream endpoints (`/runs/{id}/events`, `/sessions/{id}/events`) return immediately rather than streaming.
- **No SSE streaming.** Event stream endpoints (`/api/v1/runs/{id}/events`, `/api/v1/sessions/{id}/events`) return immediately rather than streaming.
- **Static data only.** The same data is returned regardless of path parameters — requesting any run ID returns the same run detail.

View file

@ -71,7 +71,7 @@ paths:
schema:
$ref: "#/components/schemas/HealthResponse"
/openapi.json:
/api/v1/openapi.json:
get:
operationId: getOpenApiSpec
tags: [Discovery]
@ -86,7 +86,7 @@ paths:
schema:
type: object
/user:
/api/v1/user:
get:
operationId: getUser
tags: [Discovery]
@ -108,7 +108,7 @@ paths:
# ── Runs ──────────────────────────────────────────────────────────────
/runs:
/api/v1/runs:
get:
operationId: listRuns
tags: [Runs]
@ -149,7 +149,7 @@ paths:
schema:
$ref: "#/components/schemas/ErrorResponse"
/runs/{id}:
/api/v1/runs/{id}:
get:
operationId: retrieveRun
tags: [Runs]
@ -171,7 +171,7 @@ paths:
schema:
$ref: "#/components/schemas/ErrorResponse"
/runs/{id}/cancel:
/api/v1/runs/{id}/cancel:
post:
operationId: cancelRun
tags: [Runs]
@ -199,7 +199,7 @@ paths:
schema:
$ref: "#/components/schemas/ErrorResponse"
/runs/{id}/pause:
/api/v1/runs/{id}/pause:
post:
operationId: pauseRun
tags: [Runs]
@ -227,7 +227,7 @@ paths:
schema:
$ref: "#/components/schemas/ErrorResponse"
/runs/{id}/unpause:
/api/v1/runs/{id}/unpause:
post:
operationId: unpauseRun
tags: [Runs]
@ -255,7 +255,7 @@ paths:
schema:
$ref: "#/components/schemas/ErrorResponse"
/runs/{id}/graph:
/api/v1/runs/{id}/graph:
get:
operationId: retrieveRunGraph
tags: [Runs]
@ -283,7 +283,7 @@ paths:
schema:
$ref: "#/components/schemas/ErrorResponse"
/runs/{id}/checkpoint:
/api/v1/runs/{id}/checkpoint:
get:
operationId: retrieveRunCheckpoint
tags: [Run Internals]
@ -307,7 +307,7 @@ paths:
schema:
$ref: "#/components/schemas/ErrorResponse"
/runs/{id}/context:
/api/v1/runs/{id}/context:
get:
operationId: retrieveRunContext
tags: [Run Internals]
@ -330,7 +330,7 @@ paths:
schema:
$ref: "#/components/schemas/ErrorResponse"
/runs/{id}/events:
/api/v1/runs/{id}/events:
get:
operationId: streamRunEvents
tags: [Runs]
@ -358,7 +358,7 @@ paths:
schema:
$ref: "#/components/schemas/ErrorResponse"
/runs/{id}/questions:
/api/v1/runs/{id}/questions:
get:
operationId: listRunQuestions
tags: [Human-in-the-Loop]
@ -382,7 +382,7 @@ paths:
schema:
$ref: "#/components/schemas/ErrorResponse"
/runs/{id}/questions/{qid}/answer:
/api/v1/runs/{id}/questions/{qid}/answer:
post:
operationId: submitRunAnswer
tags: [Human-in-the-Loop]
@ -419,7 +419,7 @@ paths:
schema:
$ref: "#/components/schemas/ErrorResponse"
/runs/{id}/retro:
/api/v1/runs/{id}/retro:
get:
operationId: retrieveRetro
tags: [Retros]
@ -443,7 +443,7 @@ paths:
schema:
$ref: "#/components/schemas/ErrorResponse"
/runs/{id}/stages:
/api/v1/runs/{id}/stages:
get:
operationId: listRunStages
tags: [Run Internals]
@ -467,7 +467,7 @@ paths:
schema:
$ref: "#/components/schemas/ErrorResponse"
/runs/{id}/stages/{stageId}/turns:
/api/v1/runs/{id}/stages/{stageId}/turns:
get:
operationId: listStageTurns
tags: [Run Internals]
@ -492,7 +492,7 @@ paths:
schema:
$ref: "#/components/schemas/ErrorResponse"
/runs/{id}/files:
/api/v1/runs/{id}/files:
get:
operationId: retrieveRunFiles
tags: [Run Outputs]
@ -517,7 +517,7 @@ paths:
schema:
$ref: "#/components/schemas/ErrorResponse"
/runs/{id}/usage:
/api/v1/runs/{id}/usage:
get:
operationId: retrieveRunUsage
tags: [Run Outputs]
@ -539,7 +539,7 @@ paths:
schema:
$ref: "#/components/schemas/ErrorResponse"
/runs/{id}/verification:
/api/v1/runs/{id}/verification:
get:
operationId: retrieveRunVerification
tags: [Run Outputs]
@ -563,7 +563,7 @@ paths:
schema:
$ref: "#/components/schemas/ErrorResponse"
/runs/{id}/settings:
/api/v1/runs/{id}/settings:
get:
operationId: retrieveRunSettings
tags: [Run Internals]
@ -585,7 +585,7 @@ paths:
schema:
$ref: "#/components/schemas/ErrorResponse"
/runs/{id}/steer:
/api/v1/runs/{id}/steer:
post:
operationId: steerRun
tags: [Human-in-the-Loop]
@ -615,7 +615,7 @@ paths:
schema:
$ref: "#/components/schemas/ErrorResponse"
/runs/{id}/preview:
/api/v1/runs/{id}/preview:
post:
operationId: generatePreviewUrl
tags: [Human-in-the-Loop]
@ -651,7 +651,7 @@ paths:
# ── Workflows ─────────────────────────────────────────────────────────
/workflows:
/api/v1/workflows:
get:
operationId: listWorkflows
tags: [Workflows]
@ -668,7 +668,7 @@ paths:
schema:
$ref: "#/components/schemas/PaginatedWorkflowList"
/workflows/{name}:
/api/v1/workflows/{name}:
get:
operationId: retrieveWorkflow
tags: [Workflows]
@ -690,7 +690,7 @@ paths:
schema:
$ref: "#/components/schemas/ErrorResponse"
/workflows/{name}/runs:
/api/v1/workflows/{name}/runs:
get:
operationId: listWorkflowRuns
tags: [Workflows]
@ -716,12 +716,12 @@ paths:
# ── Verification ──────────────────────────────────────────────────────
/verification/criteria:
/api/v1/verification/criteria:
get:
operationId: listVerificationCriteria
tags: [Verification]
summary: List Verification Criteria
description: Returns paginated verification criteria with their controls and performance metrics. Each criterion contains controls; retrieve a specific control via `/verification/controls/{id}`.
description: Returns paginated verification criteria with their controls and performance metrics. Each criterion contains controls; retrieve a specific control via `/api/v1/verification/controls/{id}`.
parameters:
- $ref: "#/components/parameters/PageLimit"
- $ref: "#/components/parameters/PageOffset"
@ -733,7 +733,7 @@ paths:
schema:
$ref: "#/components/schemas/PaginatedVerificationCriterionList"
/verification/criteria/{id}:
/api/v1/verification/criteria/{id}:
get:
operationId: retrieveVerificationCriterion
tags: [Verification]
@ -755,7 +755,7 @@ paths:
schema:
$ref: "#/components/schemas/ErrorResponse"
/verification/controls:
/api/v1/verification/controls:
get:
operationId: listVerificationControls
tags: [Verification]
@ -772,7 +772,7 @@ paths:
schema:
$ref: "#/components/schemas/PaginatedVerificationControlList"
/verification/controls/{id}:
/api/v1/verification/controls/{id}:
get:
operationId: retrieveVerificationControl
tags: [Verification]
@ -794,7 +794,7 @@ paths:
schema:
$ref: "#/components/schemas/ErrorResponse"
/verification/signoffs:
/api/v1/verification/signoffs:
get:
operationId: listSignoffs
tags: [Verification]
@ -838,7 +838,7 @@ paths:
schema:
$ref: "#/components/schemas/ErrorResponse"
/verification/signoffs/{id}:
/api/v1/verification/signoffs/{id}:
get:
operationId: retrieveSignoff
tags: [Verification]
@ -862,7 +862,7 @@ paths:
# ── Retros ────────────────────────────────────────────────────────────
/retros:
/api/v1/retros:
get:
operationId: listRetros
tags: [Retros]
@ -883,7 +883,7 @@ paths:
# ── Sessions ──────────────────────────────────────────────────────────
/sessions:
/api/v1/sessions:
get:
operationId: listSessions
tags: [Sessions]
@ -918,7 +918,7 @@ paths:
schema:
$ref: "#/components/schemas/CreateSessionResponse"
/sessions/{id}:
/api/v1/sessions/{id}:
get:
operationId: retrieveSession
tags: [Sessions]
@ -940,7 +940,7 @@ paths:
schema:
$ref: "#/components/schemas/ErrorResponse"
/sessions/{id}/messages:
/api/v1/sessions/{id}/messages:
post:
operationId: sendSessionMessage
tags: [Sessions]
@ -968,7 +968,7 @@ paths:
schema:
$ref: "#/components/schemas/ErrorResponse"
/sessions/{id}/events:
/api/v1/sessions/{id}/events:
get:
operationId: streamSessionEvents
tags: [Sessions]
@ -1016,7 +1016,7 @@ paths:
# ── Insights ──────────────────────────────────────────────────────────
/insights/queries:
/api/v1/insights/queries:
get:
operationId: listSavedQueries
tags: [Insights]
@ -1051,7 +1051,7 @@ paths:
schema:
$ref: "#/components/schemas/SavedQuery"
/insights/queries/{id}:
/api/v1/insights/queries/{id}:
get:
operationId: retrieveSavedQuery
tags: [Insights]
@ -1115,7 +1115,7 @@ paths:
schema:
$ref: "#/components/schemas/ErrorResponse"
/insights/execute:
/api/v1/insights/execute:
post:
operationId: executeQuery
tags: [Insights]
@ -1141,7 +1141,7 @@ paths:
schema:
$ref: "#/components/schemas/ErrorResponse"
/insights/history:
/api/v1/insights/history:
get:
operationId: listQueryHistory
tags: [Insights]
@ -1160,7 +1160,7 @@ paths:
# ── Usage ────────────────────────────────────────────────────────────
/usage:
/api/v1/usage:
get:
operationId: getAggregateUsage
tags: [Usage]
@ -1176,7 +1176,7 @@ paths:
# ── Models ───────────────────────────────────────────────────────────
/models:
/api/v1/models:
get:
operationId: listModels
tags: [Models]
@ -1193,7 +1193,7 @@ paths:
schema:
$ref: "#/components/schemas/PaginatedModelList"
/models/{id}/test:
/api/v1/models/{id}/test:
post:
operationId: testModel
tags: [Models]
@ -1222,7 +1222,7 @@ paths:
# ── Completions ───────────────────────────────────────────────────────
/completions:
/api/v1/completions:
post:
operationId: createCompletion
tags: [Completions]
@ -1255,7 +1255,7 @@ paths:
# ── Settings ──────────────────────────────────────────────────────────
/settings:
/api/v1/settings:
get:
operationId: retrieveServerSettings
tags: [Settings]
@ -4498,11 +4498,11 @@ components:
openapi_url:
type: string
description: URL of the OpenAPI JSON specification.
example: /openapi.json
example: /api/v1/openapi.json
current_user_url:
type: string
description: URL of the current user endpoint.
example: /user
example: /api/v1/user
health_url:
type: string
description: URL of the health check endpoint.

View file

@ -11,17 +11,17 @@ The Fabro API is a REST API for managing workflow runs, interactive sessions, an
## Base URL
The API is served by `fabro serve`, which defaults to:
The versioned API is served by `fabro serve`, which defaults to:
```
http://localhost:3000
http://localhost:3000/api/v1
```
The base URL is configurable via `server.toml`:
```toml title="server.toml"
[api]
base_url = "https://fabro.example.com"
base_url = "https://fabro.example.com/api/v1"
```
## Authentication
@ -142,8 +142,8 @@ When `has_more` is `true`, increment the offset by the limit to fetch the next p
## Versioning
The Fabro API does not currently use versioning. All endpoints reflect the latest behavior of the running server. Breaking changes will be communicated in the [changelog](/changelog/2026-03-06).
The Fabro API is versioned under `/api/v1`. All versioned endpoints, including the OpenAPI document, live under that prefix. Future breaking changes can be introduced under a new versioned prefix while preserving existing clients.
## Discovery
The root endpoint (`GET /`) returns discovery URLs. The health endpoint (`GET /health`) can be used for liveness checks. The OpenAPI spec is available at `GET /openapi.json`.
The root endpoint (`GET /`) returns discovery URLs. The health endpoint (`GET /health`) can be used for liveness checks. The OpenAPI spec is available at `GET /api/v1/openapi.json`.

View file

@ -181,41 +181,41 @@
"group": "Runs",
"icon": "play",
"pages": [
"GET /runs",
"POST /runs",
"GET /runs/{id}",
"POST /runs/{id}/cancel",
"POST /runs/{id}/pause",
"POST /runs/{id}/unpause",
"GET /runs/{id}/graph",
"GET /runs/{id}/events"
"GET /api/v1/runs",
"POST /api/v1/runs",
"GET /api/v1/runs/{id}",
"POST /api/v1/runs/{id}/cancel",
"POST /api/v1/runs/{id}/pause",
"POST /api/v1/runs/{id}/unpause",
"GET /api/v1/runs/{id}/graph",
"GET /api/v1/runs/{id}/events"
]
},
{
"group": "Human-in-the-Loop",
"icon": "hand",
"pages": [
"GET /runs/{id}/questions",
"POST /runs/{id}/questions/{qid}/answer",
"POST /runs/{id}/steer",
"POST /runs/{id}/preview"
"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"
]
},
{
"group": "Run Outputs",
"icon": "file-export",
"pages": [
"GET /runs/{id}/files",
"GET /runs/{id}/usage",
"GET /api/v1/runs/{id}/files",
"GET /api/v1/runs/{id}/usage",
{
"group": "Run Internals",
"icon": "microchip",
"pages": [
"GET /runs/{id}/checkpoint",
"GET /runs/{id}/context",
"GET /runs/{id}/stages",
"GET /runs/{id}/stages/{stageId}/turns",
"GET /runs/{id}/settings"
"GET /api/v1/runs/{id}/checkpoint",
"GET /api/v1/runs/{id}/context",
"GET /api/v1/runs/{id}/stages",
"GET /api/v1/runs/{id}/stages/{stageId}/turns",
"GET /api/v1/runs/{id}/settings"
]
}
]
@ -224,9 +224,9 @@
"group": "Workflows",
"icon": "diagram-project",
"pages": [
"GET /workflows",
"GET /workflows/{name}",
"GET /workflows/{name}/runs"
"GET /api/v1/workflows",
"GET /api/v1/workflows/{name}",
"GET /api/v1/workflows/{name}/runs"
]
},
{
@ -237,26 +237,26 @@
"group": "Administration",
"icon": "gear",
"pages": [
"GET /settings"
"GET /api/v1/settings"
]
},
{
"group": "Models",
"icon": "microchip",
"pages": [
"GET /models",
"POST /models/{id}/test"
"GET /api/v1/models",
"POST /api/v1/models/{id}/test"
]
},
{
"group": "Sessions",
"icon": "comments",
"pages": [
"GET /sessions",
"POST /sessions",
"GET /sessions/{id}",
"POST /sessions/{id}/messages",
"GET /sessions/{id}/events"
"GET /api/v1/sessions",
"POST /api/v1/sessions",
"GET /api/v1/sessions/{id}",
"POST /api/v1/sessions/{id}/messages",
"GET /api/v1/sessions/{id}/events"
]
}
]

View file

@ -36,7 +36,7 @@ When viewing a run with an active sandbox, the run detail page shows a **Preview
## Using preview from the API
Generate a preview URL by calling `POST /runs/{id}/preview` with the target port and a TTL in seconds. See the [Preview URL API reference](/api-reference/human-in-the-loop/preview-url) for the full request/response schema.
Generate a preview URL by calling `POST /api/v1/runs/{id}/preview` with the target port and a TTL in seconds. See the [Preview URL API reference](/api-reference/human-in-the-loop/preview-url) for the full request/response schema.
## Common use cases

View file

@ -11,7 +11,7 @@ A steering message is injected into the agent's conversation as a user-role mess
The delivery flow:
1. You send a `POST /runs/{id}/steer` request with your guidance text
1. You send a `POST /api/v1/runs/{id}/steer` 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

View file

@ -46,7 +46,7 @@ Key server config options:
### Run lifecycle
1. **Submit** — `POST /runs` with a Graphviz workflow source. The run is created with status `Queued` and the response returns immediately with the run ID.
1. **Submit** — `POST /api/v1/runs` with a Graphviz workflow source. The run is created with status `Queued` and the response returns immediately with the run ID.
2. **Schedule** — A background scheduler promotes queued runs to `Running` in FIFO order, up to the concurrency limit.
3. **Execute** — The engine walks the graph, streaming events to all subscribers.
4. **Complete** — The run transitions to `Completed`, `Failed`, or `Cancelled`.

View file

@ -283,7 +283,7 @@ Start an interactive multi-turn chat session. In server mode, the session is bac
```bash
fabro llm chat
fabro llm chat -m claude-opus-4-6 -s "You are a helpful coding assistant"
fabro llm chat --server-url http://localhost:3000
fabro llm chat --server-url http://localhost:3000/api/v1
```
| Flag | Description |
@ -301,7 +301,7 @@ List available LLM models from the built-in catalog. Running `fabro model` with
fabro model list
fabro model list -p anthropic
fabro model list -q sonnet
fabro model list --server-url http://localhost:3000
fabro model list --server-url http://localhost:3000/api/v1
```
| Flag | Description |

View file

@ -25,7 +25,7 @@ upgrade_check = true
mode = "server"
[server]
base_url = "https://fabro.example.com:3000"
base_url = "https://fabro.example.com:3000/api/v1"
[server.tls]
cert = "~/.fabro/tls/client.crt"
@ -164,12 +164,12 @@ Configuration for server mode.
| Key | Description | Default |
|---|---|---|
| `base_url` | Server URL | `"http://localhost:3000"` |
| `base_url` | Server URL | `"http://localhost:3000/api/v1"` |
Passing `--server-url` implies server mode and overrides `server.base_url`:
```bash
fabro --server-url https://fabro.example.com:3000 model list
fabro --server-url https://fabro.example.com:3000/api/v1 model list
```
### `[server.tls]` section

View file

@ -198,7 +198,7 @@ provider = "github"
allowed_usernames = ["{username}"]
[api]
base_url = "https://localhost:3000"
base_url = "https://localhost:3000/api/v1"
authentication_strategies = ["jwt", "mtls"]
[api.tls]

View file

@ -51,7 +51,7 @@ pub(crate) struct ResolvedMode {
}
#[cfg(feature = "server")]
const DEFAULT_SERVER_URL: &str = "http://localhost:3000";
const DEFAULT_SERVER_URL: &str = "http://localhost:3000/api/v1";
#[cfg(feature = "server")]
pub(crate) fn resolve_mode(

View file

@ -61,7 +61,7 @@ pub struct ApiConfig {
}
fn default_base_url() -> String {
"http://localhost:3000".to_string()
"http://localhost:3000/api/v1".to_string()
}
impl TryFrom<ApiConfig> for ApiSettings {

View file

@ -145,20 +145,23 @@ impl AppState {
/// with the `X-Fabro-Demo: 1` header are dispatched to the demo router;
/// all other requests go to the real router.
pub fn build_router(state: Arc<AppState>, auth_mode: AuthMode) -> Router {
let common = Router::new()
let root_routes = Router::new()
.route("/", get(root))
.route("/health", get(health))
.route("/health", get(health));
let api_common = Router::new()
.route("/openapi.json", get(openapi_spec))
.route("/user", get(get_user));
let demo_router = common
.clone()
.merge(demo_routes())
let demo_router = Router::new()
.merge(root_routes.clone())
.nest("/api/v1", api_common.clone().merge(demo_routes()))
.layer(axum::Extension(AuthMode::Disabled))
.with_state(state.clone());
let real_router = common
.merge(real_routes())
let real_router = Router::new()
.merge(root_routes)
.nest("/api/v1", api_common.merge(real_routes()))
.layer(axum::Extension(auth_mode))
.with_state(state);
@ -324,8 +327,8 @@ async fn not_implemented() -> Response {
async fn root() -> Response {
Json(serde_json::json!({
"urls": {
"openapi_url": "/openapi.json",
"current_user_url": "/user",
"openapi_url": "/api/v1/openapi.json",
"current_user_url": "/api/v1/user",
"health_url": "/health"
}
}))
@ -1650,13 +1653,17 @@ mod tests {
serde_json::from_slice(&bytes).unwrap()
}
fn api(path: &str) -> String {
format!("/api/v1{path}")
}
#[tokio::test]
async fn test_model_unknown_returns_404() {
let app = test_app_with(test_db().await);
let req = Request::builder()
.method("POST")
.uri("/models/nonexistent-model-xyz/test")
.uri(api("/models/nonexistent-model-xyz/test"))
.header("content-type", "application/json")
.body(Body::empty())
.unwrap();
@ -1671,7 +1678,7 @@ mod tests {
let req = Request::builder()
.method("POST")
.uri("/models/claude-opus-4-6/test")
.uri(api("/models/claude-opus-4-6/test"))
.header("content-type", "application/json")
.body(Body::empty())
.unwrap();
@ -1691,7 +1698,7 @@ mod tests {
let req = Request::builder()
.method("POST")
.uri("/models/claude-opus-4-6/test")
.uri(api("/models/claude-opus-4-6/test"))
.header("content-type", "application/json")
.body(Body::empty())
.unwrap();
@ -1711,7 +1718,7 @@ mod tests {
let req = Request::builder()
.method("POST")
.uri("/models/nonexistent-model-xyz/test")
.uri(api("/models/nonexistent-model-xyz/test"))
.header("content-type", "application/json")
.body(Body::empty())
.unwrap();
@ -1726,7 +1733,7 @@ mod tests {
let req = Request::builder()
.method("POST")
.uri("/runs")
.uri(api("/runs"))
.header("content-type", "application/json")
.body(Body::from(
serde_json::to_string(&serde_json::json!({"dot_source": MINIMAL_DOT})).unwrap(),
@ -1747,7 +1754,7 @@ mod tests {
let req = Request::builder()
.method("POST")
.uri("/runs")
.uri(api("/runs"))
.header("content-type", "application/json")
.body(Body::from(
serde_json::to_string(&serde_json::json!({"dot_source": "not a graph"})).unwrap(),
@ -1766,7 +1773,7 @@ mod tests {
// Start a run
let req = Request::builder()
.method("POST")
.uri("/runs")
.uri(api("/runs"))
.header("content-type", "application/json")
.body(Body::from(
serde_json::to_string(&serde_json::json!({"dot_source": MINIMAL_DOT})).unwrap(),
@ -1783,7 +1790,7 @@ mod tests {
// Check status
let req = Request::builder()
.method("GET")
.uri(format!("/runs/{run_id}"))
.uri(api(&format!("/runs/{run_id}")))
.body(Body::empty())
.unwrap();
@ -1809,7 +1816,7 @@ mod tests {
let req = Request::builder()
.method("GET")
.uri(format!("/runs/{missing_run_id}"))
.uri(api(&format!("/runs/{missing_run_id}")))
.body(Body::empty())
.unwrap();
@ -1825,7 +1832,7 @@ mod tests {
// Start a run
let req = Request::builder()
.method("POST")
.uri("/runs")
.uri(api("/runs"))
.header("content-type", "application/json")
.body(Body::from(
serde_json::to_string(&serde_json::json!({"dot_source": MINIMAL_DOT})).unwrap(),
@ -1839,7 +1846,7 @@ mod tests {
// Get questions (should be empty for a run without wait.human nodes)
let req = Request::builder()
.method("GET")
.uri(format!("/runs/{run_id}/questions"))
.uri(api(&format!("/runs/{run_id}/questions")))
.body(Body::empty())
.unwrap();
@ -1858,7 +1865,7 @@ mod tests {
let req = Request::builder()
.method("POST")
.uri(format!("/runs/{missing_run_id}/questions/q1/answer"))
.uri(api(&format!("/runs/{missing_run_id}/questions/q1/answer")))
.header("content-type", "application/json")
.body(Body::from(
serde_json::to_string(&serde_json::json!({"value": "yes"})).unwrap(),
@ -1876,7 +1883,7 @@ mod tests {
let req = Request::builder()
.method("GET")
.uri(format!("/runs/{missing_run_id}/events"))
.uri(api(&format!("/runs/{missing_run_id}/events")))
.body(Body::empty())
.unwrap();
@ -1892,7 +1899,7 @@ mod tests {
// Start a run
let req = Request::builder()
.method("POST")
.uri("/runs")
.uri(api("/runs"))
.header("content-type", "application/json")
.body(Body::from(
serde_json::to_string(&serde_json::json!({"dot_source": MINIMAL_DOT})).unwrap(),
@ -1906,7 +1913,7 @@ mod tests {
// Get checkpoint immediately (before run completes, may be null)
let req = Request::builder()
.method("GET")
.uri(format!("/runs/{run_id}/checkpoint"))
.uri(api(&format!("/runs/{run_id}/checkpoint")))
.body(Body::empty())
.unwrap();
@ -1922,7 +1929,7 @@ mod tests {
// Start a run
let req = Request::builder()
.method("POST")
.uri("/runs")
.uri(api("/runs"))
.header("content-type", "application/json")
.body(Body::from(
serde_json::to_string(&serde_json::json!({"dot_source": MINIMAL_DOT})).unwrap(),
@ -1936,7 +1943,7 @@ mod tests {
// Get context
let req = Request::builder()
.method("GET")
.uri(format!("/runs/{run_id}/context"))
.uri(api(&format!("/runs/{run_id}/context")))
.body(Body::empty())
.unwrap();
@ -1955,7 +1962,7 @@ mod tests {
// Start a run
let req = Request::builder()
.method("POST")
.uri("/runs")
.uri(api("/runs"))
.header("content-type", "application/json")
.body(Body::from(
serde_json::to_string(&serde_json::json!({"dot_source": MINIMAL_DOT})).unwrap(),
@ -1969,7 +1976,7 @@ mod tests {
// Cancel it
let req = Request::builder()
.method("POST")
.uri(format!("/runs/{run_id}/cancel"))
.uri(api(&format!("/runs/{run_id}/cancel")))
.body(Body::empty())
.unwrap();
@ -1989,7 +1996,7 @@ mod tests {
let req = Request::builder()
.method("POST")
.uri(format!("/runs/{missing_run_id}/cancel"))
.uri(api(&format!("/runs/{missing_run_id}/cancel")))
.body(Body::empty())
.unwrap();
@ -2005,7 +2012,7 @@ mod tests {
// Start a run
let req = Request::builder()
.method("POST")
.uri("/runs")
.uri(api("/runs"))
.header("content-type", "application/json")
.body(Body::from(
serde_json::to_string(&serde_json::json!({"dot_source": MINIMAL_DOT})).unwrap(),
@ -2022,7 +2029,7 @@ mod tests {
// Request the SSE stream
let req = Request::builder()
.method("GET")
.uri(format!("/runs/{run_id}/events"))
.uri(api(&format!("/runs/{run_id}/events")))
.body(Body::empty())
.unwrap();
@ -2056,7 +2063,7 @@ mod tests {
// Start a run
let req = Request::builder()
.method("POST")
.uri("/runs")
.uri(api("/runs"))
.header("content-type", "application/json")
.body(Body::from(
serde_json::to_string(&serde_json::json!({"dot_source": MINIMAL_DOT})).unwrap(),
@ -2073,7 +2080,7 @@ mod tests {
tokio::time::sleep(std::time::Duration::from_millis(10)).await;
let req = Request::builder()
.method("GET")
.uri(format!("/runs/{run_id}"))
.uri(api(&format!("/runs/{run_id}")))
.body(Body::empty())
.unwrap();
let response = app.clone().oneshot(req).await.unwrap();
@ -2095,7 +2102,7 @@ mod tests {
// Start a run
let req = Request::builder()
.method("POST")
.uri("/runs")
.uri(api("/runs"))
.header("content-type", "application/json")
.body(Body::from(
serde_json::to_string(&serde_json::json!({"dot_source": MINIMAL_DOT})).unwrap(),
@ -2109,7 +2116,7 @@ mod tests {
// Request graph SVG
let req = Request::builder()
.method("GET")
.uri(format!("/runs/{run_id}/graph"))
.uri(api(&format!("/runs/{run_id}/graph")))
.body(Body::empty())
.unwrap();
@ -2146,7 +2153,7 @@ mod tests {
let req = Request::builder()
.method("GET")
.uri(format!("/runs/{missing_run_id}/graph"))
.uri(api(&format!("/runs/{missing_run_id}/graph")))
.body(Body::empty())
.unwrap();
@ -2162,7 +2169,7 @@ mod tests {
// List should be empty initially
let req = Request::builder()
.method("GET")
.uri("/runs")
.uri(api("/runs"))
.body(Body::empty())
.unwrap();
@ -2175,7 +2182,7 @@ mod tests {
// Start a run
let req = Request::builder()
.method("POST")
.uri("/runs")
.uri(api("/runs"))
.header("content-type", "application/json")
.body(Body::from(
serde_json::to_string(&serde_json::json!({"dot_source": MINIMAL_DOT})).unwrap(),
@ -2189,7 +2196,7 @@ mod tests {
// List should now contain one run
let req = Request::builder()
.method("GET")
.uri("/runs")
.uri(api("/runs"))
.body(Body::empty())
.unwrap();
@ -2210,7 +2217,7 @@ mod tests {
let req = Request::builder()
.method("GET")
.uri("/usage")
.uri(api("/usage"))
.body(Body::empty())
.unwrap();
@ -2234,7 +2241,7 @@ mod tests {
// Start a run
let req = Request::builder()
.method("POST")
.uri("/runs")
.uri(api("/runs"))
.header("content-type", "application/json")
.body(Body::from(
serde_json::to_string(&serde_json::json!({"dot_source": MINIMAL_DOT})).unwrap(),
@ -2251,7 +2258,7 @@ mod tests {
tokio::time::sleep(std::time::Duration::from_millis(10)).await;
let req = Request::builder()
.method("GET")
.uri(format!("/runs/{run_id}"))
.uri(api(&format!("/runs/{run_id}")))
.body(Body::empty())
.unwrap();
let response = app.clone().oneshot(req).await.unwrap();
@ -2266,7 +2273,7 @@ mod tests {
// Check aggregate usage
let req = Request::builder()
.method("GET")
.uri("/usage")
.uri(api("/usage"))
.body(Body::empty())
.unwrap();
@ -2284,7 +2291,7 @@ mod tests {
let req = Request::builder()
.method("POST")
.uri("/runs")
.uri(api("/runs"))
.header("content-type", "application/json")
.body(Body::from(
serde_json::to_string(&serde_json::json!({"dot_source": MINIMAL_DOT})).unwrap(),
@ -2299,7 +2306,7 @@ mod tests {
// Check status is queued (no scheduler running)
let req = Request::builder()
.method("GET")
.uri(format!("/runs/{run_id}"))
.uri(api(&format!("/runs/{run_id}")))
.body(Body::empty())
.unwrap();
@ -2357,7 +2364,7 @@ mod tests {
let req = Request::builder()
.method("POST")
.uri("/runs")
.uri(api("/runs"))
.header("content-type", "application/json")
.body(Body::from(
serde_json::to_string(&serde_json::json!({"dot_source": MINIMAL_DOT})).unwrap(),
@ -2393,7 +2400,7 @@ mod tests {
let req = Request::builder()
.method("POST")
.uri("/runs")
.uri(api("/runs"))
.header("content-type", "application/json")
.body(Body::from(
serde_json::to_string(&serde_json::json!({ "dot_source": dot })).unwrap(),
@ -2427,7 +2434,7 @@ mod tests {
// Submit a run (no scheduler, stays queued)
let req = Request::builder()
.method("POST")
.uri("/runs")
.uri(api("/runs"))
.header("content-type", "application/json")
.body(Body::from(
serde_json::to_string(&serde_json::json!({"dot_source": MINIMAL_DOT})).unwrap(),
@ -2441,7 +2448,7 @@ mod tests {
// Cancel it
let req = Request::builder()
.method("POST")
.uri(format!("/runs/{run_id}/cancel"))
.uri(api(&format!("/runs/{run_id}/cancel")))
.body(Body::empty())
.unwrap();
@ -2451,7 +2458,7 @@ mod tests {
// Verify status is cancelled
let req = Request::builder()
.method("GET")
.uri(format!("/runs/{run_id}"))
.uri(api(&format!("/runs/{run_id}")))
.body(Body::empty())
.unwrap();
@ -2474,7 +2481,7 @@ mod tests {
let req = Request::builder()
.method("POST")
.uri("/runs")
.uri(api("/runs"))
.header("content-type", "application/json")
.body(Body::from(
serde_json::to_string(&serde_json::json!({"dot_source": MINIMAL_DOT})).unwrap(),
@ -2547,7 +2554,7 @@ mod tests {
let req = Request::builder()
.method("POST")
.uri("/runs")
.uri(api("/runs"))
.header("content-type", "application/json")
.body(Body::from(
serde_json::to_string(&serde_json::json!({"dot_source": MINIMAL_DOT})).unwrap(),
@ -2563,7 +2570,7 @@ mod tests {
let req = Request::builder()
.method("POST")
.uri(format!("/runs/{run_id}/cancel"))
.uri(api(&format!("/runs/{run_id}/cancel")))
.body(Body::empty())
.unwrap();
let response = app.clone().oneshot(req).await.unwrap();
@ -2573,7 +2580,7 @@ mod tests {
let req = Request::builder()
.method("GET")
.uri(format!("/runs/{run_id}/events"))
.uri(api(&format!("/runs/{run_id}/events")))
.body(Body::empty())
.unwrap();
let response = app.oneshot(req).await.unwrap();
@ -2590,7 +2597,7 @@ mod tests {
for _ in 0..2 {
let req = Request::builder()
.method("POST")
.uri("/runs")
.uri(api("/runs"))
.header("content-type", "application/json")
.body(Body::from(
serde_json::to_string(&serde_json::json!({"dot_source": MINIMAL_DOT})).unwrap(),
@ -2605,7 +2612,7 @@ mod tests {
// Check queue positions via individual status
let req = Request::builder()
.method("GET")
.uri(format!("/runs/{}", run_ids[0]))
.uri(api(&format!("/runs/{}", run_ids[0])))
.body(Body::empty())
.unwrap();
let response = app.clone().oneshot(req).await.unwrap();
@ -2614,7 +2621,7 @@ mod tests {
let req = Request::builder()
.method("GET")
.uri(format!("/runs/{}", run_ids[1]))
.uri(api(&format!("/runs/{}", run_ids[1])))
.body(Body::empty())
.unwrap();
let response = app.clone().oneshot(req).await.unwrap();
@ -2632,7 +2639,7 @@ mod tests {
for _ in 0..2 {
let req = Request::builder()
.method("POST")
.uri("/runs")
.uri(api("/runs"))
.header("content-type", "application/json")
.body(Body::from(
serde_json::to_string(&serde_json::json!({"dot_source": MINIMAL_DOT})).unwrap(),
@ -2650,7 +2657,7 @@ mod tests {
// Check statuses: at most 1 should be starting/running, the other queued
let req = Request::builder()
.method("GET")
.uri("/runs")
.uri(api("/runs"))
.body(Body::empty())
.unwrap();
let response = app.clone().oneshot(req).await.unwrap();
@ -2678,7 +2685,7 @@ mod tests {
let req = Request::builder()
.method("POST")
.uri("/runs")
.uri(api("/runs"))
.header("content-type", "application/json")
.body(Body::from(
serde_json::to_string(&serde_json::json!({"dot_source": MINIMAL_DOT})).unwrap(),
@ -2692,7 +2699,7 @@ mod tests {
// Try to submit an answer to a queued run
let req = Request::builder()
.method("POST")
.uri(format!("/runs/{run_id}/questions/q1/answer"))
.uri(api(&format!("/runs/{run_id}/questions/q1/answer")))
.header("content-type", "application/json")
.body(Body::from(
serde_json::to_string(&serde_json::json!({"value": "yes"})).unwrap(),
@ -2710,7 +2717,7 @@ mod tests {
let req = Request::builder()
.method("POST")
.uri("/completions")
.uri(api("/completions"))
.header("content-type", "application/json")
.body(Body::from(
serde_json::to_string(&serde_json::json!({
@ -2740,7 +2747,7 @@ mod tests {
let req = Request::builder()
.method("POST")
.uri("/completions")
.uri(api("/completions"))
.header("content-type", "application/json")
.body(Body::from(
serde_json::to_string(&serde_json::json!({
@ -2770,7 +2777,7 @@ mod tests {
let req = Request::builder()
.method("POST")
.uri("/completions")
.uri(api("/completions"))
.header("content-type", "application/json")
.body(Body::from("{}"))
.unwrap();

View file

@ -458,10 +458,14 @@ mod tests {
serde_json::from_slice(&bytes).unwrap()
}
fn api(path: &str) -> String {
format!("/api/v1{path}")
}
async fn create_test_session(app: &axum::Router) -> serde_json::Value {
let req = Request::builder()
.method("POST")
.uri("/sessions")
.uri(api("/sessions"))
.header("content-type", "application/json")
.body(Body::from(
serde_json::to_string(&serde_json::json!({
@ -499,7 +503,7 @@ mod tests {
let req = Request::builder()
.method("GET")
.uri(format!("/sessions/{session_id}"))
.uri(api(&format!("/sessions/{session_id}")))
.body(Body::empty())
.unwrap();
@ -520,7 +524,7 @@ mod tests {
let req = Request::builder()
.method("GET")
.uri("/sessions/a1b2c3d4-e5f6-7890-abcd-ef1234567890")
.uri(api("/sessions/a1b2c3d4-e5f6-7890-abcd-ef1234567890"))
.body(Body::empty())
.unwrap();
@ -536,7 +540,7 @@ mod tests {
let req = Request::builder()
.method("POST")
.uri(format!("/sessions/{session_id}/messages"))
.uri(api(&format!("/sessions/{session_id}/messages")))
.header("content-type", "application/json")
.body(Body::from(
serde_json::to_string(&serde_json::json!({
@ -559,7 +563,9 @@ mod tests {
let req = Request::builder()
.method("POST")
.uri("/sessions/a1b2c3d4-e5f6-7890-abcd-ef1234567890/messages")
.uri(api(
"/sessions/a1b2c3d4-e5f6-7890-abcd-ef1234567890/messages",
))
.header("content-type", "application/json")
.body(Body::from(
serde_json::to_string(&serde_json::json!({
@ -579,7 +585,7 @@ mod tests {
let req = Request::builder()
.method("GET")
.uri("/sessions")
.uri(api("/sessions"))
.body(Body::empty())
.unwrap();
@ -598,7 +604,7 @@ mod tests {
let req = Request::builder()
.method("GET")
.uri("/sessions")
.uri(api("/sessions"))
.body(Body::empty())
.unwrap();
@ -620,7 +626,7 @@ mod tests {
let req = Request::builder()
.method("GET")
.uri(format!("/sessions/{session_id}/events"))
.uri(api(&format!("/sessions/{session_id}/events")))
.body(Body::empty())
.unwrap();

View file

@ -4,9 +4,14 @@
#![allow(clippy::absolute_paths)]
fn api(path: &str) -> String {
format!("/api/v1{path}")
}
// Skip on macOS: LibreSSL generates certs with extensions rustls rejects
#[cfg(target_os = "linux")]
mod mtls_e2e {
use super::api;
use std::path::Path;
use std::process::{Command, Stdio};
@ -239,7 +244,7 @@ mod mtls_e2e {
let client = build_client(&pki.ca_cert, Some(&pki.client_cert), Some(&pki.client_key));
let response = client
.get(format!("https://127.0.0.1:{}/runs", addr.port()))
.get(format!("https://127.0.0.1:{}{}", addr.port(), api("/runs")))
.send()
.await
.expect("request with valid client cert should succeed");
@ -275,7 +280,7 @@ mod mtls_e2e {
);
let result = client
.get(format!("https://127.0.0.1:{}/runs", addr.port()))
.get(format!("https://127.0.0.1:{}{}", addr.port(), api("/runs")))
.send()
.await;
@ -308,7 +313,7 @@ mod mtls_e2e {
let client = build_client(&pki.ca_cert, None, None);
let result = client
.get(format!("https://127.0.0.1:{}/runs", addr.port()))
.get(format!("https://127.0.0.1:{}{}", addr.port(), api("/runs")))
.send()
.await;
@ -394,7 +399,7 @@ mod mtls_e2e {
let token = sign_jwt(&encoding_key, "https://github.com/brynary");
let response = client
.get(format!("https://127.0.0.1:{}/runs", addr.port()))
.get(format!("https://127.0.0.1:{}{}", addr.port(), api("/runs")))
.bearer_auth(&token)
.send()
.await
@ -414,6 +419,7 @@ mod mtls_e2e {
mod server_lifecycle {
use super::super::helpers::test_db;
use super::api;
use std::sync::Arc;
use std::time::Duration;
@ -470,7 +476,7 @@ mod server_lifecycle {
// 1. Start run
let req = Request::builder()
.method("POST")
.uri("/runs")
.uri(api("/runs"))
.header("content-type", "application/json")
.body(Body::from(
serde_json::to_string(&serde_json::json!({"dot_source": GATE_DOT})).unwrap(),
@ -488,7 +494,7 @@ mod server_lifecycle {
tokio::time::sleep(Duration::from_millis(10)).await;
let req = Request::builder()
.method("GET")
.uri(format!("/runs/{run_id}/questions"))
.uri(api(&format!("/runs/{run_id}/questions")))
.body(Body::empty())
.unwrap();
let response = app.clone().oneshot(req).await.unwrap();
@ -504,7 +510,9 @@ mod server_lifecycle {
// 3. Submit answer selecting first option (Approve)
let req = Request::builder()
.method("POST")
.uri(format!("/runs/{run_id}/questions/{question_id}/answer"))
.uri(api(&format!(
"/runs/{run_id}/questions/{question_id}/answer"
)))
.header("content-type", "application/json")
.body(Body::from(
serde_json::to_string(&serde_json::json!({"value": "A"})).unwrap(),
@ -519,7 +527,7 @@ mod server_lifecycle {
tokio::time::sleep(Duration::from_millis(10)).await;
let req = Request::builder()
.method("GET")
.uri(format!("/runs/{run_id}"))
.uri(api(&format!("/runs/{run_id}")))
.body(Body::empty())
.unwrap();
let response = app.clone().oneshot(req).await.unwrap();
@ -535,7 +543,7 @@ mod server_lifecycle {
// 5. Verify context endpoint returns an object
let req = Request::builder()
.method("GET")
.uri(format!("/runs/{run_id}/context"))
.uri(api(&format!("/runs/{run_id}/context")))
.body(Body::empty())
.unwrap();
let response = app.clone().oneshot(req).await.unwrap();
@ -546,7 +554,7 @@ mod server_lifecycle {
// 6. Verify no pending questions
let req = Request::builder()
.method("GET")
.uri(format!("/runs/{run_id}/questions"))
.uri(api(&format!("/runs/{run_id}/questions")))
.body(Body::empty())
.unwrap();
let response = app.clone().oneshot(req).await.unwrap();
@ -569,7 +577,7 @@ mod server_lifecycle {
// Start a run that will block at the human gate
let req = Request::builder()
.method("POST")
.uri("/runs")
.uri(api("/runs"))
.header("content-type", "application/json")
.body(Body::from(
serde_json::to_string(&serde_json::json!({"dot_source": GATE_DOT})).unwrap(),
@ -585,7 +593,7 @@ mod server_lifecycle {
// Cancel it
let req = Request::builder()
.method("POST")
.uri(format!("/runs/{run_id}/cancel"))
.uri(api(&format!("/runs/{run_id}/cancel")))
.body(Body::empty())
.unwrap();
let response = app.clone().oneshot(req).await.unwrap();
@ -596,7 +604,7 @@ mod server_lifecycle {
// Verify status is cancelled
let req = Request::builder()
.method("GET")
.uri(format!("/runs/{run_id}"))
.uri(api(&format!("/runs/{run_id}")))
.body(Body::empty())
.unwrap();
let response = app.clone().oneshot(req).await.unwrap();
@ -611,6 +619,7 @@ mod server_lifecycle {
mod sse_events {
use super::super::helpers::test_db;
use super::api;
use std::sync::Arc;
use std::time::Duration;
@ -640,7 +649,7 @@ mod sse_events {
// Start run
let req = Request::builder()
.method("POST")
.uri("/runs")
.uri(api("/runs"))
.header("content-type", "application/json")
.body(Body::from(
serde_json::to_string(&serde_json::json!({"dot_source": SIMPLE_DOT})).unwrap(),
@ -660,7 +669,7 @@ mod sse_events {
// Get SSE stream
let req = Request::builder()
.method("GET")
.uri(format!("/runs/{run_id}/events"))
.uri(api(&format!("/runs/{run_id}/events")))
.body(Body::empty())
.unwrap();
let response = app.clone().oneshot(req).await.unwrap();
@ -731,7 +740,7 @@ mod sse_events {
let req = Request::builder()
.method("GET")
.uri(format!("/runs/{run_id}/checkpoint"))
.uri(api(&format!("/runs/{run_id}/checkpoint")))
.body(Body::empty())
.unwrap();
let response = app.clone().oneshot(req).await.unwrap();
@ -758,6 +767,7 @@ mod sse_events {
mod serve_dry_run {
use super::super::helpers::test_db;
use super::api;
use std::sync::Arc;
use std::time::Duration;
@ -792,7 +802,7 @@ mod serve_dry_run {
// POST /runs to start a run
let req = Request::builder()
.method("POST")
.uri("/runs")
.uri(api("/runs"))
.header("content-type", "application/json")
.body(Body::from(
serde_json::to_string(&serde_json::json!({"dot_source": MINIMAL_DOT})).unwrap(),
@ -812,7 +822,7 @@ mod serve_dry_run {
// GET /runs/{id} to verify completion
let req = Request::builder()
.method("GET")
.uri(format!("/runs/{run_id}"))
.uri(api(&format!("/runs/{run_id}")))
.body(Body::empty())
.unwrap();
@ -829,7 +839,7 @@ mod serve_dry_run {
let req = Request::builder()
.method("POST")
.uri("/models/claude-opus-4-6/test")
.uri(api("/models/claude-opus-4-6/test"))
.header("content-type", "application/json")
.body(Body::empty())
.unwrap();
@ -849,7 +859,7 @@ mod serve_dry_run {
let req = Request::builder()
.method("POST")
.uri("/models/nonexistent-model-xyz/test")
.uri(api("/models/nonexistent-model-xyz/test"))
.header("content-type", "application/json")
.body(Body::empty())
.unwrap();
@ -864,7 +874,7 @@ mod serve_dry_run {
let req = Request::builder()
.method("POST")
.uri("/runs")
.uri(api("/runs"))
.header("content-type", "application/json")
.body(Body::from(
serde_json::to_string(&serde_json::json!({"dot_source": "not valid dot"})).unwrap(),
@ -875,3 +885,96 @@ mod serve_dry_run {
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
}
}
mod route_prefixes {
use super::super::helpers::test_db;
use super::api;
use axum::body::Body;
use axum::http::{Method, Request, StatusCode};
use fabro_server::server::{build_router, create_app_state};
use tower::ServiceExt;
async fn body_json(body: Body) -> serde_json::Value {
let bytes = axum::body::to_bytes(body, usize::MAX).await.unwrap();
serde_json::from_slice(&bytes).unwrap()
}
#[tokio::test]
async fn old_unversioned_routes_return_404() {
let app = build_router(
create_app_state(test_db().await),
fabro_server::jwt_auth::AuthMode::Disabled,
);
let cases = [
(Method::GET, "/runs"),
(Method::GET, "/workflows"),
(Method::GET, "/models"),
(Method::GET, "/sessions"),
(Method::GET, "/usage"),
(Method::GET, "/settings"),
(Method::GET, "/openapi.json"),
(Method::GET, "/user"),
(Method::POST, "/completions"),
];
for (method, path) in cases {
let req = Request::builder()
.method(method.clone())
.uri(path)
.body(Body::empty())
.unwrap();
let response = app.clone().oneshot(req).await.unwrap();
assert_eq!(response.status(), StatusCode::NOT_FOUND, "{method} {path}");
}
}
#[tokio::test]
async fn root_and_health_stay_at_root() {
let app = build_router(
create_app_state(test_db().await),
fabro_server::jwt_auth::AuthMode::Disabled,
);
let root_req = Request::builder()
.method("GET")
.uri("/")
.body(Body::empty())
.unwrap();
let root_response = app.clone().oneshot(root_req).await.unwrap();
assert_eq!(root_response.status(), StatusCode::OK);
let root_body = body_json(root_response.into_body()).await;
assert_eq!(root_body["urls"]["openapi_url"], api("/openapi.json"));
assert_eq!(root_body["urls"]["current_user_url"], api("/user"));
assert_eq!(root_body["urls"]["health_url"], "/health");
let health_req = Request::builder()
.method("GET")
.uri("/health")
.body(Body::empty())
.unwrap();
let health_response = app.oneshot(health_req).await.unwrap();
assert_eq!(health_response.status(), StatusCode::OK);
let health_body = body_json(health_response.into_body()).await;
assert_eq!(health_body["status"], "ok");
}
#[tokio::test]
async fn moved_routes_not_at_root_of_api_prefix() {
let app = build_router(
create_app_state(test_db().await),
fabro_server::jwt_auth::AuthMode::Disabled,
);
for path in ["/api/v1/health", "/api/v1/"] {
let req = Request::builder()
.method("GET")
.uri(path)
.body(Body::empty())
.unwrap();
let response = app.clone().oneshot(req).await.unwrap();
assert_eq!(response.status(), StatusCode::NOT_FOUND, "GET {path}");
}
}
}

View file

@ -46,47 +46,47 @@ struct PaginatedEndpoint {
const ENDPOINTS: &[PaginatedEndpoint] = &[
PaginatedEndpoint {
path: "/workflows",
path: "/api/v1/workflows",
name: "listWorkflows",
},
PaginatedEndpoint {
path: "/workflows/implement/runs",
path: "/api/v1/workflows/implement/runs",
name: "listWorkflowRuns",
},
PaginatedEndpoint {
path: "/retros",
path: "/api/v1/retros",
name: "listRetros",
},
PaginatedEndpoint {
path: "/sessions",
path: "/api/v1/sessions",
name: "listSessions",
},
PaginatedEndpoint {
path: "/insights/queries",
path: "/api/v1/insights/queries",
name: "listSavedQueries",
},
PaginatedEndpoint {
path: "/insights/history",
path: "/api/v1/insights/history",
name: "listQueryHistory",
},
PaginatedEndpoint {
path: "/models",
path: "/api/v1/models",
name: "listModels",
},
PaginatedEndpoint {
path: "/runs/run-1/stages/detect-drift/turns",
path: "/api/v1/runs/run-1/stages/detect-drift/turns",
name: "listStageTurns",
},
PaginatedEndpoint {
path: "/runs/run-1/questions",
path: "/api/v1/runs/run-1/questions",
name: "listRunQuestions",
},
PaginatedEndpoint {
path: "/runs/run-1/stages",
path: "/api/v1/runs/run-1/stages",
name: "listRunStages",
},
PaginatedEndpoint {
path: "/runs/run-1/verification",
path: "/api/v1/runs/run-1/verification",
name: "retrieveRunVerification",
},
];

View file

@ -42,7 +42,7 @@ pub struct ApiSettings {
}
fn default_base_url() -> String {
"http://localhost:3000".to_string()
"http://localhost:3000/api/v1".to_string()
}
impl Default for ApiSettings {

View file

@ -19,17 +19,17 @@ configuration.ts
index.ts
models/aggregate-usage-totals.ts
models/aggregate-usage.ts
models/api-configuration.ts
models/api-question-option.ts
models/api-question.ts
models/assets-configuration.ts
models/api-settings.ts
models/assets-settings.ts
models/assistant-stage-turn.ts
models/assistant-turn.ts
models/auth-configuration.ts
models/auth-settings.ts
models/board-column.ts
models/check-run-status.ts
models/check-run.ts
models/checkpoint-configuration.ts
models/checkpoint-settings.ts
models/code-location.ts
models/completion-content-part.ts
models/completion-message.ts
@ -46,15 +46,15 @@ models/create-session-request.ts
models/create-session-response.ts
models/create-signoff-request.ts
models/criterion-reference.ts
models/daytona-configuration-network-one-of.ts
models/daytona-configuration-network.ts
models/daytona-configuration.ts
models/daytona-snapshot-configuration.ts
models/daytona-settings-network-one-of.ts
models/daytona-settings-network.ts
models/daytona-settings.ts
models/daytona-snapshot-settings.ts
models/diff-file.ts
models/diff-stats.ts
models/error-response-entry.ts
models/error-response.ts
models/exe-configuration.ts
models/exe-settings.ts
models/execute-query-request.ts
models/execute-query-response-rows-inner-inner.ts
models/execute-query-response.ts
@ -63,18 +63,18 @@ models/file-checkpoint.ts
models/file-diff.ts
models/friction-kind.ts
models/friction-point.ts
models/git-author-configuration.ts
models/git-configuration.ts
models/git-hub-configuration.ts
models/git-author-settings.ts
models/git-hub-settings.ts
models/git-settings.ts
models/health-response.ts
models/history-entry.ts
models/hook-definition.ts
models/index.ts
models/learning-category.ts
models/learning.ts
models/llm-configuration.ts
models/local-sandbox-configuration.ts
models/log-configuration.ts
models/llm-settings.ts
models/local-sandbox-settings.ts
models/log-settings.ts
models/mcp-server-entry.ts
models/model-costs.ts
models/model-features.ts
@ -102,7 +102,7 @@ models/paginated-workflow-list.ts
models/pagination-meta.ts
models/preview-url-request.ts
models/preview-url-response.ts
models/pull-request-configuration.ts
models/pull-request-settings.ts
models/question-type.ts
models/recent-control-result.ts
models/repository-reference.ts
@ -112,13 +112,13 @@ models/retro-stats.ts
models/root-response-urls.ts
models/root-response.ts
models/run-checkpoint.ts
models/run-configuration.ts
models/run-error.ts
models/run-list-item.ts
models/run-pull-request.ts
models/run-question.ts
models/run-reference.ts
models/run-sandbox.ts
models/run-settings.ts
models/run-stage.ts
models/run-status-response.ts
models/run-status.ts
@ -126,22 +126,22 @@ models/run-timings.ts
models/run-usage.ts
models/run-verification-control.ts
models/run-verification.ts
models/sandbox-configuration.ts
models/sandbox-resources.ts
models/sandbox-settings.ts
models/save-query-request.ts
models/saved-query.ts
models/send-message-request.ts
models/send-message-response.ts
models/server-configuration.ts
models/server-settings.ts
models/session-detail.ts
models/session-list-item.ts
models/session-turn.ts
models/setup-configuration.ts
models/setup-settings.ts
models/sibling-control.ts
models/signoff-status.ts
models/signoff.ts
models/smoothness-rating.ts
models/ssh-configuration.ts
models/ssh-settings.ts
models/stage-retro.ts
models/stage-status.ts
models/stage-turn.ts
@ -149,7 +149,7 @@ models/start-run-request.ts
models/steer-request.ts
models/submit-answer-request.ts
models/system-stage-turn.ts
models/tls-configuration.ts
models/tls-settings.ts
models/token-usage.ts
models/tool-stage-turn.ts
models/tool-turn.ts
@ -168,8 +168,8 @@ models/verification-detail-response.ts
models/verification-mode.ts
models/verification-result.ts
models/verification-type.ts
models/web-configuration.ts
models/webhook-configuration.ts
models/web-settings.ts
models/webhook-settings.ts
models/workflow-detail.ts
models/workflow-last-run.ts
models/workflow-list-item.ts

View file

@ -1 +1 @@
7.20.0
7.21.0

View file

@ -42,7 +42,7 @@ export const CompletionsApiAxiosParamCreator = function (configuration?: Configu
createCompletion: async (createCompletionRequest: CreateCompletionRequest, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'createCompletionRequest' is not null or undefined
assertParamExists('createCompletion', 'createCompletionRequest', createCompletionRequest)
const localVarPath = `/completions`;
const localVarPath = `/api/v1/completions`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions;

View file

@ -71,7 +71,7 @@ export const DiscoveryApiAxiosParamCreator = function (configuration?: Configura
* @throws {RequiredError}
*/
getOpenApiSpec: async (options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
const localVarPath = `/openapi.json`;
const localVarPath = `/api/v1/openapi.json`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions;
@ -131,7 +131,7 @@ export const DiscoveryApiAxiosParamCreator = function (configuration?: Configura
* @throws {RequiredError}
*/
getUser: async (options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
const localVarPath = `/user`;
const localVarPath = `/api/v1/user`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions;

View file

@ -51,7 +51,7 @@ export const HumanInTheLoopApiAxiosParamCreator = function (configuration?: Conf
assertParamExists('generatePreviewUrl', 'id', id)
// verify required parameter 'previewUrlRequest' is not null or undefined
assertParamExists('generatePreviewUrl', 'previewUrlRequest', previewUrlRequest)
const localVarPath = `/runs/{id}/preview`
const localVarPath = `/api/v1/runs/{id}/preview`
.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);
@ -96,7 +96,7 @@ export const HumanInTheLoopApiAxiosParamCreator = function (configuration?: Conf
listRunQuestions: async (id: string, pageLimit?: number, pageOffset?: number, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'id' is not null or undefined
assertParamExists('listRunQuestions', 'id', id)
const localVarPath = `/runs/{id}/questions`
const localVarPath = `/api/v1/runs/{id}/questions`
.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);
@ -148,7 +148,7 @@ export const HumanInTheLoopApiAxiosParamCreator = function (configuration?: Conf
assertParamExists('steerRun', 'id', id)
// verify required parameter 'steerRequest' is not null or undefined
assertParamExists('steerRun', 'steerRequest', steerRequest)
const localVarPath = `/runs/{id}/steer`
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);
@ -197,7 +197,7 @@ export const HumanInTheLoopApiAxiosParamCreator = function (configuration?: Conf
assertParamExists('submitRunAnswer', 'qid', qid)
// verify required parameter 'submitAnswerRequest' is not null or undefined
assertParamExists('submitRunAnswer', 'submitAnswerRequest', submitAnswerRequest)
const localVarPath = `/runs/{id}/questions/{qid}/answer`
const localVarPath = `/api/v1/runs/{id}/questions/{qid}/answer`
.replace(`{${"id"}}`, encodeURIComponent(String(id)))
.replace(`{${"qid"}}`, encodeURIComponent(String(qid)));
// use dummy base URL string because the URL constructor only accepts absolute URLs.

View file

@ -50,7 +50,7 @@ export const InsightsApiAxiosParamCreator = function (configuration?: Configurat
createSavedQuery: async (saveQueryRequest: SaveQueryRequest, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'saveQueryRequest' is not null or undefined
assertParamExists('createSavedQuery', 'saveQueryRequest', saveQueryRequest)
const localVarPath = `/insights/queries`;
const localVarPath = `/api/v1/insights/queries`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions;
@ -92,7 +92,7 @@ export const InsightsApiAxiosParamCreator = function (configuration?: Configurat
deleteSavedQuery: async (id: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'id' is not null or undefined
assertParamExists('deleteSavedQuery', 'id', id)
const localVarPath = `/insights/queries/{id}`
const localVarPath = `/api/v1/insights/queries/{id}`
.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);
@ -133,7 +133,7 @@ export const InsightsApiAxiosParamCreator = function (configuration?: Configurat
executeQuery: async (executeQueryRequest: ExecuteQueryRequest, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'executeQueryRequest' is not null or undefined
assertParamExists('executeQuery', 'executeQueryRequest', executeQueryRequest)
const localVarPath = `/insights/execute`;
const localVarPath = `/api/v1/insights/execute`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions;
@ -174,7 +174,7 @@ export const InsightsApiAxiosParamCreator = function (configuration?: Configurat
* @throws {RequiredError}
*/
listQueryHistory: async (pageLimit?: number, pageOffset?: number, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
const localVarPath = `/insights/history`;
const localVarPath = `/api/v1/insights/history`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions;
@ -221,7 +221,7 @@ export const InsightsApiAxiosParamCreator = function (configuration?: Configurat
* @throws {RequiredError}
*/
listSavedQueries: async (pageLimit?: number, pageOffset?: number, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
const localVarPath = `/insights/queries`;
const localVarPath = `/api/v1/insights/queries`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions;
@ -269,7 +269,7 @@ export const InsightsApiAxiosParamCreator = function (configuration?: Configurat
retrieveSavedQuery: async (id: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'id' is not null or undefined
assertParamExists('retrieveSavedQuery', 'id', id)
const localVarPath = `/insights/queries/{id}`
const localVarPath = `/api/v1/insights/queries/{id}`
.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);
@ -313,7 +313,7 @@ export const InsightsApiAxiosParamCreator = function (configuration?: Configurat
assertParamExists('updateSavedQuery', 'id', id)
// verify required parameter 'saveQueryRequest' is not null or undefined
assertParamExists('updateSavedQuery', 'saveQueryRequest', saveQueryRequest)
const localVarPath = `/insights/queries/{id}`
const localVarPath = `/api/v1/insights/queries/{id}`
.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);

View file

@ -41,7 +41,7 @@ export const ModelsApiAxiosParamCreator = function (configuration?: Configuratio
* @throws {RequiredError}
*/
listModels: async (pageLimit?: number, pageOffset?: number, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
const localVarPath = `/models`;
const localVarPath = `/api/v1/models`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions;
@ -89,7 +89,7 @@ export const ModelsApiAxiosParamCreator = function (configuration?: Configuratio
testModel: async (id: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'id' is not null or undefined
assertParamExists('testModel', 'id', id)
const localVarPath = `/models/{id}/test`
const localVarPath = `/api/v1/models/{id}/test`
.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);

View file

@ -45,7 +45,7 @@ export const RetrosApiAxiosParamCreator = function (configuration?: Configuratio
* @throws {RequiredError}
*/
listRetros: async (workflow?: string, smoothness?: SmoothnessRating, pageLimit?: number, pageOffset?: number, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
const localVarPath = `/retros`;
const localVarPath = `/api/v1/retros`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions;
@ -101,7 +101,7 @@ export const RetrosApiAxiosParamCreator = function (configuration?: Configuratio
retrieveRetro: async (id: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'id' is not null or undefined
assertParamExists('retrieveRetro', 'id', id)
const localVarPath = `/runs/{id}/retro`
const localVarPath = `/api/v1/runs/{id}/retro`
.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);

View file

@ -48,7 +48,7 @@ export const RunInternalsApiAxiosParamCreator = function (configuration?: Config
listRunStages: async (id: string, pageLimit?: number, pageOffset?: number, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'id' is not null or undefined
assertParamExists('listRunStages', 'id', id)
const localVarPath = `/runs/{id}/stages`
const localVarPath = `/api/v1/runs/{id}/stages`
.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);
@ -102,7 +102,7 @@ export const RunInternalsApiAxiosParamCreator = function (configuration?: Config
assertParamExists('listStageTurns', 'id', id)
// verify required parameter 'stageId' is not null or undefined
assertParamExists('listStageTurns', 'stageId', stageId)
const localVarPath = `/runs/{id}/stages/{stageId}/turns`
const localVarPath = `/api/v1/runs/{id}/stages/{stageId}/turns`
.replace(`{${"id"}}`, encodeURIComponent(String(id)))
.replace(`{${"stageId"}}`, encodeURIComponent(String(stageId)));
// use dummy base URL string because the URL constructor only accepts absolute URLs.
@ -152,48 +152,7 @@ export const RunInternalsApiAxiosParamCreator = function (configuration?: Config
retrieveRunCheckpoint: async (id: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'id' is not null or undefined
assertParamExists('retrieveRunCheckpoint', 'id', id)
const localVarPath = `/runs/{id}/checkpoint`
.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: '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,
};
},
/**
* Returns the structured settings used to launch this run.
* @summary Retrieve Run Settings
* @param {string} id Unique run identifier (ULID).
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
retrieveRunSettings: async (id: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'id' is not null or undefined
assertParamExists('retrieveRunSettings', 'id', id)
const localVarPath = `/runs/{id}/settings`
const localVarPath = `/api/v1/runs/{id}/checkpoint`
.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);
@ -234,7 +193,48 @@ export const RunInternalsApiAxiosParamCreator = function (configuration?: Config
retrieveRunContext: async (id: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'id' is not null or undefined
assertParamExists('retrieveRunContext', 'id', id)
const localVarPath = `/runs/{id}/context`
const localVarPath = `/api/v1/runs/{id}/context`
.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: '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,
};
},
/**
* Returns the structured settings used to launch this run.
* @summary Retrieve Run Settings
* @param {string} id Unique run identifier (ULID).
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
retrieveRunSettings: async (id: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'id' is not null or undefined
assertParamExists('retrieveRunSettings', 'id', id)
const localVarPath = `/api/v1/runs/{id}/settings`
.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);
@ -318,19 +318,6 @@ export const RunInternalsApiFp = function(configuration?: Configuration) {
const localVarOperationServerBasePath = operationServerMap['RunInternalsApi.retrieveRunCheckpoint']?.[localVarOperationServerIndex]?.url;
return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
},
/**
* Returns the structured settings used to launch this run.
* @summary Retrieve Run Settings
* @param {string} id Unique run identifier (ULID).
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async retrieveRunSettings(id: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<RunSettings>> {
const localVarAxiosArgs = await localVarAxiosParamCreator.retrieveRunSettings(id, options);
const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
const localVarOperationServerBasePath = operationServerMap['RunInternalsApi.retrieveRunSettings']?.[localVarOperationServerIndex]?.url;
return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
},
/**
* Returns the key-value context map accumulated during the run. Empty if the run has not started.
* @summary Retrieve Run Context
@ -344,6 +331,19 @@ export const RunInternalsApiFp = function(configuration?: Configuration) {
const localVarOperationServerBasePath = operationServerMap['RunInternalsApi.retrieveRunContext']?.[localVarOperationServerIndex]?.url;
return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
},
/**
* Returns the structured settings used to launch this run.
* @summary Retrieve Run Settings
* @param {string} id Unique run identifier (ULID).
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async retrieveRunSettings(id: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<RunSettings>> {
const localVarAxiosArgs = await localVarAxiosParamCreator.retrieveRunSettings(id, options);
const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
const localVarOperationServerBasePath = operationServerMap['RunInternalsApi.retrieveRunSettings']?.[localVarOperationServerIndex]?.url;
return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
},
}
};
@ -388,16 +388,6 @@ export const RunInternalsApiFactory = function (configuration?: Configuration, b
retrieveRunCheckpoint(id: string, options?: RawAxiosRequestConfig): AxiosPromise<RunCheckpoint> {
return localVarFp.retrieveRunCheckpoint(id, options).then((request) => request(axios, basePath));
},
/**
* Returns the structured settings used to launch this run.
* @summary Retrieve Run Settings
* @param {string} id Unique run identifier (ULID).
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
retrieveRunSettings(id: string, options?: RawAxiosRequestConfig): AxiosPromise<RunSettings> {
return localVarFp.retrieveRunSettings(id, options).then((request) => request(axios, basePath));
},
/**
* Returns the key-value context map accumulated during the run. Empty if the run has not started.
* @summary Retrieve Run Context
@ -408,6 +398,16 @@ export const RunInternalsApiFactory = function (configuration?: Configuration, b
retrieveRunContext(id: string, options?: RawAxiosRequestConfig): AxiosPromise<{ [key: string]: any; }> {
return localVarFp.retrieveRunContext(id, options).then((request) => request(axios, basePath));
},
/**
* Returns the structured settings used to launch this run.
* @summary Retrieve Run Settings
* @param {string} id Unique run identifier (ULID).
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
retrieveRunSettings(id: string, options?: RawAxiosRequestConfig): AxiosPromise<RunSettings> {
return localVarFp.retrieveRunSettings(id, options).then((request) => request(axios, basePath));
},
};
};
@ -453,17 +453,6 @@ export class RunInternalsApi extends BaseAPI {
return RunInternalsApiFp(this.configuration).retrieveRunCheckpoint(id, options).then((request) => request(this.axios, this.basePath));
}
/**
* Returns the structured settings used to launch this run.
* @summary Retrieve Run Settings
* @param {string} id Unique run identifier (ULID).
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
public retrieveRunSettings(id: string, options?: RawAxiosRequestConfig) {
return RunInternalsApiFp(this.configuration).retrieveRunSettings(id, options).then((request) => request(this.axios, this.basePath));
}
/**
* Returns the key-value context map accumulated during the run. Empty if the run has not started.
* @summary Retrieve Run Context
@ -474,4 +463,16 @@ export class RunInternalsApi extends BaseAPI {
public retrieveRunContext(id: string, options?: RawAxiosRequestConfig) {
return RunInternalsApiFp(this.configuration).retrieveRunContext(id, options).then((request) => request(this.axios, this.basePath));
}
/**
* Returns the structured settings used to launch this run.
* @summary Retrieve Run Settings
* @param {string} id Unique run identifier (ULID).
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
public retrieveRunSettings(id: string, options?: RawAxiosRequestConfig) {
return RunInternalsApiFp(this.configuration).retrieveRunSettings(id, options).then((request) => request(this.axios, this.basePath));
}
}

View file

@ -47,7 +47,7 @@ export const RunOutputsApiAxiosParamCreator = function (configuration?: Configur
retrieveRunFiles: async (id: string, checkpoint?: string, pageLimit?: number, pageOffset?: number, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'id' is not null or undefined
assertParamExists('retrieveRunFiles', 'id', id)
const localVarPath = `/runs/{id}/files`
const localVarPath = `/api/v1/runs/{id}/files`
.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);
@ -100,7 +100,7 @@ export const RunOutputsApiAxiosParamCreator = function (configuration?: Configur
retrieveRunUsage: async (id: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'id' is not null or undefined
assertParamExists('retrieveRunUsage', 'id', id)
const localVarPath = `/runs/{id}/usage`
const localVarPath = `/api/v1/runs/{id}/usage`
.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);
@ -143,7 +143,7 @@ export const RunOutputsApiAxiosParamCreator = function (configuration?: Configur
retrieveRunVerification: async (id: string, pageLimit?: number, pageOffset?: number, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'id' is not null or undefined
assertParamExists('retrieveRunVerification', 'id', id)
const localVarPath = `/runs/{id}/verification`
const localVarPath = `/api/v1/runs/{id}/verification`
.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);

View file

@ -44,7 +44,7 @@ export const RunsApiAxiosParamCreator = function (configuration?: Configuration)
cancelRun: async (id: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'id' is not null or undefined
assertParamExists('cancelRun', 'id', id)
const localVarPath = `/runs/{id}/cancel`
const localVarPath = `/api/v1/runs/{id}/cancel`
.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);
@ -84,7 +84,7 @@ export const RunsApiAxiosParamCreator = function (configuration?: Configuration)
* @throws {RequiredError}
*/
listRuns: async (pageLimit?: number, pageOffset?: number, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
const localVarPath = `/runs`;
const localVarPath = `/api/v1/runs`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions;
@ -132,7 +132,7 @@ export const RunsApiAxiosParamCreator = function (configuration?: Configuration)
pauseRun: async (id: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'id' is not null or undefined
assertParamExists('pauseRun', 'id', id)
const localVarPath = `/runs/{id}/pause`
const localVarPath = `/api/v1/runs/{id}/pause`
.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);
@ -173,7 +173,7 @@ export const RunsApiAxiosParamCreator = function (configuration?: Configuration)
retrieveRun: async (id: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'id' is not null or undefined
assertParamExists('retrieveRun', 'id', id)
const localVarPath = `/runs/{id}`
const localVarPath = `/api/v1/runs/{id}`
.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);
@ -214,7 +214,7 @@ export const RunsApiAxiosParamCreator = function (configuration?: Configuration)
retrieveRunGraph: async (id: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'id' is not null or undefined
assertParamExists('retrieveRunGraph', 'id', id)
const localVarPath = `/runs/{id}/graph`
const localVarPath = `/api/v1/runs/{id}/graph`
.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);
@ -246,7 +246,7 @@ export const RunsApiAxiosParamCreator = function (configuration?: Configuration)
};
},
/**
* Queues a new workflow run from a DOT graph source. The run is created in `queued` status and will be picked up by the scheduler.
* Queues a new workflow run from a Graphviz graph source. The run is created in `queued` status and will be picked up by the scheduler.
* @summary Start Run
* @param {StartRunRequest} startRunRequest
* @param {*} [options] Override http request option.
@ -255,7 +255,7 @@ export const RunsApiAxiosParamCreator = function (configuration?: Configuration)
startRun: async (startRunRequest: StartRunRequest, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'startRunRequest' is not null or undefined
assertParamExists('startRun', 'startRunRequest', startRunRequest)
const localVarPath = `/runs`;
const localVarPath = `/api/v1/runs`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions;
@ -297,7 +297,7 @@ export const RunsApiAxiosParamCreator = function (configuration?: Configuration)
streamRunEvents: async (id: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'id' is not null or undefined
assertParamExists('streamRunEvents', 'id', id)
const localVarPath = `/runs/{id}/events`
const localVarPath = `/api/v1/runs/{id}/events`
.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);
@ -338,7 +338,7 @@ export const RunsApiAxiosParamCreator = function (configuration?: Configuration)
unpauseRun: async (id: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'id' is not null or undefined
assertParamExists('unpauseRun', 'id', id)
const localVarPath = `/runs/{id}/unpause`
const localVarPath = `/api/v1/runs/{id}/unpause`
.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);
@ -445,7 +445,7 @@ export const RunsApiFp = function(configuration?: Configuration) {
return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
},
/**
* Queues a new workflow run from a DOT graph source. The run is created in `queued` status and will be picked up by the scheduler.
* Queues a new workflow run from a Graphviz graph source. The run is created in `queued` status and will be picked up by the scheduler.
* @summary Start Run
* @param {StartRunRequest} startRunRequest
* @param {*} [options] Override http request option.
@ -544,7 +544,7 @@ export const RunsApiFactory = function (configuration?: Configuration, basePath?
return localVarFp.retrieveRunGraph(id, options).then((request) => request(axios, basePath));
},
/**
* Queues a new workflow run from a DOT graph source. The run is created in `queued` status and will be picked up by the scheduler.
* Queues a new workflow run from a Graphviz graph source. The run is created in `queued` status and will be picked up by the scheduler.
* @summary Start Run
* @param {StartRunRequest} startRunRequest
* @param {*} [options] Override http request option.
@ -637,7 +637,7 @@ export class RunsApi extends BaseAPI {
}
/**
* Queues a new workflow run from a DOT graph source. The run is created in `queued` status and will be picked up by the scheduler.
* Queues a new workflow run from a Graphviz graph source. The run is created in `queued` status and will be picked up by the scheduler.
* @summary Start Run
* @param {StartRunRequest} startRunRequest
* @param {*} [options] Override http request option.

View file

@ -50,7 +50,7 @@ export const SessionsApiAxiosParamCreator = function (configuration?: Configurat
createSession: async (createSessionRequest: CreateSessionRequest, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'createSessionRequest' is not null or undefined
assertParamExists('createSession', 'createSessionRequest', createSessionRequest)
const localVarPath = `/sessions`;
const localVarPath = `/api/v1/sessions`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions;
@ -91,7 +91,7 @@ export const SessionsApiAxiosParamCreator = function (configuration?: Configurat
* @throws {RequiredError}
*/
listSessions: async (pageLimit?: number, pageOffset?: number, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
const localVarPath = `/sessions`;
const localVarPath = `/api/v1/sessions`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions;
@ -139,7 +139,7 @@ export const SessionsApiAxiosParamCreator = function (configuration?: Configurat
retrieveSession: async (id: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'id' is not null or undefined
assertParamExists('retrieveSession', 'id', id)
const localVarPath = `/sessions/{id}`
const localVarPath = `/api/v1/sessions/{id}`
.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);
@ -183,7 +183,7 @@ export const SessionsApiAxiosParamCreator = function (configuration?: Configurat
assertParamExists('sendSessionMessage', 'id', id)
// verify required parameter 'sendMessageRequest' is not null or undefined
assertParamExists('sendSessionMessage', 'sendMessageRequest', sendMessageRequest)
const localVarPath = `/sessions/{id}/messages`
const localVarPath = `/api/v1/sessions/{id}/messages`
.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);
@ -227,7 +227,7 @@ export const SessionsApiAxiosParamCreator = function (configuration?: Configurat
streamSessionEvents: async (id: string, lastEventID?: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'id' is not null or undefined
assertParamExists('streamSessionEvents', 'id', id)
const localVarPath = `/sessions/{id}/events`
const localVarPath = `/api/v1/sessions/{id}/events`
.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);

View file

@ -35,7 +35,7 @@ export const SettingsApiAxiosParamCreator = function (configuration?: Configurat
* @throws {RequiredError}
*/
retrieveServerSettings: async (options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
const localVarPath = `/settings`;
const localVarPath = `/api/v1/settings`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions;
@ -121,3 +121,4 @@ export class SettingsApi extends BaseAPI {
return SettingsApiFp(this.configuration).retrieveServerSettings(options).then((request) => request(this.axios, this.basePath));
}
}

View file

@ -35,7 +35,7 @@ export const UsageApiAxiosParamCreator = function (configuration?: Configuration
* @throws {RequiredError}
*/
getAggregateUsage: async (options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
const localVarPath = `/usage`;
const localVarPath = `/api/v1/usage`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions;

View file

@ -52,7 +52,7 @@ export const VerificationApiAxiosParamCreator = function (configuration?: Config
createSignoff: async (createSignoffRequest: CreateSignoffRequest, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'createSignoffRequest' is not null or undefined
assertParamExists('createSignoff', 'createSignoffRequest', createSignoffRequest)
const localVarPath = `/verification/signoffs`;
const localVarPath = `/api/v1/verification/signoffs`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions;
@ -96,7 +96,7 @@ export const VerificationApiAxiosParamCreator = function (configuration?: Config
* @throws {RequiredError}
*/
listSignoffs: async (control?: string, repository?: string, commitSha?: string, pageLimit?: number, pageOffset?: number, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
const localVarPath = `/verification/signoffs`;
const localVarPath = `/api/v1/verification/signoffs`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions;
@ -155,7 +155,7 @@ export const VerificationApiAxiosParamCreator = function (configuration?: Config
* @throws {RequiredError}
*/
listVerificationControls: async (pageLimit?: number, pageOffset?: number, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
const localVarPath = `/verification/controls`;
const localVarPath = `/api/v1/verification/controls`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions;
@ -194,7 +194,7 @@ export const VerificationApiAxiosParamCreator = function (configuration?: Config
};
},
/**
* Returns paginated verification criteria with their controls and performance metrics. Each criterion contains controls; retrieve a specific control via `/verification/controls/{id}`.
* Returns paginated verification criteria with their controls and performance metrics. Each criterion contains controls; retrieve a specific control via `/api/v1/verification/controls/{id}`.
* @summary List Verification Criteria
* @param {number} [pageLimit] Maximum number of items to return per page.
* @param {number} [pageOffset] Number of items to skip before returning results.
@ -202,7 +202,7 @@ export const VerificationApiAxiosParamCreator = function (configuration?: Config
* @throws {RequiredError}
*/
listVerificationCriteria: async (pageLimit?: number, pageOffset?: number, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
const localVarPath = `/verification/criteria`;
const localVarPath = `/api/v1/verification/criteria`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions;
@ -250,7 +250,7 @@ export const VerificationApiAxiosParamCreator = function (configuration?: Config
retrieveSignoff: async (id: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'id' is not null or undefined
assertParamExists('retrieveSignoff', 'id', id)
const localVarPath = `/verification/signoffs/{id}`
const localVarPath = `/api/v1/verification/signoffs/{id}`
.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);
@ -291,7 +291,7 @@ export const VerificationApiAxiosParamCreator = function (configuration?: Config
retrieveVerificationControl: async (id: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'id' is not null or undefined
assertParamExists('retrieveVerificationControl', 'id', id)
const localVarPath = `/verification/controls/{id}`
const localVarPath = `/api/v1/verification/controls/{id}`
.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);
@ -332,7 +332,7 @@ export const VerificationApiAxiosParamCreator = function (configuration?: Config
retrieveVerificationCriterion: async (id: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'id' is not null or undefined
assertParamExists('retrieveVerificationCriterion', 'id', id)
const localVarPath = `/verification/criteria/{id}`
const localVarPath = `/api/v1/verification/criteria/{id}`
.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);
@ -417,7 +417,7 @@ export const VerificationApiFp = function(configuration?: Configuration) {
return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
},
/**
* Returns paginated verification criteria with their controls and performance metrics. Each criterion contains controls; retrieve a specific control via `/verification/controls/{id}`.
* Returns paginated verification criteria with their controls and performance metrics. Each criterion contains controls; retrieve a specific control via `/api/v1/verification/controls/{id}`.
* @summary List Verification Criteria
* @param {number} [pageLimit] Maximum number of items to return per page.
* @param {number} [pageOffset] Number of items to skip before returning results.
@ -514,7 +514,7 @@ export const VerificationApiFactory = function (configuration?: Configuration, b
return localVarFp.listVerificationControls(pageLimit, pageOffset, options).then((request) => request(axios, basePath));
},
/**
* Returns paginated verification criteria with their controls and performance metrics. Each criterion contains controls; retrieve a specific control via `/verification/controls/{id}`.
* Returns paginated verification criteria with their controls and performance metrics. Each criterion contains controls; retrieve a specific control via `/api/v1/verification/controls/{id}`.
* @summary List Verification Criteria
* @param {number} [pageLimit] Maximum number of items to return per page.
* @param {number} [pageOffset] Number of items to skip before returning results.
@ -600,7 +600,7 @@ export class VerificationApi extends BaseAPI {
}
/**
* Returns paginated verification criteria with their controls and performance metrics. Each criterion contains controls; retrieve a specific control via `/verification/controls/{id}`.
* Returns paginated verification criteria with their controls and performance metrics. Each criterion contains controls; retrieve a specific control via `/api/v1/verification/controls/{id}`.
* @summary List Verification Criteria
* @param {number} [pageLimit] Maximum number of items to return per page.
* @param {number} [pageOffset] Number of items to skip before returning results.

View file

@ -46,7 +46,7 @@ export const WorkflowsApiAxiosParamCreator = function (configuration?: Configura
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 = `/workflows/{name}/runs`
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);
@ -94,7 +94,7 @@ export const WorkflowsApiAxiosParamCreator = function (configuration?: Configura
* @throws {RequiredError}
*/
listWorkflows: async (pageLimit?: number, pageOffset?: number, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
const localVarPath = `/workflows`;
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;
@ -133,7 +133,7 @@ export const WorkflowsApiAxiosParamCreator = function (configuration?: Configura
};
},
/**
* Returns the full detail of a workflow including its DOT graph, resolved settings, and description.
* 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.
@ -142,7 +142,7 @@ export const WorkflowsApiAxiosParamCreator = function (configuration?: Configura
retrieveWorkflow: async (name: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'name' is not null or undefined
assertParamExists('retrieveWorkflow', 'name', name)
const localVarPath = `/workflows/{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);
@ -212,7 +212,7 @@ export const WorkflowsApiFp = function(configuration?: Configuration) {
return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
},
/**
* Returns the full detail of a workflow including its DOT graph, resolved settings, and description.
* 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.
@ -257,7 +257,7 @@ export const WorkflowsApiFactory = function (configuration?: Configuration, base
return localVarFp.listWorkflows(pageLimit, pageOffset, options).then((request) => request(axios, basePath));
},
/**
* Returns the full detail of a workflow including its DOT graph, resolved settings, and description.
* 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.
@ -299,7 +299,7 @@ export class WorkflowsApi extends BaseAPI {
}
/**
* Returns the full detail of a workflow including its DOT graph, resolved settings, and description.
* 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.
@ -309,3 +309,4 @@ export class WorkflowsApi extends BaseAPI {
return WorkflowsApiFp(this.configuration).retrieveWorkflow(name, options).then((request) => request(this.axios, this.basePath));
}
}

View file

@ -0,0 +1,42 @@
/* 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 { TlsSettings } from './tls-settings';
/**
* API server configuration.
*/
export interface ApiSettings {
/**
* API base URL.
*/
'base_url'?: string;
/**
* Authentication strategies.
*/
'authentication_strategies'?: Array<ApiSettingsAuthenticationStrategiesEnum>;
'tls'?: TlsSettings;
}
export const ApiSettingsAuthenticationStrategiesEnum = {
JWT: 'jwt',
MTLS: 'mtls',
} as const;
export type ApiSettingsAuthenticationStrategiesEnum = typeof ApiSettingsAuthenticationStrategiesEnum[keyof typeof ApiSettingsAuthenticationStrategiesEnum];

View file

@ -0,0 +1,26 @@
/* 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.
*/
/**
* Asset collection configuration.
*/
export interface AssetsSettings {
/**
* Glob patterns for files to collect as run assets.
*/
'include'?: Array<string>;
}

View file

@ -26,7 +26,7 @@ export interface AssistantStageTurn {
}
export const AssistantStageTurnKindEnum = {
ASSISTANT: 'assistant'
ASSISTANT: 'assistant',
} as const;
export type AssistantStageTurnKindEnum = typeof AssistantStageTurnKindEnum[keyof typeof AssistantStageTurnKindEnum];

View file

@ -30,7 +30,7 @@ export interface AssistantTurn {
}
export const AssistantTurnKindEnum = {
ASSISTANT: 'assistant'
ASSISTANT: 'assistant',
} as const;
export type AssistantTurnKindEnum = typeof AssistantTurnKindEnum[keyof typeof AssistantTurnKindEnum];

View file

@ -0,0 +1,38 @@
/* 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.
*/
/**
* Authentication configuration.
*/
export interface AuthSettings {
/**
* Auth provider.
*/
'provider'?: AuthSettingsProviderEnum;
/**
* Allowed usernames.
*/
'allowed_usernames'?: Array<string>;
}
export const AuthSettingsProviderEnum = {
GITHUB: 'github',
INSECURE_DISABLED: 'insecure_disabled',
} as const;
export type AuthSettingsProviderEnum = typeof AuthSettingsProviderEnum[keyof typeof AuthSettingsProviderEnum];

View file

@ -22,7 +22,7 @@ export const BoardColumn = {
WORKING: 'working',
PENDING: 'pending',
REVIEW: 'review',
MERGE: 'merge'
MERGE: 'merge',
} as const;
export type BoardColumn = typeof BoardColumn[keyof typeof BoardColumn];

View file

@ -23,7 +23,7 @@ export const CheckRunStatus = {
FAILURE: 'failure',
SKIPPED: 'skipped',
PENDING: 'pending',
QUEUED: 'queued'
QUEUED: 'queued',
} as const;
export type CheckRunStatus = typeof CheckRunStatus[keyof typeof CheckRunStatus];

View file

@ -0,0 +1,26 @@
/* 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.
*/
/**
* Checkpoint configuration for file exclusion.
*/
export interface CheckpointSettings {
/**
* Glob patterns to exclude from checkpoints.
*/
'exclude_globs'?: Array<string>;
}

View file

@ -44,7 +44,7 @@ export const CompletionMessageRoleEnum = {
USER: 'user',
ASSISTANT: 'assistant',
TOOL: 'tool',
DEVELOPER: 'developer'
DEVELOPER: 'developer',
} as const;
export type CompletionMessageRoleEnum = typeof CompletionMessageRoleEnum[keyof typeof CompletionMessageRoleEnum];

View file

@ -32,7 +32,7 @@ export const CompletionToolChoiceModeEnum = {
AUTO: 'auto',
NONE: 'none',
REQUIRED: 'required',
NAMED: 'named'
NAMED: 'named',
} as const;
export type CompletionToolChoiceModeEnum = typeof CompletionToolChoiceModeEnum[keyof typeof CompletionToolChoiceModeEnum];

View file

@ -0,0 +1,23 @@
/* 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.
*/
export interface DaytonaSettingsNetworkOneOf {
/**
* CIDR allowlist for network access.
*/
'allow_list': Array<string>;
}

View file

@ -0,0 +1,26 @@
/* 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 { DaytonaSettingsNetworkOneOf } from './daytona-settings-network-one-of';
/**
* @type DaytonaSettingsNetwork
* Network access mode: \"block\", \"allow_all\", or {\"allow_list\": [...]}.
*/
export type DaytonaSettingsNetwork = DaytonaSettingsNetworkOneOf | string;

View file

@ -0,0 +1,42 @@
/* 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 { DaytonaSettingsNetwork } from './daytona-settings-network';
// May contain unused imports in some cases
// @ts-ignore
import type { DaytonaSnapshotSettings } from './daytona-snapshot-settings';
/**
* Daytona-specific sandbox settings.
*/
export interface DaytonaSettings {
/**
* Auto-stop interval in seconds.
*/
'auto_stop_interval'?: number;
/**
* Labels applied to the sandbox.
*/
'labels'?: { [key: string]: string; };
'snapshot'?: DaytonaSnapshotSettings;
'network'?: DaytonaSettingsNetwork;
/**
* Skip git repo detection and cloning during initialization.
*/
'skip_clone'?: boolean;
}

View file

@ -0,0 +1,42 @@
/* 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.
*/
/**
* Snapshot configuration for Daytona sandboxes.
*/
export interface DaytonaSnapshotSettings {
/**
* Snapshot name.
*/
'name': string;
/**
* CPU cores.
*/
'cpu'?: number;
/**
* Memory in GB.
*/
'memory'?: number;
/**
* Disk in GB.
*/
'disk'?: number;
/**
* Dockerfile content for snapshot creation.
*/
'dockerfile'?: string;
}

View file

@ -0,0 +1,26 @@
/* 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.
*/
/**
* exe.dev sandbox configuration.
*/
export interface ExeSettings {
/**
* VM image to use for the exe.dev sandbox.
*/
'image'?: string;
}

View file

@ -23,7 +23,7 @@ export const FrictionKind = {
TIMEOUT: 'timeout',
WRONG_APPROACH: 'wrong_approach',
TOOL_FAILURE: 'tool_failure',
AMBIGUITY: 'ambiguity'
AMBIGUITY: 'ambiguity',
} as const;
export type FrictionKind = typeof FrictionKind[keyof typeof FrictionKind];

View file

@ -0,0 +1,30 @@
/* 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.
*/
/**
* Git commit author configuration.
*/
export interface GitAuthorSettings {
/**
* Author name for commits.
*/
'name'?: string;
/**
* Author email for commits.
*/
'email'?: string;
}

View file

@ -0,0 +1,26 @@
/* 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.
*/
/**
* GitHub App token injection configuration.
*/
export interface GitHubSettings {
/**
* GitHub API permissions to request (e.g. contents = write).
*/
'permissions'?: { [key: string]: string; };
}

View file

@ -0,0 +1,53 @@
/* 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 { GitAuthorSettings } from './git-author-settings';
// May contain unused imports in some cases
// @ts-ignore
import type { WebhookSettings } from './webhook-settings';
/**
* Git provider configuration.
*/
export interface GitSettings {
/**
* Git provider.
*/
'provider'?: GitSettingsProviderEnum;
/**
* GitHub App ID.
*/
'app_id'?: string;
/**
* GitHub App Client ID.
*/
'client_id'?: string;
/**
* GitHub App slug.
*/
'slug'?: string;
'author'?: GitAuthorSettings;
'webhooks'?: WebhookSettings;
}
export const GitSettingsProviderEnum = {
GITHUB: 'github',
} as const;
export type GitSettingsProviderEnum = typeof GitSettingsProviderEnum[keyof typeof GitSettingsProviderEnum];

View file

@ -84,7 +84,7 @@ export const HookDefinitionEventEnum = {
RUN_START: 'run_start',
RUN_COMPLETE: 'run_complete',
STAGE_START: 'stage_start',
STAGE_COMPLETE: 'stage_complete'
STAGE_COMPLETE: 'stage_complete',
} as const;
export type HookDefinitionEventEnum = typeof HookDefinitionEventEnum[keyof typeof HookDefinitionEventEnum];
@ -92,14 +92,14 @@ export const HookDefinitionTypeEnum = {
COMMAND: 'command',
HTTP: 'http',
PROMPT: 'prompt',
AGENT: 'agent'
AGENT: 'agent',
} as const;
export type HookDefinitionTypeEnum = typeof HookDefinitionTypeEnum[keyof typeof HookDefinitionTypeEnum];
export const HookDefinitionTlsEnum = {
VERIFY: 'verify',
NO_VERIFY: 'no_verify',
OFF: 'off'
OFF: 'off',
} as const;
export type HookDefinitionTlsEnum = typeof HookDefinitionTlsEnum[keyof typeof HookDefinitionTlsEnum];

View file

@ -1,16 +1,16 @@
export * from './aggregate-usage';
export * from './aggregate-usage-totals';
export * from './api-configuration';
export * from './api-question';
export * from './api-question-option';
export * from './assets-configuration';
export * from './api-settings';
export * from './assets-settings';
export * from './assistant-stage-turn';
export * from './assistant-turn';
export * from './auth-configuration';
export * from './auth-settings';
export * from './board-column';
export * from './check-run';
export * from './check-run-status';
export * from './checkpoint-configuration';
export * from './checkpoint-settings';
export * from './code-location';
export * from './completion-content-part';
export * from './completion-message';
@ -27,15 +27,15 @@ export * from './create-session-request';
export * from './create-session-response';
export * from './create-signoff-request';
export * from './criterion-reference';
export * from './daytona-configuration';
export * from './daytona-configuration-network';
export * from './daytona-configuration-network-one-of';
export * from './daytona-snapshot-configuration';
export * from './daytona-settings';
export * from './daytona-settings-network';
export * from './daytona-settings-network-one-of';
export * from './daytona-snapshot-settings';
export * from './diff-file';
export * from './diff-stats';
export * from './error-response';
export * from './error-response-entry';
export * from './exe-configuration';
export * from './exe-settings';
export * from './execute-query-request';
export * from './execute-query-response';
export * from './execute-query-response-rows-inner-inner';
@ -44,17 +44,17 @@ export * from './file-checkpoint';
export * from './file-diff';
export * from './friction-kind';
export * from './friction-point';
export * from './git-author-configuration';
export * from './git-configuration';
export * from './git-hub-configuration';
export * from './git-author-settings';
export * from './git-hub-settings';
export * from './git-settings';
export * from './health-response';
export * from './history-entry';
export * from './hook-definition';
export * from './learning';
export * from './learning-category';
export * from './llm-configuration';
export * from './local-sandbox-configuration';
export * from './log-configuration';
export * from './llm-settings';
export * from './local-sandbox-settings';
export * from './log-settings';
export * from './mcp-server-entry';
export * from './model';
export * from './model-costs';
@ -82,7 +82,7 @@ export * from './paginated-workflow-list';
export * from './pagination-meta';
export * from './preview-url-request';
export * from './preview-url-response';
export * from './pull-request-configuration';
export * from './pull-request-settings';
export * from './question-type';
export * from './recent-control-result';
export * from './repository-reference';
@ -92,13 +92,13 @@ export * from './retro-stats';
export * from './root-response';
export * from './root-response-urls';
export * from './run-checkpoint';
export * from './run-configuration';
export * from './run-error';
export * from './run-list-item';
export * from './run-pull-request';
export * from './run-question';
export * from './run-reference';
export * from './run-sandbox';
export * from './run-settings';
export * from './run-stage';
export * from './run-status';
export * from './run-status-response';
@ -106,22 +106,22 @@ export * from './run-timings';
export * from './run-usage';
export * from './run-verification';
export * from './run-verification-control';
export * from './sandbox-configuration';
export * from './sandbox-resources';
export * from './sandbox-settings';
export * from './save-query-request';
export * from './saved-query';
export * from './send-message-request';
export * from './send-message-response';
export * from './server-configuration';
export * from './server-settings';
export * from './session-detail';
export * from './session-list-item';
export * from './session-turn';
export * from './setup-configuration';
export * from './setup-settings';
export * from './sibling-control';
export * from './signoff';
export * from './signoff-status';
export * from './smoothness-rating';
export * from './ssh-configuration';
export * from './ssh-settings';
export * from './stage-retro';
export * from './stage-status';
export * from './stage-turn';
@ -129,7 +129,7 @@ export * from './start-run-request';
export * from './steer-request';
export * from './submit-answer-request';
export * from './system-stage-turn';
export * from './tls-configuration';
export * from './tls-settings';
export * from './token-usage';
export * from './tool-stage-turn';
export * from './tool-turn';
@ -148,8 +148,8 @@ export * from './verification-detail-response';
export * from './verification-mode';
export * from './verification-result';
export * from './verification-type';
export * from './web-configuration';
export * from './webhook-configuration';
export * from './web-settings';
export * from './webhook-settings';
export * from './workflow-detail';
export * from './workflow-last-run';
export * from './workflow-list-item';

View file

@ -22,7 +22,7 @@ export const LearningCategory = {
REPO: 'repo',
CODE: 'code',
WORKFLOW: 'workflow',
TOOL: 'tool'
TOOL: 'tool',
} as const;
export type LearningCategory = typeof LearningCategory[keyof typeof LearningCategory];

View file

@ -0,0 +1,34 @@
/* 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.
*/
/**
* LLM provider and model settings.
*/
export interface LlmSettings {
/**
* Model identifier.
*/
'model'?: string;
/**
* Provider name.
*/
'provider'?: string;
/**
* Provider fallback chains.
*/
'fallbacks'?: { [key: string]: Array<string>; };
}

View file

@ -0,0 +1,36 @@
/* 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.
*/
/**
* Local sandbox settings.
*/
export interface LocalSandboxSettings {
/**
* Git worktree mode for local sandbox.
*/
'worktree_mode'?: LocalSandboxSettingsWorktreeModeEnum;
}
export const LocalSandboxSettingsWorktreeModeEnum = {
ALWAYS: 'always',
CLEAN: 'clean',
DIRTY: 'dirty',
NEVER: 'never',
} as const;
export type LocalSandboxSettingsWorktreeModeEnum = typeof LocalSandboxSettingsWorktreeModeEnum[keyof typeof LocalSandboxSettingsWorktreeModeEnum];

View file

@ -0,0 +1,26 @@
/* 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.
*/
/**
* Logging configuration.
*/
export interface LogSettings {
/**
* Log level (e.g. trace, debug, info).
*/
'level'?: string;
}

View file

@ -34,7 +34,7 @@ export interface ModelTestResult {
export const ModelTestResultStatusEnum = {
OK: 'ok',
ERROR: 'error'
ERROR: 'error',
} as const;
export type ModelTestResultStatusEnum = typeof ModelTestResultStatusEnum[keyof typeof ModelTestResultStatusEnum];

View file

@ -22,7 +22,7 @@ export const OpenItemKind = {
TECH_DEBT: 'tech_debt',
FOLLOW_UP: 'follow_up',
INVESTIGATION: 'investigation',
TEST_GAP: 'test_gap'
TEST_GAP: 'test_gap',
} as const;
export type OpenItemKind = typeof OpenItemKind[keyof typeof OpenItemKind];

View file

@ -0,0 +1,47 @@
/* 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.
*/
/**
* Pull request creation configuration.
*/
export interface PullRequestSettings {
/**
* Whether to create a pull request after a successful run.
*/
'enabled'?: boolean;
/**
* Whether to create the pull request as a draft.
*/
'draft'?: boolean;
/**
* Whether to enable GitHub auto-merge on the created PR. Implies draft = false.
*/
'auto_merge'?: boolean;
/**
* Merge strategy for auto-merge.
*/
'merge_strategy'?: PullRequestSettingsMergeStrategyEnum;
}
export const PullRequestSettingsMergeStrategyEnum = {
SQUASH: 'squash',
MERGE: 'merge',
REBASE: 'rebase',
} as const;
export type PullRequestSettingsMergeStrategyEnum = typeof PullRequestSettingsMergeStrategyEnum[keyof typeof PullRequestSettingsMergeStrategyEnum];

View file

@ -23,7 +23,7 @@ export const QuestionType = {
MULTIPLE_CHOICE: 'multiple_choice',
MULTI_SELECT: 'multi_select',
FREEFORM: 'freeform',
CONFIRMATION: 'confirmation'
CONFIRMATION: 'confirmation',
} as const;
export type QuestionType = typeof QuestionType[keyof typeof QuestionType];

View file

@ -0,0 +1,58 @@
/* 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 { HookDefinition } from './hook-definition';
// May contain unused imports in some cases
// @ts-ignore
import type { LlmSettings } from './llm-settings';
// May contain unused imports in some cases
// @ts-ignore
import type { SandboxSettings } from './sandbox-settings';
// May contain unused imports in some cases
// @ts-ignore
import type { SetupSettings } from './setup-settings';
/**
* Structured run settings mirroring FabroSettings.
*/
export interface RunSettings {
/**
* Settings schema version.
*/
'version': number;
/**
* Goal description for the run.
*/
'goal'?: string;
/**
* Graphviz graph filename.
*/
'graph': string;
/**
* Working directory for the run.
*/
'work_dir'?: string;
'llm'?: LlmSettings;
'setup'?: SetupSettings;
'sandbox'?: SandboxSettings;
/**
* Variable map for template expansion.
*/
'vars'?: { [key: string]: string; };
'hooks'?: Array<HookDefinition>;
}

View file

@ -35,7 +35,7 @@ export interface RunStage {
*/
'duration_secs'?: number;
/**
* Node identifier in the DOT graph source.
* Node identifier in the Graphviz graph source.
*/
'dot_id'?: string;
}

View file

@ -25,7 +25,7 @@ export const RunStatus = {
COMPLETED: 'completed',
FAILED: 'failed',
CANCELLED: 'cancelled',
PAUSED: 'paused'
PAUSED: 'paused',
} as const;
export type RunStatus = typeof RunStatus[keyof typeof RunStatus];

View file

@ -0,0 +1,54 @@
/* 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 { DaytonaSettings } from './daytona-settings';
// May contain unused imports in some cases
// @ts-ignore
import type { ExeSettings } from './exe-settings';
// May contain unused imports in some cases
// @ts-ignore
import type { LocalSandboxSettings } from './local-sandbox-settings';
// May contain unused imports in some cases
// @ts-ignore
import type { SshSettings } from './ssh-settings';
/**
* Sandbox execution environment settings.
*/
export interface SandboxSettings {
/**
* Sandbox provider name.
*/
'provider'?: string;
/**
* Whether to preserve the sandbox after the run.
*/
'preserve'?: boolean;
/**
* Whether to use a devcontainer for the sandbox.
*/
'devcontainer'?: boolean;
'daytona'?: DaytonaSettings;
'exe'?: ExeSettings;
'ssh'?: SshSettings;
'local'?: LocalSandboxSettings;
/**
* Environment variables injected into the sandbox.
*/
'env'?: { [key: string]: string; };
}

View file

@ -0,0 +1,97 @@
/* 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 { ApiSettings } from './api-settings';
// May contain unused imports in some cases
// @ts-ignore
import type { AssetsSettings } from './assets-settings';
// May contain unused imports in some cases
// @ts-ignore
import type { CheckpointSettings } from './checkpoint-settings';
// May contain unused imports in some cases
// @ts-ignore
import type { Features } from './features';
// May contain unused imports in some cases
// @ts-ignore
import type { GitHubSettings } from './git-hub-settings';
// May contain unused imports in some cases
// @ts-ignore
import type { GitSettings } from './git-settings';
// May contain unused imports in some cases
// @ts-ignore
import type { HookDefinition } from './hook-definition';
// May contain unused imports in some cases
// @ts-ignore
import type { LlmSettings } from './llm-settings';
// May contain unused imports in some cases
// @ts-ignore
import type { LogSettings } from './log-settings';
// May contain unused imports in some cases
// @ts-ignore
import type { McpServerEntry } from './mcp-server-entry';
// May contain unused imports in some cases
// @ts-ignore
import type { PullRequestSettings } from './pull-request-settings';
// May contain unused imports in some cases
// @ts-ignore
import type { SandboxSettings } from './sandbox-settings';
// May contain unused imports in some cases
// @ts-ignore
import type { SetupSettings } from './setup-settings';
// May contain unused imports in some cases
// @ts-ignore
import type { WebSettings } from './web-settings';
/**
* Structured server settings mirroring FabroSettings.
*/
export interface ServerSettings {
/**
* Storage directory path.
*/
'storage_dir'?: string;
/**
* Maximum concurrent runs.
*/
'max_concurrent_runs'?: number;
'web'?: WebSettings;
'api'?: ApiSettings;
'git'?: GitSettings;
'features'?: Features;
'log'?: LogSettings;
/**
* Default working directory.
*/
'work_dir'?: string;
'llm'?: LlmSettings;
'setup'?: SetupSettings;
'sandbox'?: SandboxSettings;
/**
* Default variable map.
*/
'vars'?: { [key: string]: string; };
'checkpoint'?: CheckpointSettings;
'pull_request'?: PullRequestSettings;
'hooks'?: Array<HookDefinition>;
'assets'?: AssetsSettings;
/**
* Default MCP server configurations.
*/
'mcp_servers'?: { [key: string]: McpServerEntry; };
'github'?: GitHubSettings;
}

View file

@ -0,0 +1,30 @@
/* 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.
*/
/**
* Setup commands run before the workflow.
*/
export interface SetupSettings {
/**
* Shell commands to execute.
*/
'commands': Array<string>;
/**
* Timeout per command in milliseconds.
*/
'timeout_ms'?: number;
}

View file

@ -21,7 +21,7 @@
export const SignoffStatus = {
PASS: 'pass',
FAIL: 'fail',
PENDING: 'pending'
PENDING: 'pending',
} as const;
export type SignoffStatus = typeof SignoffStatus[keyof typeof SignoffStatus];

View file

@ -23,7 +23,7 @@ export const SmoothnessRating = {
SMOOTH: 'smooth',
BUMPY: 'bumpy',
STRUGGLED: 'struggled',
FAILED: 'failed'
FAILED: 'failed',
} as const;
export type SmoothnessRating = typeof SmoothnessRating[keyof typeof SmoothnessRating];

View file

@ -0,0 +1,34 @@
/* 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.
*/
/**
* SSH sandbox configuration for user-provided hosts.
*/
export interface SshSettings {
/**
* SSH destination (e.g. user@host or an SSH alias).
*/
'destination': string;
/**
* Remote working directory.
*/
'working_directory': string;
/**
* Optional path to a custom SSH config file.
*/
'config_file'?: string;
}

View file

@ -23,7 +23,7 @@ export const StageStatus = {
RUNNING: 'running',
PENDING: 'pending',
FAILED: 'failed',
CANCELLED: 'cancelled'
CANCELLED: 'cancelled',
} as const;
export type StageStatus = typeof StageStatus[keyof typeof StageStatus];

View file

@ -15,11 +15,11 @@
/**
* Request body for starting a new run from a DOT graph source.
* Request body for starting a new run from a Graphviz graph source.
*/
export interface StartRunRequest {
/**
* DOT language source defining the workflow graph.
* Graphviz DOT language source defining the workflow graph.
*/
'dot_source': string;
}

View file

@ -26,7 +26,7 @@ export interface SystemStageTurn {
}
export const SystemStageTurnKindEnum = {
SYSTEM: 'system'
SYSTEM: 'system',
} as const;
export type SystemStageTurnKindEnum = typeof SystemStageTurnKindEnum[keyof typeof SystemStageTurnKindEnum];

View file

@ -0,0 +1,34 @@
/* 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.
*/
/**
* TLS certificate configuration.
*/
export interface TlsSettings {
/**
* Certificate file path.
*/
'cert': string;
/**
* Key file path.
*/
'key': string;
/**
* CA certificate file path.
*/
'ca': string;
}

View file

@ -33,7 +33,7 @@ export interface ToolStageTurn {
}
export const ToolStageTurnKindEnum = {
TOOL: 'tool'
TOOL: 'tool',
} as const;
export type ToolStageTurnKindEnum = typeof ToolStageTurnKindEnum[keyof typeof ToolStageTurnKindEnum];

View file

@ -33,7 +33,7 @@ export interface ToolTurn {
}
export const ToolTurnKindEnum = {
TOOL: 'tool'
TOOL: 'tool',
} as const;
export type ToolTurnKindEnum = typeof ToolTurnKindEnum[keyof typeof ToolTurnKindEnum];

View file

@ -30,7 +30,7 @@ export interface UserTurn {
}
export const UserTurnKindEnum = {
USER: 'user'
USER: 'user',
} as const;
export type UserTurnKindEnum = typeof UserTurnKindEnum[keyof typeof UserTurnKindEnum];

View file

@ -21,7 +21,7 @@
export const VerificationMode = {
ACTIVE: 'active',
EVALUATE: 'evaluate',
DISABLED: 'disabled'
DISABLED: 'disabled',
} as const;
export type VerificationMode = typeof VerificationMode[keyof typeof VerificationMode];

View file

@ -22,7 +22,7 @@ export const VerificationResult = {
PASS: 'pass',
FAIL: 'fail',
SKIP: 'skip',
NA: 'na'
NA: 'na',
} as const;
export type VerificationResult = typeof VerificationResult[keyof typeof VerificationResult];

View file

@ -22,7 +22,7 @@ export const VerificationType = {
AI: 'ai',
AUTOMATED: 'automated',
ANALYSIS: 'analysis',
AI_ANALYSIS: 'ai-analysis'
AI_ANALYSIS: 'ai-analysis',
} as const;
export type VerificationType = typeof VerificationType[keyof typeof VerificationType];

View file

@ -0,0 +1,30 @@
/* 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 { AuthSettings } from './auth-settings';
/**
* Web UI configuration.
*/
export interface WebSettings {
/**
* Web UI URL.
*/
'url'?: string;
'auth'?: AuthSettings;
}

View file

@ -0,0 +1,33 @@
/* 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.
*/
/**
* Webhook delivery configuration.
*/
export interface WebhookSettings {
/**
* Webhook delivery strategy.
*/
'strategy': WebhookSettingsStrategyEnum;
}
export const WebhookSettingsStrategyEnum = {
TAILSCALE_FUNNEL: 'tailscale_funnel',
} as const;
export type WebhookSettingsStrategyEnum = typeof WebhookSettingsStrategyEnum[keyof typeof WebhookSettingsStrategyEnum];

View file

@ -15,7 +15,7 @@
// May contain unused imports in some cases
// @ts-ignore
import type { RunSettings } from './run-configuration';
import type { RunSettings } from './run-settings';
/**
* Full detail of a workflow definition including graph and resolved settings.
@ -30,7 +30,7 @@ export interface WorkflowDetail {
*/
'slug': string;
/**
* DOT graph filename.
* Graphviz graph filename.
*/
'filename': string;
/**
@ -39,7 +39,8 @@ export interface WorkflowDetail {
'description': string;
'settings': RunSettings;
/**
* DOT language source defining the workflow graph.
* Graphviz DOT language source defining the workflow graph.
*/
'graph': string;
}

View file

@ -33,7 +33,7 @@ export interface WorkflowListItem {
*/
'slug': string;
/**
* DOT graph filename.
* Graphviz graph filename.
*/
'filename': string;
'last_run'?: WorkflowLastRun;