mirror of
https://github.com/fabro-sh/fabro.git
synced 2026-08-28 05:27:41 +00:00
Prefix API routes with /api/v1
This commit is contained in:
parent
c866c18207
commit
55df05fe43
89 changed files with 1459 additions and 426 deletions
|
|
@ -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",
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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`.
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
]
|
||||
}
|
||||
]
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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`.
|
||||
|
|
|
|||
|
|
@ -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 |
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
},
|
||||
];
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
7.20.0
|
||||
7.21.0
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
42
lib/packages/fabro-api-client/src/models/api-settings.ts
Normal file
42
lib/packages/fabro-api-client/src/models/api-settings.ts
Normal 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];
|
||||
|
||||
|
||||
26
lib/packages/fabro-api-client/src/models/assets-settings.ts
Normal file
26
lib/packages/fabro-api-client/src/models/assets-settings.ts
Normal 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>;
|
||||
}
|
||||
|
||||
|
|
@ -26,7 +26,7 @@ export interface AssistantStageTurn {
|
|||
}
|
||||
|
||||
export const AssistantStageTurnKindEnum = {
|
||||
ASSISTANT: 'assistant'
|
||||
ASSISTANT: 'assistant',
|
||||
} as const;
|
||||
|
||||
export type AssistantStageTurnKindEnum = typeof AssistantStageTurnKindEnum[keyof typeof AssistantStageTurnKindEnum];
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ export interface AssistantTurn {
|
|||
}
|
||||
|
||||
export const AssistantTurnKindEnum = {
|
||||
ASSISTANT: 'assistant'
|
||||
ASSISTANT: 'assistant',
|
||||
} as const;
|
||||
|
||||
export type AssistantTurnKindEnum = typeof AssistantTurnKindEnum[keyof typeof AssistantTurnKindEnum];
|
||||
|
|
|
|||
38
lib/packages/fabro-api-client/src/models/auth-settings.ts
Normal file
38
lib/packages/fabro-api-client/src/models/auth-settings.ts
Normal 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];
|
||||
|
||||
|
||||
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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>;
|
||||
}
|
||||
|
||||
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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>;
|
||||
}
|
||||
|
||||
|
|
@ -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;
|
||||
|
||||
|
||||
42
lib/packages/fabro-api-client/src/models/daytona-settings.ts
Normal file
42
lib/packages/fabro-api-client/src/models/daytona-settings.ts
Normal 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;
|
||||
}
|
||||
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
26
lib/packages/fabro-api-client/src/models/exe-settings.ts
Normal file
26
lib/packages/fabro-api-client/src/models/exe-settings.ts
Normal 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;
|
||||
}
|
||||
|
||||
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
26
lib/packages/fabro-api-client/src/models/git-hub-settings.ts
Normal file
26
lib/packages/fabro-api-client/src/models/git-hub-settings.ts
Normal 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; };
|
||||
}
|
||||
|
||||
53
lib/packages/fabro-api-client/src/models/git-settings.ts
Normal file
53
lib/packages/fabro-api-client/src/models/git-settings.ts
Normal 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];
|
||||
|
||||
|
||||
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
34
lib/packages/fabro-api-client/src/models/llm-settings.ts
Normal file
34
lib/packages/fabro-api-client/src/models/llm-settings.ts
Normal 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>; };
|
||||
}
|
||||
|
||||
|
|
@ -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];
|
||||
|
||||
|
||||
26
lib/packages/fabro-api-client/src/models/log-settings.ts
Normal file
26
lib/packages/fabro-api-client/src/models/log-settings.ts
Normal 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;
|
||||
}
|
||||
|
||||
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
||||
|
||||
|
|
@ -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];
|
||||
|
|
|
|||
58
lib/packages/fabro-api-client/src/models/run-settings.ts
Normal file
58
lib/packages/fabro-api-client/src/models/run-settings.ts
Normal 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>;
|
||||
}
|
||||
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
54
lib/packages/fabro-api-client/src/models/sandbox-settings.ts
Normal file
54
lib/packages/fabro-api-client/src/models/sandbox-settings.ts
Normal 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; };
|
||||
}
|
||||
|
||||
97
lib/packages/fabro-api-client/src/models/server-settings.ts
Normal file
97
lib/packages/fabro-api-client/src/models/server-settings.ts
Normal 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;
|
||||
}
|
||||
|
||||
30
lib/packages/fabro-api-client/src/models/setup-settings.ts
Normal file
30
lib/packages/fabro-api-client/src/models/setup-settings.ts
Normal 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;
|
||||
}
|
||||
|
||||
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
34
lib/packages/fabro-api-client/src/models/ssh-settings.ts
Normal file
34
lib/packages/fabro-api-client/src/models/ssh-settings.ts
Normal 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;
|
||||
}
|
||||
|
||||
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ export interface SystemStageTurn {
|
|||
}
|
||||
|
||||
export const SystemStageTurnKindEnum = {
|
||||
SYSTEM: 'system'
|
||||
SYSTEM: 'system',
|
||||
} as const;
|
||||
|
||||
export type SystemStageTurnKindEnum = typeof SystemStageTurnKindEnum[keyof typeof SystemStageTurnKindEnum];
|
||||
|
|
|
|||
34
lib/packages/fabro-api-client/src/models/tls-settings.ts
Normal file
34
lib/packages/fabro-api-client/src/models/tls-settings.ts
Normal 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;
|
||||
}
|
||||
|
||||
|
|
@ -33,7 +33,7 @@ export interface ToolStageTurn {
|
|||
}
|
||||
|
||||
export const ToolStageTurnKindEnum = {
|
||||
TOOL: 'tool'
|
||||
TOOL: 'tool',
|
||||
} as const;
|
||||
|
||||
export type ToolStageTurnKindEnum = typeof ToolStageTurnKindEnum[keyof typeof ToolStageTurnKindEnum];
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ export interface ToolTurn {
|
|||
}
|
||||
|
||||
export const ToolTurnKindEnum = {
|
||||
TOOL: 'tool'
|
||||
TOOL: 'tool',
|
||||
} as const;
|
||||
|
||||
export type ToolTurnKindEnum = typeof ToolTurnKindEnum[keyof typeof ToolTurnKindEnum];
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ export interface UserTurn {
|
|||
}
|
||||
|
||||
export const UserTurnKindEnum = {
|
||||
USER: 'user'
|
||||
USER: 'user',
|
||||
} as const;
|
||||
|
||||
export type UserTurnKindEnum = typeof UserTurnKindEnum[keyof typeof UserTurnKindEnum];
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
30
lib/packages/fabro-api-client/src/models/web-settings.ts
Normal file
30
lib/packages/fabro-api-client/src/models/web-settings.ts
Normal 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;
|
||||
}
|
||||
|
||||
33
lib/packages/fabro-api-client/src/models/webhook-settings.ts
Normal file
33
lib/packages/fabro-api-client/src/models/webhook-settings.ts
Normal 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];
|
||||
|
||||
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ export interface WorkflowListItem {
|
|||
*/
|
||||
'slug': string;
|
||||
/**
|
||||
* DOT graph filename.
|
||||
* Graphviz graph filename.
|
||||
*/
|
||||
'filename': string;
|
||||
'last_run'?: WorkflowLastRun;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue