feat: implement ui v1

This commit is contained in:
a.tolmachev
2026-03-25 19:27:31 +03:00
parent 39c88456b4
commit 85ffda67d3
32 changed files with 5084 additions and 62 deletions
+84
View File
@@ -0,0 +1,84 @@
import { getJson, getText, postJson, postText } from "../../shared/api/client";
import type {
AuthProfile,
DraftGenerationResult,
OperationRecord,
OperationSummary,
TestRunResult,
} from "./types";
export function listOperations() {
return getJson<{ items: OperationSummary[] }>("/api/admin/operations");
}
export function getOperation(operationId: string) {
return getJson<OperationSummary>(`/api/admin/operations/${operationId}`);
}
export function getOperationVersion(operationId: string, version: number) {
return getJson<OperationRecord>(
`/api/admin/operations/${operationId}/versions/${version}`,
);
}
export function createOperation(payload: unknown) {
return postJson<{
operation_id: string;
version: number;
status: string;
}>("/api/admin/operations", payload);
}
export function publishOperation(operationId: string, version: number) {
return postJson<{ published_version: number; published_at: string }>(
`/api/admin/operations/${operationId}/publish`,
{ version },
);
}
export function runOperationTest(
operationId: string,
version: number,
input: unknown,
) {
return postJson<TestRunResult>(`/api/admin/operations/${operationId}/test-runs`, {
version,
input,
});
}
export function uploadInputJsonSample(operationId: string, payload: unknown) {
return postJson(`/api/admin/operations/${operationId}/samples/input-json`, payload);
}
export function uploadOutputJsonSample(operationId: string, payload: unknown) {
return postJson(
`/api/admin/operations/${operationId}/samples/output-json`,
payload,
);
}
export function generateDraft(operationId: string) {
return postJson<DraftGenerationResult>(
`/api/admin/operations/${operationId}/drafts/generate`,
{
sources: ["input_json_sample", "output_json_sample"],
},
);
}
export function exportOperationYaml(operationId: string, version?: number) {
const query = version === undefined ? "" : `?version=${version}`;
return getText(`/api/admin/operations/${operationId}/export${query}`);
}
export function importOperationYaml(yamlText: string, mode: "create" | "upsert") {
return postText<{ operation_id: string; version: number; import_mode: string }>(
`/api/admin/operations/import?mode=${mode}`,
yamlText,
);
}
export function listAuthProfiles() {
return getJson<{ items: AuthProfile[] }>("/api/admin/auth-profiles");
}
+85
View File
@@ -0,0 +1,85 @@
export type Protocol = "rest" | "graphql" | "grpc";
export type OperationStatus = "draft" | "testing" | "published" | "archived";
export type OperationSummary = {
id: string;
name: string;
display_name: string;
protocol: Protocol;
status: OperationStatus;
current_draft_version: number;
latest_published_version: number | null;
created_at: string;
updated_at: string;
published_at: string | null;
};
export type OperationRecord = {
operation_id: string;
version: number;
status: OperationStatus;
change_note: string | null;
created_at: string;
created_by: string | null;
snapshot: OperationSnapshot;
};
export type OperationSnapshot = {
id: string;
name: string;
display_name: string;
protocol: Protocol;
status: OperationStatus;
version: number;
target: {
kind: "rest" | "graphql" | "grpc";
base_url?: string;
method?: string;
path_template?: string;
static_headers?: Record<string, string>;
};
input_schema: unknown;
output_schema: unknown;
input_mapping: unknown;
output_mapping: unknown;
execution_config: unknown;
tool_description: {
title: string;
description: string;
tags: string[];
examples: Array<{ input: unknown }>;
};
};
export type DraftGenerationResult = {
generated_draft: {
status: string;
source_types: string[];
generated_at: string | null;
input_schema_generated: boolean;
output_schema_generated: boolean;
input_mapping_generated: boolean;
output_mapping_generated: boolean;
warnings: string[];
};
input_schema: unknown;
output_schema: unknown;
input_mapping: unknown;
output_mapping: unknown;
};
export type TestRunResult = {
ok: boolean;
request_preview: unknown;
response_preview: unknown;
errors: Array<{ code: string; message: string }>;
};
export type AuthProfile = {
id: string;
name: string;
kind: string;
config: unknown;
created_at: string;
updated_at: string;
};