From 55df05fe432be31ded0c1b1e68c3ffc4ebefef0f Mon Sep 17 00:00:00 2001 From: Bryan Helmkamp Date: Mon, 30 Mar 2026 16:00:50 -0400 Subject: [PATCH] Prefix API routes with /api/v1 --- apps/fabro-web/app/lib/config.server.ts | 2 +- docs/administration/deploy-server.mdx | 8 +- docs/administration/server-configuration.mdx | 2 +- docs/api-reference/client-sdks.mdx | 2 +- docs/api-reference/demo-mode.mdx | 4 +- docs/api-reference/fabro-api.yaml | 96 +++++------ docs/api-reference/overview.mdx | 10 +- docs/docs.json | 60 +++---- docs/human-tools/preview.mdx | 2 +- docs/human-tools/steering.mdx | 2 +- docs/reference/architecture.mdx | 2 +- docs/reference/cli.mdx | 4 +- docs/reference/user-configuration.mdx | 6 +- lib/crates/fabro-cli/src/commands/install.rs | 2 +- lib/crates/fabro-cli/src/user_config.rs | 2 +- lib/crates/fabro-config/src/server.rs | 2 +- lib/crates/fabro-server/src/server.rs | 135 ++++++++------- lib/crates/fabro-server/src/sessions.rs | 22 ++- lib/crates/fabro-server/tests/it/api.rs | 145 +++++++++++++--- .../fabro-server/tests/it/pagination.rs | 22 +-- lib/crates/fabro-types/src/settings/server.rs | 2 +- .../src/.openapi-generator/FILES | 48 +++--- .../src/.openapi-generator/VERSION | 2 +- .../src/api/completions-api.ts | 2 +- .../fabro-api-client/src/api/discovery-api.ts | 4 +- .../src/api/human-in-the-loop-api.ts | 8 +- .../fabro-api-client/src/api/insights-api.ts | 14 +- .../fabro-api-client/src/api/models-api.ts | 4 +- .../fabro-api-client/src/api/retros-api.ts | 4 +- .../src/api/run-internals-api.ts | 159 +++++++++--------- .../src/api/run-outputs-api.ts | 6 +- .../fabro-api-client/src/api/runs-api.ts | 24 +-- .../fabro-api-client/src/api/sessions-api.ts | 10 +- .../fabro-api-client/src/api/settings-api.ts | 3 +- .../fabro-api-client/src/api/usage-api.ts | 2 +- .../src/api/verification-api.ts | 22 +-- .../fabro-api-client/src/api/workflows-api.ts | 15 +- .../src/models/api-settings.ts | 42 +++++ .../src/models/assets-settings.ts | 26 +++ .../src/models/assistant-stage-turn.ts | 2 +- .../src/models/assistant-turn.ts | 2 +- .../src/models/auth-settings.ts | 38 +++++ .../src/models/board-column.ts | 2 +- .../src/models/check-run-status.ts | 2 +- .../src/models/checkpoint-settings.ts | 26 +++ .../src/models/completion-message.ts | 2 +- .../src/models/completion-tool-choice.ts | 2 +- .../models/daytona-settings-network-one-of.ts | 23 +++ .../src/models/daytona-settings-network.ts | 26 +++ .../src/models/daytona-settings.ts | 42 +++++ .../src/models/daytona-snapshot-settings.ts | 42 +++++ .../src/models/exe-settings.ts | 26 +++ .../src/models/friction-kind.ts | 2 +- .../src/models/git-author-settings.ts | 30 ++++ .../src/models/git-hub-settings.ts | 26 +++ .../src/models/git-settings.ts | 53 ++++++ .../src/models/hook-definition.ts | 6 +- .../fabro-api-client/src/models/index.ts | 48 +++--- .../src/models/learning-category.ts | 2 +- .../src/models/llm-settings.ts | 34 ++++ .../src/models/local-sandbox-settings.ts | 36 ++++ .../src/models/log-settings.ts | 26 +++ .../src/models/model-test-result.ts | 2 +- .../src/models/open-item-kind.ts | 2 +- .../src/models/pull-request-settings.ts | 47 ++++++ .../src/models/question-type.ts | 2 +- .../src/models/run-settings.ts | 58 +++++++ .../fabro-api-client/src/models/run-stage.ts | 2 +- .../fabro-api-client/src/models/run-status.ts | 2 +- .../src/models/sandbox-settings.ts | 54 ++++++ .../src/models/server-settings.ts | 97 +++++++++++ .../src/models/setup-settings.ts | 30 ++++ .../src/models/signoff-status.ts | 2 +- .../src/models/smoothness-rating.ts | 2 +- .../src/models/ssh-settings.ts | 34 ++++ .../src/models/stage-status.ts | 2 +- .../src/models/start-run-request.ts | 4 +- .../src/models/system-stage-turn.ts | 2 +- .../src/models/tls-settings.ts | 34 ++++ .../src/models/tool-stage-turn.ts | 2 +- .../fabro-api-client/src/models/tool-turn.ts | 2 +- .../fabro-api-client/src/models/user-turn.ts | 2 +- .../src/models/verification-mode.ts | 2 +- .../src/models/verification-result.ts | 2 +- .../src/models/verification-type.ts | 2 +- .../src/models/web-settings.ts | 30 ++++ .../src/models/webhook-settings.ts | 33 ++++ .../src/models/workflow-detail.ts | 7 +- .../src/models/workflow-list-item.ts | 2 +- 89 files changed, 1459 insertions(+), 426 deletions(-) create mode 100644 lib/packages/fabro-api-client/src/models/api-settings.ts create mode 100644 lib/packages/fabro-api-client/src/models/assets-settings.ts create mode 100644 lib/packages/fabro-api-client/src/models/auth-settings.ts create mode 100644 lib/packages/fabro-api-client/src/models/checkpoint-settings.ts create mode 100644 lib/packages/fabro-api-client/src/models/daytona-settings-network-one-of.ts create mode 100644 lib/packages/fabro-api-client/src/models/daytona-settings-network.ts create mode 100644 lib/packages/fabro-api-client/src/models/daytona-settings.ts create mode 100644 lib/packages/fabro-api-client/src/models/daytona-snapshot-settings.ts create mode 100644 lib/packages/fabro-api-client/src/models/exe-settings.ts create mode 100644 lib/packages/fabro-api-client/src/models/git-author-settings.ts create mode 100644 lib/packages/fabro-api-client/src/models/git-hub-settings.ts create mode 100644 lib/packages/fabro-api-client/src/models/git-settings.ts create mode 100644 lib/packages/fabro-api-client/src/models/llm-settings.ts create mode 100644 lib/packages/fabro-api-client/src/models/local-sandbox-settings.ts create mode 100644 lib/packages/fabro-api-client/src/models/log-settings.ts create mode 100644 lib/packages/fabro-api-client/src/models/pull-request-settings.ts create mode 100644 lib/packages/fabro-api-client/src/models/run-settings.ts create mode 100644 lib/packages/fabro-api-client/src/models/sandbox-settings.ts create mode 100644 lib/packages/fabro-api-client/src/models/server-settings.ts create mode 100644 lib/packages/fabro-api-client/src/models/setup-settings.ts create mode 100644 lib/packages/fabro-api-client/src/models/ssh-settings.ts create mode 100644 lib/packages/fabro-api-client/src/models/tls-settings.ts create mode 100644 lib/packages/fabro-api-client/src/models/web-settings.ts create mode 100644 lib/packages/fabro-api-client/src/models/webhook-settings.ts diff --git a/apps/fabro-web/app/lib/config.server.ts b/apps/fabro-web/app/lib/config.server.ts index f5d75b283..01142f644 100644 --- a/apps/fabro-web/app/lib/config.server.ts +++ b/apps/fabro-web/app/lib/config.server.ts @@ -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", }; diff --git a/docs/administration/deploy-server.mdx b/docs/administration/deploy-server.mdx index 5818d0eca..643d5183d 100644 --- a/docs/administration/deploy-server.mdx +++ b/docs/administration/deploy-server.mdx @@ -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. diff --git a/docs/administration/server-configuration.mdx b/docs/administration/server-configuration.mdx index 31736f164..085fa0599 100644 --- a/docs/administration/server-configuration.mdx +++ b/docs/administration/server-configuration.mdx @@ -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" diff --git a/docs/api-reference/client-sdks.mdx b/docs/api-reference/client-sdks.mdx index 3e3ba3975..3e852fbf9 100644 --- a/docs/api-reference/client-sdks.mdx +++ b/docs/api-reference/client-sdks.mdx @@ -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) diff --git a/docs/api-reference/demo-mode.mdx b/docs/api-reference/demo-mode.mdx index 95d89bb4e..0af074560 100644 --- a/docs/api-reference/demo-mode.mdx +++ b/docs/api-reference/demo-mode.mdx @@ -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. diff --git a/docs/api-reference/fabro-api.yaml b/docs/api-reference/fabro-api.yaml index 937f3ca3f..33eb06edd 100644 --- a/docs/api-reference/fabro-api.yaml +++ b/docs/api-reference/fabro-api.yaml @@ -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. diff --git a/docs/api-reference/overview.mdx b/docs/api-reference/overview.mdx index 54bcf3568..44539e5ae 100644 --- a/docs/api-reference/overview.mdx +++ b/docs/api-reference/overview.mdx @@ -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`. diff --git a/docs/docs.json b/docs/docs.json index 2f3535bf7..cd07c8d33 100644 --- a/docs/docs.json +++ b/docs/docs.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" ] } ] diff --git a/docs/human-tools/preview.mdx b/docs/human-tools/preview.mdx index 850727e21..f7ba6e815 100644 --- a/docs/human-tools/preview.mdx +++ b/docs/human-tools/preview.mdx @@ -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 diff --git a/docs/human-tools/steering.mdx b/docs/human-tools/steering.mdx index d66a9f5e5..77e163cde 100644 --- a/docs/human-tools/steering.mdx +++ b/docs/human-tools/steering.mdx @@ -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 diff --git a/docs/reference/architecture.mdx b/docs/reference/architecture.mdx index 4454d462a..e69d60c8c 100644 --- a/docs/reference/architecture.mdx +++ b/docs/reference/architecture.mdx @@ -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`. diff --git a/docs/reference/cli.mdx b/docs/reference/cli.mdx index cfb1087e2..c325cab61 100644 --- a/docs/reference/cli.mdx +++ b/docs/reference/cli.mdx @@ -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 | diff --git a/docs/reference/user-configuration.mdx b/docs/reference/user-configuration.mdx index 96623b54e..bd27dc48f 100644 --- a/docs/reference/user-configuration.mdx +++ b/docs/reference/user-configuration.mdx @@ -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 diff --git a/lib/crates/fabro-cli/src/commands/install.rs b/lib/crates/fabro-cli/src/commands/install.rs index 231f762ab..b05ac10f8 100644 --- a/lib/crates/fabro-cli/src/commands/install.rs +++ b/lib/crates/fabro-cli/src/commands/install.rs @@ -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] diff --git a/lib/crates/fabro-cli/src/user_config.rs b/lib/crates/fabro-cli/src/user_config.rs index eca7685a3..5a473637e 100644 --- a/lib/crates/fabro-cli/src/user_config.rs +++ b/lib/crates/fabro-cli/src/user_config.rs @@ -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( diff --git a/lib/crates/fabro-config/src/server.rs b/lib/crates/fabro-config/src/server.rs index 4b910b930..4147598de 100644 --- a/lib/crates/fabro-config/src/server.rs +++ b/lib/crates/fabro-config/src/server.rs @@ -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 for ApiSettings { diff --git a/lib/crates/fabro-server/src/server.rs b/lib/crates/fabro-server/src/server.rs index 880713469..29f2d3e4e 100644 --- a/lib/crates/fabro-server/src/server.rs +++ b/lib/crates/fabro-server/src/server.rs @@ -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, 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(); diff --git a/lib/crates/fabro-server/src/sessions.rs b/lib/crates/fabro-server/src/sessions.rs index 8ab3afae6..ce976c38d 100644 --- a/lib/crates/fabro-server/src/sessions.rs +++ b/lib/crates/fabro-server/src/sessions.rs @@ -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(); diff --git a/lib/crates/fabro-server/tests/it/api.rs b/lib/crates/fabro-server/tests/it/api.rs index 3a405c88d..3614d9718 100644 --- a/lib/crates/fabro-server/tests/it/api.rs +++ b/lib/crates/fabro-server/tests/it/api.rs @@ -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}"); + } + } +} diff --git a/lib/crates/fabro-server/tests/it/pagination.rs b/lib/crates/fabro-server/tests/it/pagination.rs index f370274b3..c2916db5d 100644 --- a/lib/crates/fabro-server/tests/it/pagination.rs +++ b/lib/crates/fabro-server/tests/it/pagination.rs @@ -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", }, ]; diff --git a/lib/crates/fabro-types/src/settings/server.rs b/lib/crates/fabro-types/src/settings/server.rs index f8bd40c8c..6b3e44887 100644 --- a/lib/crates/fabro-types/src/settings/server.rs +++ b/lib/crates/fabro-types/src/settings/server.rs @@ -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 { diff --git a/lib/packages/fabro-api-client/src/.openapi-generator/FILES b/lib/packages/fabro-api-client/src/.openapi-generator/FILES index 0e119bf95..7a3ebe768 100644 --- a/lib/packages/fabro-api-client/src/.openapi-generator/FILES +++ b/lib/packages/fabro-api-client/src/.openapi-generator/FILES @@ -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 diff --git a/lib/packages/fabro-api-client/src/.openapi-generator/VERSION b/lib/packages/fabro-api-client/src/.openapi-generator/VERSION index 2540a3a5b..a29ba3d5c 100644 --- a/lib/packages/fabro-api-client/src/.openapi-generator/VERSION +++ b/lib/packages/fabro-api-client/src/.openapi-generator/VERSION @@ -1 +1 @@ -7.20.0 +7.21.0 diff --git a/lib/packages/fabro-api-client/src/api/completions-api.ts b/lib/packages/fabro-api-client/src/api/completions-api.ts index 1aa64791d..e30bb2719 100644 --- a/lib/packages/fabro-api-client/src/api/completions-api.ts +++ b/lib/packages/fabro-api-client/src/api/completions-api.ts @@ -42,7 +42,7 @@ export const CompletionsApiAxiosParamCreator = function (configuration?: Configu createCompletion: async (createCompletionRequest: CreateCompletionRequest, options: RawAxiosRequestConfig = {}): Promise => { // 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; diff --git a/lib/packages/fabro-api-client/src/api/discovery-api.ts b/lib/packages/fabro-api-client/src/api/discovery-api.ts index 3b1a11500..43d7a3f6d 100644 --- a/lib/packages/fabro-api-client/src/api/discovery-api.ts +++ b/lib/packages/fabro-api-client/src/api/discovery-api.ts @@ -71,7 +71,7 @@ export const DiscoveryApiAxiosParamCreator = function (configuration?: Configura * @throws {RequiredError} */ getOpenApiSpec: async (options: RawAxiosRequestConfig = {}): Promise => { - 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 => { - 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; diff --git a/lib/packages/fabro-api-client/src/api/human-in-the-loop-api.ts b/lib/packages/fabro-api-client/src/api/human-in-the-loop-api.ts index 3a6a9e257..ef82a1570 100644 --- a/lib/packages/fabro-api-client/src/api/human-in-the-loop-api.ts +++ b/lib/packages/fabro-api-client/src/api/human-in-the-loop-api.ts @@ -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 => { // 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. diff --git a/lib/packages/fabro-api-client/src/api/insights-api.ts b/lib/packages/fabro-api-client/src/api/insights-api.ts index b92bbedec..8526863b8 100644 --- a/lib/packages/fabro-api-client/src/api/insights-api.ts +++ b/lib/packages/fabro-api-client/src/api/insights-api.ts @@ -50,7 +50,7 @@ export const InsightsApiAxiosParamCreator = function (configuration?: Configurat createSavedQuery: async (saveQueryRequest: SaveQueryRequest, options: RawAxiosRequestConfig = {}): Promise => { // 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 => { // 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 => { // 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 => { - 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 => { - 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 => { // 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); diff --git a/lib/packages/fabro-api-client/src/api/models-api.ts b/lib/packages/fabro-api-client/src/api/models-api.ts index 86792bca6..e21cf1ae5 100644 --- a/lib/packages/fabro-api-client/src/api/models-api.ts +++ b/lib/packages/fabro-api-client/src/api/models-api.ts @@ -41,7 +41,7 @@ export const ModelsApiAxiosParamCreator = function (configuration?: Configuratio * @throws {RequiredError} */ listModels: async (pageLimit?: number, pageOffset?: number, options: RawAxiosRequestConfig = {}): Promise => { - 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 => { // 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); diff --git a/lib/packages/fabro-api-client/src/api/retros-api.ts b/lib/packages/fabro-api-client/src/api/retros-api.ts index ff7d50f97..8e31bf086 100644 --- a/lib/packages/fabro-api-client/src/api/retros-api.ts +++ b/lib/packages/fabro-api-client/src/api/retros-api.ts @@ -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 => { - 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 => { // 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); diff --git a/lib/packages/fabro-api-client/src/api/run-internals-api.ts b/lib/packages/fabro-api-client/src/api/run-internals-api.ts index 660e3a604..cd68cd542 100644 --- a/lib/packages/fabro-api-client/src/api/run-internals-api.ts +++ b/lib/packages/fabro-api-client/src/api/run-internals-api.ts @@ -48,7 +48,7 @@ export const RunInternalsApiAxiosParamCreator = function (configuration?: Config listRunStages: async (id: string, pageLimit?: number, pageOffset?: number, options: RawAxiosRequestConfig = {}): Promise => { // 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 => { // 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 => { - // 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 => { // 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 => { + // 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> { - 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> { + 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 { 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 { - 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 { + 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)); + } } + diff --git a/lib/packages/fabro-api-client/src/api/run-outputs-api.ts b/lib/packages/fabro-api-client/src/api/run-outputs-api.ts index 2682a6834..3008fc778 100644 --- a/lib/packages/fabro-api-client/src/api/run-outputs-api.ts +++ b/lib/packages/fabro-api-client/src/api/run-outputs-api.ts @@ -47,7 +47,7 @@ export const RunOutputsApiAxiosParamCreator = function (configuration?: Configur retrieveRunFiles: async (id: string, checkpoint?: string, pageLimit?: number, pageOffset?: number, options: RawAxiosRequestConfig = {}): Promise => { // 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 => { // 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 => { // 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); diff --git a/lib/packages/fabro-api-client/src/api/runs-api.ts b/lib/packages/fabro-api-client/src/api/runs-api.ts index 64785c636..f8649b9d1 100644 --- a/lib/packages/fabro-api-client/src/api/runs-api.ts +++ b/lib/packages/fabro-api-client/src/api/runs-api.ts @@ -44,7 +44,7 @@ export const RunsApiAxiosParamCreator = function (configuration?: Configuration) cancelRun: async (id: string, options: RawAxiosRequestConfig = {}): Promise => { // 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 => { - 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 => { // 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 => { // 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 => { // 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 => { // 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 => { // 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 => { // 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. diff --git a/lib/packages/fabro-api-client/src/api/sessions-api.ts b/lib/packages/fabro-api-client/src/api/sessions-api.ts index 8f629a7e4..7b7ab2b87 100644 --- a/lib/packages/fabro-api-client/src/api/sessions-api.ts +++ b/lib/packages/fabro-api-client/src/api/sessions-api.ts @@ -50,7 +50,7 @@ export const SessionsApiAxiosParamCreator = function (configuration?: Configurat createSession: async (createSessionRequest: CreateSessionRequest, options: RawAxiosRequestConfig = {}): Promise => { // 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 => { - 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 => { // 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 => { // 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); diff --git a/lib/packages/fabro-api-client/src/api/settings-api.ts b/lib/packages/fabro-api-client/src/api/settings-api.ts index d148a1e23..a54b400fd 100644 --- a/lib/packages/fabro-api-client/src/api/settings-api.ts +++ b/lib/packages/fabro-api-client/src/api/settings-api.ts @@ -35,7 +35,7 @@ export const SettingsApiAxiosParamCreator = function (configuration?: Configurat * @throws {RequiredError} */ retrieveServerSettings: async (options: RawAxiosRequestConfig = {}): Promise => { - 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)); } } + diff --git a/lib/packages/fabro-api-client/src/api/usage-api.ts b/lib/packages/fabro-api-client/src/api/usage-api.ts index 146e5cf2d..b89a0375d 100644 --- a/lib/packages/fabro-api-client/src/api/usage-api.ts +++ b/lib/packages/fabro-api-client/src/api/usage-api.ts @@ -35,7 +35,7 @@ export const UsageApiAxiosParamCreator = function (configuration?: Configuration * @throws {RequiredError} */ getAggregateUsage: async (options: RawAxiosRequestConfig = {}): Promise => { - 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; diff --git a/lib/packages/fabro-api-client/src/api/verification-api.ts b/lib/packages/fabro-api-client/src/api/verification-api.ts index d72bc41b0..b898fa86d 100644 --- a/lib/packages/fabro-api-client/src/api/verification-api.ts +++ b/lib/packages/fabro-api-client/src/api/verification-api.ts @@ -52,7 +52,7 @@ export const VerificationApiAxiosParamCreator = function (configuration?: Config createSignoff: async (createSignoffRequest: CreateSignoffRequest, options: RawAxiosRequestConfig = {}): Promise => { // 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 => { - 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 => { - 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 => { - 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 => { // 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 => { // 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 => { // 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. diff --git a/lib/packages/fabro-api-client/src/api/workflows-api.ts b/lib/packages/fabro-api-client/src/api/workflows-api.ts index 41021f2f0..2529630ca 100644 --- a/lib/packages/fabro-api-client/src/api/workflows-api.ts +++ b/lib/packages/fabro-api-client/src/api/workflows-api.ts @@ -46,7 +46,7 @@ export const WorkflowsApiAxiosParamCreator = function (configuration?: Configura listWorkflowRuns: async (name: string, pageLimit?: number, pageOffset?: number, options: RawAxiosRequestConfig = {}): Promise => { // 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 => { - 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 => { // 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)); } } + diff --git a/lib/packages/fabro-api-client/src/models/api-settings.ts b/lib/packages/fabro-api-client/src/models/api-settings.ts new file mode 100644 index 000000000..68e9c6159 --- /dev/null +++ b/lib/packages/fabro-api-client/src/models/api-settings.ts @@ -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; + 'tls'?: TlsSettings; +} + +export const ApiSettingsAuthenticationStrategiesEnum = { + JWT: 'jwt', + MTLS: 'mtls', +} as const; + +export type ApiSettingsAuthenticationStrategiesEnum = typeof ApiSettingsAuthenticationStrategiesEnum[keyof typeof ApiSettingsAuthenticationStrategiesEnum]; + + diff --git a/lib/packages/fabro-api-client/src/models/assets-settings.ts b/lib/packages/fabro-api-client/src/models/assets-settings.ts new file mode 100644 index 000000000..37a2b3d37 --- /dev/null +++ b/lib/packages/fabro-api-client/src/models/assets-settings.ts @@ -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; +} + diff --git a/lib/packages/fabro-api-client/src/models/assistant-stage-turn.ts b/lib/packages/fabro-api-client/src/models/assistant-stage-turn.ts index 8e0a8edcf..6e323ccb0 100644 --- a/lib/packages/fabro-api-client/src/models/assistant-stage-turn.ts +++ b/lib/packages/fabro-api-client/src/models/assistant-stage-turn.ts @@ -26,7 +26,7 @@ export interface AssistantStageTurn { } export const AssistantStageTurnKindEnum = { - ASSISTANT: 'assistant' + ASSISTANT: 'assistant', } as const; export type AssistantStageTurnKindEnum = typeof AssistantStageTurnKindEnum[keyof typeof AssistantStageTurnKindEnum]; diff --git a/lib/packages/fabro-api-client/src/models/assistant-turn.ts b/lib/packages/fabro-api-client/src/models/assistant-turn.ts index 646c3af37..14b89c9bb 100644 --- a/lib/packages/fabro-api-client/src/models/assistant-turn.ts +++ b/lib/packages/fabro-api-client/src/models/assistant-turn.ts @@ -30,7 +30,7 @@ export interface AssistantTurn { } export const AssistantTurnKindEnum = { - ASSISTANT: 'assistant' + ASSISTANT: 'assistant', } as const; export type AssistantTurnKindEnum = typeof AssistantTurnKindEnum[keyof typeof AssistantTurnKindEnum]; diff --git a/lib/packages/fabro-api-client/src/models/auth-settings.ts b/lib/packages/fabro-api-client/src/models/auth-settings.ts new file mode 100644 index 000000000..8951ecc78 --- /dev/null +++ b/lib/packages/fabro-api-client/src/models/auth-settings.ts @@ -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; +} + +export const AuthSettingsProviderEnum = { + GITHUB: 'github', + INSECURE_DISABLED: 'insecure_disabled', +} as const; + +export type AuthSettingsProviderEnum = typeof AuthSettingsProviderEnum[keyof typeof AuthSettingsProviderEnum]; + + diff --git a/lib/packages/fabro-api-client/src/models/board-column.ts b/lib/packages/fabro-api-client/src/models/board-column.ts index c40047634..584655249 100644 --- a/lib/packages/fabro-api-client/src/models/board-column.ts +++ b/lib/packages/fabro-api-client/src/models/board-column.ts @@ -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]; diff --git a/lib/packages/fabro-api-client/src/models/check-run-status.ts b/lib/packages/fabro-api-client/src/models/check-run-status.ts index a1cc8fd72..e5d6224cc 100644 --- a/lib/packages/fabro-api-client/src/models/check-run-status.ts +++ b/lib/packages/fabro-api-client/src/models/check-run-status.ts @@ -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]; diff --git a/lib/packages/fabro-api-client/src/models/checkpoint-settings.ts b/lib/packages/fabro-api-client/src/models/checkpoint-settings.ts new file mode 100644 index 000000000..b16f61b44 --- /dev/null +++ b/lib/packages/fabro-api-client/src/models/checkpoint-settings.ts @@ -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; +} + diff --git a/lib/packages/fabro-api-client/src/models/completion-message.ts b/lib/packages/fabro-api-client/src/models/completion-message.ts index 75ca6b9ff..440d98bc7 100644 --- a/lib/packages/fabro-api-client/src/models/completion-message.ts +++ b/lib/packages/fabro-api-client/src/models/completion-message.ts @@ -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]; diff --git a/lib/packages/fabro-api-client/src/models/completion-tool-choice.ts b/lib/packages/fabro-api-client/src/models/completion-tool-choice.ts index 3496175db..225a57218 100644 --- a/lib/packages/fabro-api-client/src/models/completion-tool-choice.ts +++ b/lib/packages/fabro-api-client/src/models/completion-tool-choice.ts @@ -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]; diff --git a/lib/packages/fabro-api-client/src/models/daytona-settings-network-one-of.ts b/lib/packages/fabro-api-client/src/models/daytona-settings-network-one-of.ts new file mode 100644 index 000000000..c19be5122 --- /dev/null +++ b/lib/packages/fabro-api-client/src/models/daytona-settings-network-one-of.ts @@ -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; +} + diff --git a/lib/packages/fabro-api-client/src/models/daytona-settings-network.ts b/lib/packages/fabro-api-client/src/models/daytona-settings-network.ts new file mode 100644 index 000000000..faa31fc2c --- /dev/null +++ b/lib/packages/fabro-api-client/src/models/daytona-settings-network.ts @@ -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; + + diff --git a/lib/packages/fabro-api-client/src/models/daytona-settings.ts b/lib/packages/fabro-api-client/src/models/daytona-settings.ts new file mode 100644 index 000000000..5738b17fa --- /dev/null +++ b/lib/packages/fabro-api-client/src/models/daytona-settings.ts @@ -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; +} + diff --git a/lib/packages/fabro-api-client/src/models/daytona-snapshot-settings.ts b/lib/packages/fabro-api-client/src/models/daytona-snapshot-settings.ts new file mode 100644 index 000000000..afb9fc7e2 --- /dev/null +++ b/lib/packages/fabro-api-client/src/models/daytona-snapshot-settings.ts @@ -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; +} + diff --git a/lib/packages/fabro-api-client/src/models/exe-settings.ts b/lib/packages/fabro-api-client/src/models/exe-settings.ts new file mode 100644 index 000000000..a214b0237 --- /dev/null +++ b/lib/packages/fabro-api-client/src/models/exe-settings.ts @@ -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; +} + diff --git a/lib/packages/fabro-api-client/src/models/friction-kind.ts b/lib/packages/fabro-api-client/src/models/friction-kind.ts index 4a368e159..d68094359 100644 --- a/lib/packages/fabro-api-client/src/models/friction-kind.ts +++ b/lib/packages/fabro-api-client/src/models/friction-kind.ts @@ -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]; diff --git a/lib/packages/fabro-api-client/src/models/git-author-settings.ts b/lib/packages/fabro-api-client/src/models/git-author-settings.ts new file mode 100644 index 000000000..aaae0960d --- /dev/null +++ b/lib/packages/fabro-api-client/src/models/git-author-settings.ts @@ -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; +} + diff --git a/lib/packages/fabro-api-client/src/models/git-hub-settings.ts b/lib/packages/fabro-api-client/src/models/git-hub-settings.ts new file mode 100644 index 000000000..b0f56b6c9 --- /dev/null +++ b/lib/packages/fabro-api-client/src/models/git-hub-settings.ts @@ -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; }; +} + diff --git a/lib/packages/fabro-api-client/src/models/git-settings.ts b/lib/packages/fabro-api-client/src/models/git-settings.ts new file mode 100644 index 000000000..a2534f41b --- /dev/null +++ b/lib/packages/fabro-api-client/src/models/git-settings.ts @@ -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]; + + diff --git a/lib/packages/fabro-api-client/src/models/hook-definition.ts b/lib/packages/fabro-api-client/src/models/hook-definition.ts index b0717999b..56c61c32d 100644 --- a/lib/packages/fabro-api-client/src/models/hook-definition.ts +++ b/lib/packages/fabro-api-client/src/models/hook-definition.ts @@ -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]; diff --git a/lib/packages/fabro-api-client/src/models/index.ts b/lib/packages/fabro-api-client/src/models/index.ts index 3bf6eacf0..fc4f12efb 100644 --- a/lib/packages/fabro-api-client/src/models/index.ts +++ b/lib/packages/fabro-api-client/src/models/index.ts @@ -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'; diff --git a/lib/packages/fabro-api-client/src/models/learning-category.ts b/lib/packages/fabro-api-client/src/models/learning-category.ts index c5bee9fbb..25ab790fa 100644 --- a/lib/packages/fabro-api-client/src/models/learning-category.ts +++ b/lib/packages/fabro-api-client/src/models/learning-category.ts @@ -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]; diff --git a/lib/packages/fabro-api-client/src/models/llm-settings.ts b/lib/packages/fabro-api-client/src/models/llm-settings.ts new file mode 100644 index 000000000..e2ec24400 --- /dev/null +++ b/lib/packages/fabro-api-client/src/models/llm-settings.ts @@ -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; }; +} + diff --git a/lib/packages/fabro-api-client/src/models/local-sandbox-settings.ts b/lib/packages/fabro-api-client/src/models/local-sandbox-settings.ts new file mode 100644 index 000000000..8055e7ebd --- /dev/null +++ b/lib/packages/fabro-api-client/src/models/local-sandbox-settings.ts @@ -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]; + + diff --git a/lib/packages/fabro-api-client/src/models/log-settings.ts b/lib/packages/fabro-api-client/src/models/log-settings.ts new file mode 100644 index 000000000..f973459a3 --- /dev/null +++ b/lib/packages/fabro-api-client/src/models/log-settings.ts @@ -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; +} + diff --git a/lib/packages/fabro-api-client/src/models/model-test-result.ts b/lib/packages/fabro-api-client/src/models/model-test-result.ts index 844d0c3db..7776c6b65 100644 --- a/lib/packages/fabro-api-client/src/models/model-test-result.ts +++ b/lib/packages/fabro-api-client/src/models/model-test-result.ts @@ -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]; diff --git a/lib/packages/fabro-api-client/src/models/open-item-kind.ts b/lib/packages/fabro-api-client/src/models/open-item-kind.ts index 4a77e2ab9..68b0780f1 100644 --- a/lib/packages/fabro-api-client/src/models/open-item-kind.ts +++ b/lib/packages/fabro-api-client/src/models/open-item-kind.ts @@ -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]; diff --git a/lib/packages/fabro-api-client/src/models/pull-request-settings.ts b/lib/packages/fabro-api-client/src/models/pull-request-settings.ts new file mode 100644 index 000000000..c2af9b9c5 --- /dev/null +++ b/lib/packages/fabro-api-client/src/models/pull-request-settings.ts @@ -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]; + + diff --git a/lib/packages/fabro-api-client/src/models/question-type.ts b/lib/packages/fabro-api-client/src/models/question-type.ts index fce56e731..294acd398 100644 --- a/lib/packages/fabro-api-client/src/models/question-type.ts +++ b/lib/packages/fabro-api-client/src/models/question-type.ts @@ -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]; diff --git a/lib/packages/fabro-api-client/src/models/run-settings.ts b/lib/packages/fabro-api-client/src/models/run-settings.ts new file mode 100644 index 000000000..6a8b4309d --- /dev/null +++ b/lib/packages/fabro-api-client/src/models/run-settings.ts @@ -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; +} + diff --git a/lib/packages/fabro-api-client/src/models/run-stage.ts b/lib/packages/fabro-api-client/src/models/run-stage.ts index e9cdc753e..575b12c96 100644 --- a/lib/packages/fabro-api-client/src/models/run-stage.ts +++ b/lib/packages/fabro-api-client/src/models/run-stage.ts @@ -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; } diff --git a/lib/packages/fabro-api-client/src/models/run-status.ts b/lib/packages/fabro-api-client/src/models/run-status.ts index cc748cf77..dd5b4a4d1 100644 --- a/lib/packages/fabro-api-client/src/models/run-status.ts +++ b/lib/packages/fabro-api-client/src/models/run-status.ts @@ -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]; diff --git a/lib/packages/fabro-api-client/src/models/sandbox-settings.ts b/lib/packages/fabro-api-client/src/models/sandbox-settings.ts new file mode 100644 index 000000000..9f439a793 --- /dev/null +++ b/lib/packages/fabro-api-client/src/models/sandbox-settings.ts @@ -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; }; +} + diff --git a/lib/packages/fabro-api-client/src/models/server-settings.ts b/lib/packages/fabro-api-client/src/models/server-settings.ts new file mode 100644 index 000000000..869e5886d --- /dev/null +++ b/lib/packages/fabro-api-client/src/models/server-settings.ts @@ -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; + 'assets'?: AssetsSettings; + /** + * Default MCP server configurations. + */ + 'mcp_servers'?: { [key: string]: McpServerEntry; }; + 'github'?: GitHubSettings; +} + diff --git a/lib/packages/fabro-api-client/src/models/setup-settings.ts b/lib/packages/fabro-api-client/src/models/setup-settings.ts new file mode 100644 index 000000000..538cde1c0 --- /dev/null +++ b/lib/packages/fabro-api-client/src/models/setup-settings.ts @@ -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; + /** + * Timeout per command in milliseconds. + */ + 'timeout_ms'?: number; +} + diff --git a/lib/packages/fabro-api-client/src/models/signoff-status.ts b/lib/packages/fabro-api-client/src/models/signoff-status.ts index 84a7f7149..7f52cd401 100644 --- a/lib/packages/fabro-api-client/src/models/signoff-status.ts +++ b/lib/packages/fabro-api-client/src/models/signoff-status.ts @@ -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]; diff --git a/lib/packages/fabro-api-client/src/models/smoothness-rating.ts b/lib/packages/fabro-api-client/src/models/smoothness-rating.ts index a11203368..ba37c50bb 100644 --- a/lib/packages/fabro-api-client/src/models/smoothness-rating.ts +++ b/lib/packages/fabro-api-client/src/models/smoothness-rating.ts @@ -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]; diff --git a/lib/packages/fabro-api-client/src/models/ssh-settings.ts b/lib/packages/fabro-api-client/src/models/ssh-settings.ts new file mode 100644 index 000000000..37fef613a --- /dev/null +++ b/lib/packages/fabro-api-client/src/models/ssh-settings.ts @@ -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; +} + diff --git a/lib/packages/fabro-api-client/src/models/stage-status.ts b/lib/packages/fabro-api-client/src/models/stage-status.ts index 0ef7faa41..77d8a0878 100644 --- a/lib/packages/fabro-api-client/src/models/stage-status.ts +++ b/lib/packages/fabro-api-client/src/models/stage-status.ts @@ -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]; diff --git a/lib/packages/fabro-api-client/src/models/start-run-request.ts b/lib/packages/fabro-api-client/src/models/start-run-request.ts index e58e77bdf..474175511 100644 --- a/lib/packages/fabro-api-client/src/models/start-run-request.ts +++ b/lib/packages/fabro-api-client/src/models/start-run-request.ts @@ -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; } diff --git a/lib/packages/fabro-api-client/src/models/system-stage-turn.ts b/lib/packages/fabro-api-client/src/models/system-stage-turn.ts index 68ad6386f..0310c2a90 100644 --- a/lib/packages/fabro-api-client/src/models/system-stage-turn.ts +++ b/lib/packages/fabro-api-client/src/models/system-stage-turn.ts @@ -26,7 +26,7 @@ export interface SystemStageTurn { } export const SystemStageTurnKindEnum = { - SYSTEM: 'system' + SYSTEM: 'system', } as const; export type SystemStageTurnKindEnum = typeof SystemStageTurnKindEnum[keyof typeof SystemStageTurnKindEnum]; diff --git a/lib/packages/fabro-api-client/src/models/tls-settings.ts b/lib/packages/fabro-api-client/src/models/tls-settings.ts new file mode 100644 index 000000000..541cb1245 --- /dev/null +++ b/lib/packages/fabro-api-client/src/models/tls-settings.ts @@ -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; +} + diff --git a/lib/packages/fabro-api-client/src/models/tool-stage-turn.ts b/lib/packages/fabro-api-client/src/models/tool-stage-turn.ts index e637a0520..dc1f0ebf8 100644 --- a/lib/packages/fabro-api-client/src/models/tool-stage-turn.ts +++ b/lib/packages/fabro-api-client/src/models/tool-stage-turn.ts @@ -33,7 +33,7 @@ export interface ToolStageTurn { } export const ToolStageTurnKindEnum = { - TOOL: 'tool' + TOOL: 'tool', } as const; export type ToolStageTurnKindEnum = typeof ToolStageTurnKindEnum[keyof typeof ToolStageTurnKindEnum]; diff --git a/lib/packages/fabro-api-client/src/models/tool-turn.ts b/lib/packages/fabro-api-client/src/models/tool-turn.ts index 9a1ddfb71..eac69ad08 100644 --- a/lib/packages/fabro-api-client/src/models/tool-turn.ts +++ b/lib/packages/fabro-api-client/src/models/tool-turn.ts @@ -33,7 +33,7 @@ export interface ToolTurn { } export const ToolTurnKindEnum = { - TOOL: 'tool' + TOOL: 'tool', } as const; export type ToolTurnKindEnum = typeof ToolTurnKindEnum[keyof typeof ToolTurnKindEnum]; diff --git a/lib/packages/fabro-api-client/src/models/user-turn.ts b/lib/packages/fabro-api-client/src/models/user-turn.ts index 2e8be3bfd..73cdc6cbf 100644 --- a/lib/packages/fabro-api-client/src/models/user-turn.ts +++ b/lib/packages/fabro-api-client/src/models/user-turn.ts @@ -30,7 +30,7 @@ export interface UserTurn { } export const UserTurnKindEnum = { - USER: 'user' + USER: 'user', } as const; export type UserTurnKindEnum = typeof UserTurnKindEnum[keyof typeof UserTurnKindEnum]; diff --git a/lib/packages/fabro-api-client/src/models/verification-mode.ts b/lib/packages/fabro-api-client/src/models/verification-mode.ts index cd7b5d745..5d1082d8f 100644 --- a/lib/packages/fabro-api-client/src/models/verification-mode.ts +++ b/lib/packages/fabro-api-client/src/models/verification-mode.ts @@ -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]; diff --git a/lib/packages/fabro-api-client/src/models/verification-result.ts b/lib/packages/fabro-api-client/src/models/verification-result.ts index 15d2641d3..333a7ba43 100644 --- a/lib/packages/fabro-api-client/src/models/verification-result.ts +++ b/lib/packages/fabro-api-client/src/models/verification-result.ts @@ -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]; diff --git a/lib/packages/fabro-api-client/src/models/verification-type.ts b/lib/packages/fabro-api-client/src/models/verification-type.ts index 3f86896a8..c0da24e4d 100644 --- a/lib/packages/fabro-api-client/src/models/verification-type.ts +++ b/lib/packages/fabro-api-client/src/models/verification-type.ts @@ -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]; diff --git a/lib/packages/fabro-api-client/src/models/web-settings.ts b/lib/packages/fabro-api-client/src/models/web-settings.ts new file mode 100644 index 000000000..a1bd5dd22 --- /dev/null +++ b/lib/packages/fabro-api-client/src/models/web-settings.ts @@ -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; +} + diff --git a/lib/packages/fabro-api-client/src/models/webhook-settings.ts b/lib/packages/fabro-api-client/src/models/webhook-settings.ts new file mode 100644 index 000000000..1ea36ec8e --- /dev/null +++ b/lib/packages/fabro-api-client/src/models/webhook-settings.ts @@ -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]; + + diff --git a/lib/packages/fabro-api-client/src/models/workflow-detail.ts b/lib/packages/fabro-api-client/src/models/workflow-detail.ts index b8faee159..09e91419a 100644 --- a/lib/packages/fabro-api-client/src/models/workflow-detail.ts +++ b/lib/packages/fabro-api-client/src/models/workflow-detail.ts @@ -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; } + diff --git a/lib/packages/fabro-api-client/src/models/workflow-list-item.ts b/lib/packages/fabro-api-client/src/models/workflow-list-item.ts index 1bc503531..c2db19e62 100644 --- a/lib/packages/fabro-api-client/src/models/workflow-list-item.ts +++ b/lib/packages/fabro-api-client/src/models/workflow-list-item.ts @@ -33,7 +33,7 @@ export interface WorkflowListItem { */ 'slug': string; /** - * DOT graph filename. + * Graphviz graph filename. */ 'filename': string; 'last_run'?: WorkflowLastRun;