first commit
This commit is contained in:
@@ -0,0 +1,28 @@
|
||||
import type { AiProviderRequest, AiProviderUpdateRequest } from "../api/types";
|
||||
import type { AiProviderFormState } from "../contracts/aiProviders";
|
||||
|
||||
export function aiProviderCreateRequestFromForm(form: AiProviderFormState): AiProviderRequest {
|
||||
return {
|
||||
id: form.id.trim(),
|
||||
...aiProviderUpdateRequestFromForm(form)
|
||||
};
|
||||
}
|
||||
|
||||
export function aiProviderUpdateRequestFromForm(form: AiProviderFormState): AiProviderUpdateRequest {
|
||||
const models = form.modelsText
|
||||
.split(",")
|
||||
.map((model) => model.trim())
|
||||
.filter(Boolean);
|
||||
|
||||
return {
|
||||
name: form.name.trim(),
|
||||
kind: form.kind,
|
||||
baseUrl: form.baseUrl.trim(),
|
||||
apiKeyRef: form.apiKeyRef.trim(),
|
||||
models,
|
||||
defaultModel: form.defaultModel.trim() || models[0],
|
||||
relayMode: form.relayMode,
|
||||
timeoutMs: Number.parseInt(form.timeoutMs, 10),
|
||||
redactionPolicy: form.redactionPolicy.trim() || "default"
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
export interface WebRuntimeEnv {
|
||||
platformApiBaseUrl: string;
|
||||
enableLocalAuthFallback: boolean;
|
||||
}
|
||||
|
||||
export function readWebRuntimeEnv(): WebRuntimeEnv {
|
||||
return {
|
||||
platformApiBaseUrl: import.meta.env.VITE_PLATFORM_API_BASE_URL ?? "/api/v1",
|
||||
enableLocalAuthFallback: import.meta.env.VITE_ENABLE_LOCAL_AUTH_FALLBACK === "true"
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
# Frontend Structure Rules
|
||||
|
||||
Validation rules for future frontend checks:
|
||||
|
||||
- Page components must not define shared API request/response types.
|
||||
- Route definitions must live under `routes/`.
|
||||
- API clients must live under `api/`.
|
||||
- Plugin bridge contracts must live under `contracts/`.
|
||||
- Validation schemas must live under `schemas/`.
|
||||
- Visual theme tokens, shared surface styles, and background behavior must live under `theme/`, and `theme/README.md` must document the active style contract.
|
||||
- Full-workspace magical ultimate-effect behavior must live in `components/MagicalParticleLayer.tsx` and be mounted from shared shell chrome, not copied into individual pages.
|
||||
- Shared utilities must live under `utils/`.
|
||||
@@ -0,0 +1,24 @@
|
||||
import type { ServerLifecycleCommandRequest, ServerLifecycleCreateRequest, ServerInstanceResponse } from "../api/types";
|
||||
import type { ServerCreateFormState } from "../contracts/serverManagement";
|
||||
|
||||
export function serverCreateRequestFromForm(form: ServerCreateFormState, sequence = Date.now()): ServerLifecycleCreateRequest {
|
||||
const id = form.id.trim();
|
||||
return {
|
||||
id,
|
||||
pluginId: form.pluginId.trim(),
|
||||
runEndpointId: form.runEndpointId.trim(),
|
||||
name: form.name.trim(),
|
||||
idempotencyKey: lifecycleIdempotencyKey("create", id, sequence)
|
||||
};
|
||||
}
|
||||
|
||||
export function serverLifecycleCommandRequest(instance: ServerInstanceResponse, action: "start" | "stop", sequence = Date.now()): ServerLifecycleCommandRequest {
|
||||
return {
|
||||
expectedConfigVersion: instance.configVersion,
|
||||
idempotencyKey: lifecycleIdempotencyKey(action, instance.id, sequence)
|
||||
};
|
||||
}
|
||||
|
||||
export function lifecycleIdempotencyKey(action: "create" | "start" | "stop", serverInstanceId: string, sequence: number): string {
|
||||
return `web:${action}:${serverInstanceId}:${sequence}`;
|
||||
}
|
||||
Reference in New Issue
Block a user