feat(cloud): enforce host governance budgets
Tests / Test passed: 662

This commit is contained in:
2026-07-13 22:56:31 +08:00
parent 2cd314b183
commit b4803f90e6
28 changed files with 1311 additions and 14 deletions
+85
View File
@@ -1,6 +1,8 @@
import type {
CloudUser,
DeviceRecord,
HostGovernancePolicy,
HostTokenUsageSummary,
HostRecord,
PluginRecord,
PluginRegistrationPayload,
@@ -8,6 +10,8 @@ import type {
TaskListResponse,
TaskSubmissionPayload,
TaskStatus,
UserListResponse,
UserSubmissionPolicy,
} from "./types";
const configuredBaseUrl = import.meta.env.VITE_CLOUD_API_BASE_URL as
@@ -119,6 +123,87 @@ export function changePassword(
});
}
export function listUsers(): Promise<UserListResponse> {
return request<UserListResponse>("/v1/users?limit=100&offset=0");
}
export function createUser(payload: {
username: string;
display_name: string;
role: "viewer" | "operator" | "admin";
password: string;
}): Promise<CloudUser> {
return request<CloudUser>("/v1/users", {
method: "POST",
body: JSON.stringify(payload),
});
}
export function updateUser(
userId: string,
payload: { display_name?: string; role?: "viewer" | "operator" | "admin"; enabled?: boolean },
): Promise<CloudUser> {
return request<CloudUser>(`/v1/users/${encodeURIComponent(userId)}`, {
method: "PATCH",
body: JSON.stringify(payload),
});
}
export function resetUserPassword(userId: string, password: string): Promise<CloudUser> {
return request<CloudUser>(`/v1/users/${encodeURIComponent(userId)}/password`, {
method: "POST",
body: JSON.stringify({ password }),
});
}
export function revokeUserSessions(userId: string): Promise<void> {
return request<void>(`/v1/users/${encodeURIComponent(userId)}/sessions`, {
method: "DELETE",
});
}
export function getUserSubmissionPolicy(userId: string): Promise<UserSubmissionPolicy> {
return request<UserSubmissionPolicy>(
`/v1/users/${encodeURIComponent(userId)}/submission-policy`,
);
}
export function updateUserSubmissionPolicy(
userId: string,
payload: Omit<UserSubmissionPolicy, "user_id" | "revision" | "updated_at"> & {
expected_revision?: number;
},
): Promise<UserSubmissionPolicy> {
return request<UserSubmissionPolicy>(
`/v1/users/${encodeURIComponent(userId)}/submission-policy`,
{ method: "PUT", body: JSON.stringify(payload) },
);
}
export function getHostGovernancePolicy(hostId: string): Promise<HostGovernancePolicy> {
return request<HostGovernancePolicy>(
`/v1/hosts/${encodeURIComponent(hostId)}/governance-policy`,
);
}
export function updateHostGovernancePolicy(
hostId: string,
payload: Omit<HostGovernancePolicy, "host_id" | "revision" | "updated_at"> & {
expected_revision?: number;
},
): Promise<HostGovernancePolicy> {
return request<HostGovernancePolicy>(
`/v1/hosts/${encodeURIComponent(hostId)}/governance-policy`,
{ method: "PUT", body: JSON.stringify(payload) },
);
}
export function getHostTokenUsage(hostId: string): Promise<HostTokenUsageSummary> {
return request<HostTokenUsageSummary>(
`/v1/hosts/${encodeURIComponent(hostId)}/token-usage`,
);
}
export function listTasks(options?: {
status?: TaskStatus;
limit?: number;