Remove List Projects and List Branches API endpoints

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Bryan Helmkamp 2026-03-07 17:43:58 -05:00
parent 0e14b0a479
commit add14c63ee
13 changed files with 18 additions and 557 deletions

View file

@ -23,7 +23,7 @@ import { Link } from "react-router";
import { timeAgo, groupSessionsByDate } from "../lib/time";
import { apiJson } from "../api-client";
import { getAppConfig } from "../lib/config.server";
import type { PaginatedProjectList, PaginatedSessionList } from "@qltysh/arc-api-client";
import type { PaginatedSessionList } from "@qltysh/arc-api-client";
import type { Route } from "./+types/start";
export const handle = { hideHeader: true, wide: true };
@ -34,17 +34,19 @@ export function meta({}: Route.MetaArgs) {
export async function loader({ request }: Route.LoaderArgs) {
const { feature_flags } = getAppConfig();
const [{ data: apiProjects }, { data: apiSessions }] = await Promise.all([
apiJson<PaginatedProjectList>("/projects", { request }),
apiJson<PaginatedSessionList>("/sessions", { request }),
]);
const projects = apiProjects.map((p) => ({ id: p.id, name: p.name }));
const { data: apiSessions } = await apiJson<PaginatedSessionList>("/sessions", { request });
const sessionGroups = groupSessionsByDate(
apiSessions.map((s) => ({ id: s.id, title: s.title, created_at: s.created_at }))
);
return { projects, sessionGroups, feature_flags };
return { sessionGroups, feature_flags };
}
const projects = [
{ id: "arc-web", name: "arc-web" },
{ id: "arc-workflows", name: "arc-workflows" },
{ id: "arc-cli", name: "arc-cli" },
];
const branches = [
{ id: "main", name: "main" },
{ id: "develop", name: "develop" },
@ -97,7 +99,7 @@ function SessionSidebar({ groups }: { groups: { label: string; sessions: { id: s
}
export default function Start({ loaderData }: Route.ComponentProps) {
const { projects, sessionGroups, feature_flags } = loaderData;
const { sessionGroups, feature_flags } = loaderData;
const [prompt, setPrompt] = useState("");
const [project, setProject] = useState(projects[0]);
const [branch, setBranch] = useState(branches[0]);

View file

@ -539,25 +539,6 @@ pub async fn get_server_configuration(
(StatusCode::OK, Json(settings::server_config())).into_response()
}
// ── Projects ───────────────────────────────────────────────────────────
pub async fn list_projects(
_auth: AuthenticatedService,
State(_state): State<Arc<AppState>>,
Query(pagination): Query<PaginationParams>,
) -> Response {
paginated_response(projects::list_items(), &pagination)
}
pub async fn list_branches(
_auth: AuthenticatedService,
State(_state): State<Arc<AppState>>,
Path(_id): Path<String>,
Query(pagination): Query<PaginationParams>,
) -> Response {
paginated_response(projects::branches(), &pagination)
}
// ── Usage ──────────────────────────────────────────────────────────────
pub async fn get_aggregate_usage(
@ -2696,40 +2677,3 @@ mod settings {
}
}
mod projects {
use arc_types::*;
pub fn list_items() -> Vec<Project> {
vec![
Project {
id: "arc-web".into(),
name: "arc-web".into(),
},
Project {
id: "arc-workflows".into(),
name: "arc-workflows".into(),
},
Project {
id: "arc-cli".into(),
name: "arc-cli".into(),
},
]
}
pub fn branches() -> Vec<Branch> {
vec![
Branch {
id: "main".into(),
name: "main".into(),
},
Branch {
id: "develop".into(),
name: "develop".into(),
},
Branch {
id: "feature/start-page".into(),
name: "feature/start-page".into(),
},
]
}
}

View file

@ -240,8 +240,6 @@ fn demo_routes() -> Router<Arc<AppState>> {
.route("/models", get(crate::demo::list_models))
.route("/models/{id}/test", post(test_model))
.route("/settings", get(crate::demo::get_server_configuration))
.route("/projects", get(crate::demo::list_projects))
.route("/projects/{id}/branches", get(crate::demo::list_branches))
.route("/usage", get(crate::demo::get_aggregate_usage))
}
@ -293,8 +291,6 @@ fn real_routes() -> Router<Arc<AppState>> {
.route("/models", get(crate::demo::list_models))
.route("/models/{id}/test", post(test_model))
.route("/settings", get(not_implemented))
.route("/projects", get(not_implemented))
.route("/projects/{id}/branches", get(not_implemented))
.route("/usage", get(get_aggregate_usage))
}

View file

@ -80,14 +80,6 @@ const ENDPOINTS: &[PaginatedEndpoint] = &[
path: "/sessions",
name: "listSessions",
},
PaginatedEndpoint {
path: "/projects",
name: "listProjects",
},
PaginatedEndpoint {
path: "/projects/arc-web/branches",
name: "listBranches",
},
PaginatedEndpoint {
path: "/insights/queries",
name: "listSavedQueries",

View file

@ -27,8 +27,6 @@ tags:
description: Interactive chat sessions
- name: Retros
description: Run retrospectives
- name: Projects
description: Project and branch management
- name: Models
description: Available LLM models
- name: Settings
@ -1137,49 +1135,6 @@ paths:
schema:
$ref: "#/components/schemas/ServerConfiguration"
# ── Projects ──────────────────────────────────────────────────────────
/projects:
get:
operationId: listProjects
tags: [Projects]
summary: List Projects
description: Returns a paginated list of registered projects (repositories).
parameters:
- $ref: "#/components/parameters/PageLimit"
- $ref: "#/components/parameters/PageOffset"
responses:
"200":
description: Paginated list of projects
content:
application/json:
schema:
$ref: "#/components/schemas/PaginatedProjectList"
/projects/{id}/branches:
get:
operationId: listBranches
tags: [Projects]
summary: List Branches
description: Returns a paginated list of branches for a specific project.
parameters:
- $ref: "#/components/parameters/ProjectId"
- $ref: "#/components/parameters/PageLimit"
- $ref: "#/components/parameters/PageOffset"
responses:
"200":
description: Paginated list of branches
content:
application/json:
schema:
$ref: "#/components/schemas/PaginatedBranchList"
"404":
description: Project not found
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
components:
securitySchemes:
BearerAuth:
@ -1274,15 +1229,6 @@ components:
type: string
example: "1"
ProjectId:
name: id
in: path
required: true
description: Unique identifier of a project (repository).
schema:
type: string
example: arc-web
CheckpointFilter:
name: checkpoint
in: query
@ -1403,34 +1349,6 @@ components:
meta:
$ref: "#/components/schemas/PaginationMeta"
PaginatedProjectList:
description: Paginated list of projects.
type: object
required:
- data
- meta
properties:
data:
type: array
items:
$ref: "#/components/schemas/Project"
meta:
$ref: "#/components/schemas/PaginationMeta"
PaginatedBranchList:
description: Paginated list of branches.
type: object
required:
- data
- meta
properties:
data:
type: array
items:
$ref: "#/components/schemas/Branch"
meta:
$ref: "#/components/schemas/PaginationMeta"
PaginatedModelList:
description: Paginated list of models.
type: object
@ -4004,40 +3922,6 @@ components:
type: boolean
description: Enable session sandboxes.
# ── Project Schemas ──────────────────────────────────────────────────
Project:
description: A registered project (repository).
type: object
required:
- id
- name
properties:
id:
type: string
description: Unique project identifier.
example: arc-web
name:
type: string
description: Human-readable project name.
example: arc-web
Branch:
description: A branch within a project.
type: object
required:
- id
- name
properties:
id:
type: string
description: Branch identifier.
example: main
name:
type: string
description: Branch name.
example: main
# ── Discovery Schemas ────────────────────────────────────────────────
RootResponseUrls:

View file

@ -1,9 +1,9 @@
api.ts
api/completions-api.ts
api/discovery-api.ts
api/human-in-the-loop-api.ts
api/insights-api.ts
api/models-api.ts
api/projects-api.ts
api/retros-api.ts
api/run-internals-api.ts
api/run-outputs-api.ts
@ -26,13 +26,15 @@ models/assistant-stage-turn.ts
models/assistant-turn.ts
models/auth-configuration.ts
models/board-column.ts
models/branch.ts
models/check-run-status.ts
models/check-run.ts
models/code-location.ts
models/completion-response.ts
models/completion-usage.ts
models/control-detail.ts
models/control-info.ts
models/control-performance.ts
models/create-completion-request.ts
models/create-session-request.ts
models/create-session-response.ts
models/criterion-reference.ts
@ -69,10 +71,8 @@ models/model.ts
models/open-item-kind.ts
models/open-item.ts
models/paginated-api-question-list.ts
models/paginated-branch-list.ts
models/paginated-history-entry-list.ts
models/paginated-model-list.ts
models/paginated-project-list.ts
models/paginated-retro-list.ts
models/paginated-run-list.ts
models/paginated-run-stage-list.ts
@ -86,7 +86,6 @@ models/paginated-workflow-list.ts
models/pagination-meta.ts
models/preview-url-request.ts
models/preview-url-response.ts
models/project.ts
models/question-type.ts
models/recent-control-result.ts
models/repository-reference.ts

View file

@ -14,11 +14,11 @@
export * from './api/completions-api';
export * from './api/discovery-api';
export * from './api/human-in-the-loop-api';
export * from './api/insights-api';
export * from './api/models-api';
export * from './api/projects-api';
export * from './api/retros-api';
export * from './api/run-internals-api';
export * from './api/run-outputs-api';

View file

@ -1,235 +0,0 @@
/* tslint:disable */
/* eslint-disable */
/**
* Arc Run API
* HTTP API for managing Arc workflow run executions.
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import type { Configuration } from '../configuration';
import type { AxiosPromise, AxiosInstance, RawAxiosRequestConfig } from 'axios';
import globalAxios from 'axios';
// Some imports not used depending on template conditions
// @ts-ignore
import { DUMMY_BASE_URL, assertParamExists, setApiKeyToObject, setBasicAuthToObject, setBearerAuthToObject, setOAuthToObject, setSearchParams, serializeDataIfNeeded, toPathString, createRequestFunction, replaceWithSerializableTypeIfNeeded } from '../common';
// @ts-ignore
import { BASE_PATH, COLLECTION_FORMATS, type RequestArgs, BaseAPI, RequiredError, operationServerMap } from '../base';
// @ts-ignore
import type { ErrorResponse } from '../models';
// @ts-ignore
import type { PaginatedBranchList } from '../models';
// @ts-ignore
import type { PaginatedProjectList } from '../models';
/**
* ProjectsApi - axios parameter creator
*/
export const ProjectsApiAxiosParamCreator = function (configuration?: Configuration) {
return {
/**
* Returns a paginated list of branches for a specific project.
* @summary List Branches
* @param {string} id Unique identifier of a project (repository).
* @param {number} [pageLimit] Maximum number of items to return per page.
* @param {number} [pageOffset] Number of items to skip before returning results.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
listBranches: async (id: string, pageLimit?: number, pageOffset?: number, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'id' is not null or undefined
assertParamExists('listBranches', 'id', id)
const localVarPath = `/projects/{id}/branches`
.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)
if (pageLimit !== undefined) {
localVarQueryParameter['page[limit]'] = pageLimit;
}
if (pageOffset !== undefined) {
localVarQueryParameter['page[offset]'] = pageOffset;
}
localVarHeaderParameter['Accept'] = 'application/json';
setSearchParams(localVarUrlObj, localVarQueryParameter);
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
return {
url: toPathString(localVarUrlObj),
options: localVarRequestOptions,
};
},
/**
* Returns a paginated list of registered projects (repositories).
* @summary List Projects
* @param {number} [pageLimit] Maximum number of items to return per page.
* @param {number} [pageOffset] Number of items to skip before returning results.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
listProjects: async (pageLimit?: number, pageOffset?: number, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
const localVarPath = `/projects`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions;
if (configuration) {
baseOptions = configuration.baseOptions;
}
const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options};
const localVarHeaderParameter = {} as any;
const localVarQueryParameter = {} as any;
// authentication mTLS required
await setApiKeyToObject(localVarHeaderParameter, "X-mTLS-Client-CN", configuration)
// authentication BearerAuth required
// http bearer authentication required
await setBearerAuthToObject(localVarHeaderParameter, configuration)
if (pageLimit !== undefined) {
localVarQueryParameter['page[limit]'] = pageLimit;
}
if (pageOffset !== undefined) {
localVarQueryParameter['page[offset]'] = pageOffset;
}
localVarHeaderParameter['Accept'] = 'application/json';
setSearchParams(localVarUrlObj, localVarQueryParameter);
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
return {
url: toPathString(localVarUrlObj),
options: localVarRequestOptions,
};
},
}
};
/**
* ProjectsApi - functional programming interface
*/
export const ProjectsApiFp = function(configuration?: Configuration) {
const localVarAxiosParamCreator = ProjectsApiAxiosParamCreator(configuration)
return {
/**
* Returns a paginated list of branches for a specific project.
* @summary List Branches
* @param {string} id Unique identifier of a project (repository).
* @param {number} [pageLimit] Maximum number of items to return per page.
* @param {number} [pageOffset] Number of items to skip before returning results.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async listBranches(id: string, pageLimit?: number, pageOffset?: number, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<PaginatedBranchList>> {
const localVarAxiosArgs = await localVarAxiosParamCreator.listBranches(id, pageLimit, pageOffset, options);
const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
const localVarOperationServerBasePath = operationServerMap['ProjectsApi.listBranches']?.[localVarOperationServerIndex]?.url;
return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
},
/**
* Returns a paginated list of registered projects (repositories).
* @summary List Projects
* @param {number} [pageLimit] Maximum number of items to return per page.
* @param {number} [pageOffset] Number of items to skip before returning results.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async listProjects(pageLimit?: number, pageOffset?: number, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<PaginatedProjectList>> {
const localVarAxiosArgs = await localVarAxiosParamCreator.listProjects(pageLimit, pageOffset, options);
const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
const localVarOperationServerBasePath = operationServerMap['ProjectsApi.listProjects']?.[localVarOperationServerIndex]?.url;
return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
},
}
};
/**
* ProjectsApi - factory interface
*/
export const ProjectsApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) {
const localVarFp = ProjectsApiFp(configuration)
return {
/**
* Returns a paginated list of branches for a specific project.
* @summary List Branches
* @param {string} id Unique identifier of a project (repository).
* @param {number} [pageLimit] Maximum number of items to return per page.
* @param {number} [pageOffset] Number of items to skip before returning results.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
listBranches(id: string, pageLimit?: number, pageOffset?: number, options?: RawAxiosRequestConfig): AxiosPromise<PaginatedBranchList> {
return localVarFp.listBranches(id, pageLimit, pageOffset, options).then((request) => request(axios, basePath));
},
/**
* Returns a paginated list of registered projects (repositories).
* @summary List Projects
* @param {number} [pageLimit] Maximum number of items to return per page.
* @param {number} [pageOffset] Number of items to skip before returning results.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
listProjects(pageLimit?: number, pageOffset?: number, options?: RawAxiosRequestConfig): AxiosPromise<PaginatedProjectList> {
return localVarFp.listProjects(pageLimit, pageOffset, options).then((request) => request(axios, basePath));
},
};
};
/**
* ProjectsApi - object-oriented interface
*/
export class ProjectsApi extends BaseAPI {
/**
* Returns a paginated list of branches for a specific project.
* @summary List Branches
* @param {string} id Unique identifier of a project (repository).
* @param {number} [pageLimit] Maximum number of items to return per page.
* @param {number} [pageOffset] Number of items to skip before returning results.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
public listBranches(id: string, pageLimit?: number, pageOffset?: number, options?: RawAxiosRequestConfig) {
return ProjectsApiFp(this.configuration).listBranches(id, pageLimit, pageOffset, options).then((request) => request(this.axios, this.basePath));
}
/**
* Returns a paginated list of registered projects (repositories).
* @summary List Projects
* @param {number} [pageLimit] Maximum number of items to return per page.
* @param {number} [pageOffset] Number of items to skip before returning results.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
public listProjects(pageLimit?: number, pageOffset?: number, options?: RawAxiosRequestConfig) {
return ProjectsApiFp(this.configuration).listProjects(pageLimit, pageOffset, options).then((request) => request(this.axios, this.basePath));
}
}

View file

@ -1,30 +0,0 @@
/* tslint:disable */
/* eslint-disable */
/**
* Arc Run API
* HTTP API for managing Arc 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.
*/
/**
* A branch within a project.
*/
export interface Branch {
/**
* Branch identifier.
*/
'id': string;
/**
* Branch name.
*/
'name': string;
}

View file

@ -7,13 +7,15 @@ export * from './assistant-stage-turn';
export * from './assistant-turn';
export * from './auth-configuration';
export * from './board-column';
export * from './branch';
export * from './check-run';
export * from './check-run-status';
export * from './code-location';
export * from './completion-response';
export * from './completion-usage';
export * from './control-detail';
export * from './control-info';
export * from './control-performance';
export * from './create-completion-request';
export * from './create-session-request';
export * from './create-session-response';
export * from './criterion-reference';
@ -49,10 +51,8 @@ export * from './model-test-result';
export * from './open-item';
export * from './open-item-kind';
export * from './paginated-api-question-list';
export * from './paginated-branch-list';
export * from './paginated-history-entry-list';
export * from './paginated-model-list';
export * from './paginated-project-list';
export * from './paginated-retro-list';
export * from './paginated-run-list';
export * from './paginated-run-stage-list';
@ -66,7 +66,6 @@ export * from './paginated-workflow-list';
export * from './pagination-meta';
export * from './preview-url-request';
export * from './preview-url-response';
export * from './project';
export * from './question-type';
export * from './recent-control-result';
export * from './repository-reference';

View file

@ -1,30 +0,0 @@
/* tslint:disable */
/* eslint-disable */
/**
* Arc Run API
* HTTP API for managing Arc 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 { Branch } from './branch';
// May contain unused imports in some cases
// @ts-ignore
import type { PaginationMeta } from './pagination-meta';
/**
* Paginated list of branches.
*/
export interface PaginatedBranchList {
'data': Array<Branch>;
'meta': PaginationMeta;
}

View file

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

View file

@ -1,30 +0,0 @@
/* tslint:disable */
/* eslint-disable */
/**
* Arc Run API
* HTTP API for managing Arc 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.
*/
/**
* A registered project (repository).
*/
export interface Project {
/**
* Unique project identifier.
*/
'id': string;
/**
* Human-readable project name.
*/
'name': string;
}