Files
legal-ai/web-ui/src/lib/api/settings.ts
Chaim e90faa9ba4
All checks were successful
Build & Deploy / build-and-deploy (push) Successful in 1m35s
feat(settings): add Blocks tab — 12-block decision schema reference
Read-only display of BLOCK_CONFIG from block_writer.py with CREAC role
and JWM functional-purpose annotations per block (sourced from
docs/block-schema.md).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 07:58:04 +00:00

196 lines
4.8 KiB
TypeScript

/**
* Settings hooks: tag → Paperclip company mappings.
*/
import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
import { apiRequest } from "./client";
export type PaperclipCompany = {
id: string;
name: string;
prefix: string;
};
export type TagMapping = {
id: string;
tag: string;
tag_label: string;
company_id: string;
company_name: string;
created_at: string;
};
export function usePaperclipCompanies() {
return useQuery({
queryKey: ["settings", "paperclip-companies"] as const,
queryFn: ({ signal }) =>
apiRequest<PaperclipCompany[]>("/api/settings/paperclip-companies", { signal }),
staleTime: 60_000,
});
}
export function useTagMappings() {
return useQuery({
queryKey: ["settings", "tag-mappings"] as const,
queryFn: ({ signal }) =>
apiRequest<TagMapping[]>("/api/settings/tag-mappings", { signal }),
staleTime: 10_000,
});
}
export function useAddTagMapping() {
const qc = useQueryClient();
return useMutation({
mutationFn: (body: { tag: string; tag_label: string; company_id: string; company_name: string }) =>
apiRequest<TagMapping>("/api/settings/tag-mappings", { method: "POST", body }),
onSuccess: () => qc.invalidateQueries({ queryKey: ["settings", "tag-mappings"] }),
});
}
export function useDeleteTagMapping() {
const qc = useQueryClient();
return useMutation({
mutationFn: (id: string) =>
apiRequest<{ ok: boolean }>(`/api/settings/tag-mappings/${id}`, { method: "DELETE" }),
onSuccess: () => qc.invalidateQueries({ queryKey: ["settings", "tag-mappings"] }),
});
}
// ── MCP Settings ────────────────────────────────────────────────
export type EnvCategory =
| "multimodal"
| "rerank"
| "halacha"
| "credentials"
| "connection"
| "general";
export type EnvType = "bool" | "int" | "float" | "string";
export type McpEnvVar = {
key: string;
category: EnvCategory;
type: EnvType;
description: string;
is_secret: boolean;
is_editable: boolean;
default: unknown;
min: number | null;
max: number | null;
enum_values: string[] | null;
coolify_value: string | null;
container_value: string | null;
drift: boolean;
has_duplicates: boolean;
};
export type McpEnvResponse = {
vars: McpEnvVar[];
coolify_app_uuid: string;
errors: string[];
};
export type McpTool = {
name: string;
description: string;
params_schema: unknown;
module: string;
source_location: string;
};
export type McpRegistration = {
client: string;
server_name: string;
command: string;
args: string[];
cwd: string;
env_keys: string[];
transport: string;
};
export function useMcpEnv() {
return useQuery({
queryKey: ["settings", "mcp-env"] as const,
queryFn: ({ signal }) =>
apiRequest<McpEnvResponse>("/api/settings/mcp/env", { signal }),
staleTime: 5_000,
});
}
export function useUpdateMcpEnv() {
const qc = useQueryClient();
return useMutation({
mutationFn: ({ key, value }: { key: string; value: unknown }) =>
apiRequest<{
ok: boolean;
key: string;
saved_value: string;
requires_redeploy: boolean;
message: string;
}>(`/api/settings/mcp/env/${encodeURIComponent(key)}`, {
method: "PATCH",
body: { value },
}),
onSuccess: () => qc.invalidateQueries({ queryKey: ["settings", "mcp-env"] }),
});
}
export function useMcpRedeploy() {
return useMutation({
mutationFn: () =>
apiRequest<{ ok: boolean; deployment_uuid: string | null; message: string }>(
"/api/settings/mcp/env/redeploy",
{ method: "POST" },
),
});
}
export function useMcpTools() {
return useQuery({
queryKey: ["settings", "mcp-tools"] as const,
queryFn: ({ signal }) =>
apiRequest<{ tools: McpTool[]; count: number }>("/api/settings/mcp/tools", {
signal,
}),
staleTime: 60_000,
});
}
export function useMcpRegistrations() {
return useQuery({
queryKey: ["settings", "mcp-registrations"] as const,
queryFn: ({ signal }) =>
apiRequest<{
registrations: McpRegistration[];
error: string | null;
message?: string;
}>("/api/settings/mcp/registrations", { signal }),
staleTime: 60_000,
});
}
export type McpBlock = {
id: string;
index: number;
title: string;
gen_type: string;
model: string;
temperature: number | null;
max_tokens: number | null;
creac_role: string | null;
jwm_purpose: string | null;
};
export function useMcpBlocks() {
return useQuery({
queryKey: ["settings", "mcp-blocks"] as const,
queryFn: ({ signal }) =>
apiRequest<{ blocks: McpBlock[]; count: number }>(
"/api/settings/mcp/blocks",
{ signal },
),
staleTime: 5 * 60_000, // 5 minutes — static reference data
});
}