Phase F
Some checks failed
CI / Node — lint, typecheck, test, build (push) Failing after 10s
CI / Go — node-agent tests (push) Failing after 8s
CI / Go — edge-gateway build (push) Successful in 18s

This commit is contained in:
smueller
2026-06-26 15:05:01 +02:00
parent 333ad1cc7d
commit 15cf302afc
23 changed files with 2116 additions and 8 deletions

View File

@@ -108,3 +108,163 @@ export type WhmcsCreateSsoRequest = z.infer<typeof whmcsCreateSsoRequestSchema>;
export type WhmcsCreateSsoResponse = z.infer<typeof whmcsCreateSsoResponseSchema>;
export type SsoConsumeRequest = z.infer<typeof ssoConsumeRequestSchema>;
export type SsoConsumeResponse = z.infer<typeof ssoConsumeResponseSchema>;
export const whmcsExpectedStatusSchema = z.enum([
'Pending',
'Active',
'Suspended',
'Terminated',
'Cancelled',
]);
export const whmcsReconcileRequestSchema = z.object({
expectedWhmcsStatus: whmcsExpectedStatusSchema.optional(),
expectedPlanSlug: z.string().max(64).optional(),
expectedRamMb: z.number().int().min(512).max(65536).optional(),
dryRun: z.boolean().default(false),
autoRepair: z.boolean().default(false),
});
export const reconciliationSeveritySchema = z.enum([
'INFO',
'WARNING',
'BLOCKING',
'DESTRUCTIVE',
'SECURITY',
]);
export const reconciliationIssueSchema = z.object({
id: z.string().uuid(),
code: z.string(),
severity: reconciliationSeveritySchema,
message: z.string(),
externalServiceId: z.string().nullable(),
serverId: z.string().uuid().nullable(),
details: z.record(z.unknown()).optional(),
autoRepaired: z.boolean(),
});
export const whmcsReconcileResponseSchema = z.object({
runId: z.string().uuid(),
dryRun: z.boolean(),
issues: z.array(reconciliationIssueSchema),
repaired: z.array(z.string()),
});
export const whmcsListAccountsResponseSchema = z.object({
accounts: z.array(
z.object({
externalServiceId: z.string(),
externalClientId: z.string(),
serverId: z.string().uuid(),
domain: z.string(),
username: z.string().nullable(),
status: z.enum(['Active', 'Suspended', 'Terminated', 'Pending']),
planSlug: z.string(),
ramMb: z.number().int(),
gameCloudStatus: z.string(),
linkStatus: z.enum(['PENDING', 'ACTIVE', 'SUSPENDED', 'TERMINATED']),
lastReconciledAt: z.string().datetime().nullable(),
}),
),
});
export const whmcsImportServiceRequestSchema = z.object({
externalServiceId: z.string().min(1).max(64),
externalClientId: z.string().min(1).max(64),
serverId: z.string().uuid(),
externalProductId: z.string().max(64).optional(),
expectedPlanSlug: z.string().max(64).optional(),
});
export const integrationEventSchema = z.object({
id: z.string().uuid(),
eventType: z.string(),
payload: z.record(z.unknown()),
status: z.enum(['PENDING', 'ACKNOWLEDGED', 'DEAD_LETTER']),
createdAt: z.string().datetime(),
});
export const whmcsEventsResponseSchema = z.object({
events: z.array(integrationEventSchema),
nextCursor: z.string().uuid().nullable(),
});
export const whmcsEventsAckRequestSchema = z.object({
eventIds: z.array(z.string().uuid()).min(1).max(100),
deadLetter: z.boolean().default(false),
deadLetterReason: z.string().max(512).optional(),
});
export const whmcsEventsAckResponseSchema = z.object({
acknowledged: z.number().int(),
});
export const whmcsUsageMetricsSchema = z.object({
runtime_minutes: z.number(),
memory_gib_minutes: z.number(),
cpu_core_minutes: z.number(),
storage_gib_days: z.number(),
backup_storage_gib_days: z.number(),
egress_gib: z.number(),
extra_port_days: z.number(),
priority_queue_minutes: z.number(),
managed_service_units: z.number(),
});
export const whmcsUsageUpdateSchema = z.object({
diskUsageGiB: z.number(),
bandwidthGiB: z.number(),
});
export const whmcsUsageQuerySchema = z.object({
periodStart: z.string().datetime().optional(),
periodEnd: z.string().datetime().optional(),
testMode: z.coerce.boolean().default(false),
});
export const whmcsUsageResponseSchema = z.object({
exportId: z.string().uuid(),
externalServiceId: z.string(),
serverId: z.string().uuid(),
periodStart: z.string().datetime(),
periodEnd: z.string().datetime(),
metrics: whmcsUsageMetricsSchema,
usageUpdate: whmcsUsageUpdateSchema,
contentHash: z.string(),
status: z.enum(['DRAFT', 'EXPORTED', 'ADJUSTED']),
isTestMode: z.boolean(),
adjustments: z.array(
z.object({
metricKey: z.string(),
delta: z.number(),
reason: z.string(),
}),
),
});
export const whmcsUsageAdjustmentRequestSchema = z.object({
periodStart: z.string().datetime(),
periodEnd: z.string().datetime(),
adjustments: z
.array(
z.object({
metricKey: z.string().min(1).max(64),
delta: z.number(),
reason: z.string().min(1).max(256),
}),
)
.min(1)
.max(20),
testMode: z.boolean().default(false),
});
export type WhmcsReconcileRequest = z.infer<typeof whmcsReconcileRequestSchema>;
export type WhmcsReconcileResponse = z.infer<typeof whmcsReconcileResponseSchema>;
export type WhmcsListAccountsResponse = z.infer<typeof whmcsListAccountsResponseSchema>;
export type WhmcsImportServiceRequest = z.infer<typeof whmcsImportServiceRequestSchema>;
export type WhmcsEventsResponse = z.infer<typeof whmcsEventsResponseSchema>;
export type WhmcsEventsAckRequest = z.infer<typeof whmcsEventsAckRequestSchema>;
export type WhmcsEventsAckResponse = z.infer<typeof whmcsEventsAckResponseSchema>;
export type WhmcsUsageResponse = z.infer<typeof whmcsUsageResponseSchema>;
export type WhmcsUsageAdjustmentRequest = z.infer<typeof whmcsUsageAdjustmentRequestSchema>;