feat: add ops center and node onboarding flow

This commit is contained in:
Your Name
2026-04-18 23:52:51 +08:00
parent 246838ae4c
commit b9c29481b5
142 changed files with 89727 additions and 186 deletions

View File

@@ -21,6 +21,107 @@ export const runtimeApi = {
action: (action: string) => http.post(`/runtime/actions/${action}`)
};
export const opsApi = {
overview: () => http.get("/ops/overview"),
goLiveSummary: (params?: Record<string, unknown>) => http.get("/ops/go-live-summary", { params }),
doctorDecision: (params?: Record<string, unknown>) => http.get("/ops/doctor-decision", { params }),
goLiveSignoff: (params?: Record<string, unknown>) => http.get("/ops/go-live-signoff", { params }),
goLiveBundle: (params?: Record<string, unknown>) => http.get("/ops/go-live-bundle", { params }),
goLiveReview: (params?: Record<string, unknown>) => http.get("/ops/go-live-review", { params }),
stackDiagnosis: (params?: Record<string, unknown>) => http.get("/ops/stack-diagnosis", { params }),
linkSnapshot: () => http.get("/ops/link-snapshot"),
inspectionOverview: (params?: Record<string, unknown>) => http.get("/ops/inspection-overview", { params }),
activityStream: (params?: Record<string, unknown>) => http.get("/ops/activity-stream", { params }),
driverFeed: () => http.get("/ops/driver-feed"),
codexBrief: () => http.get("/ops/codex-brief"),
capabilities: () => http.get("/ops/capabilities"),
contracts: () => http.get("/ops/contracts"),
contractDetail: (contractKey: string) => http.get(`/ops/contracts/${encodeURIComponent(contractKey)}`),
actionTemplates: () => http.get("/ops/action-templates"),
playbooks: () => http.get("/ops/playbooks"),
playbookRuns: (params?: Record<string, unknown>) => http.get("/ops/playbook-runs", { params }),
playbookRunDetail: (runCode: string) => http.get(`/ops/playbook-runs/${encodeURIComponent(runCode)}`),
playbookRunEvents: (runCode: string, params?: Record<string, unknown>) =>
http.get(`/ops/playbook-runs/${encodeURIComponent(runCode)}/events`, { params }),
rerunPlaybookRun: (runCode: string, payload?: Record<string, unknown>) =>
http.post(`/ops/playbook-runs/${encodeURIComponent(runCode)}/rerun`, payload || {}),
cancelPlaybookRun: (runCode: string, payload?: Record<string, unknown>) =>
http.post(`/ops/playbook-runs/${encodeURIComponent(runCode)}/cancel`, payload || {}),
previewPlaybook: (payload: Record<string, unknown>) => http.post("/ops/playbooks/preview", payload),
executePlaybook: (payload: Record<string, unknown>) => http.post("/ops/playbooks/execute", payload),
blueprint: () => http.get("/ops/blueprint"),
runbook: () => http.get("/ops/runbook"),
resolveRunbookSequence: (sequenceKey: string, payload?: Record<string, unknown>) =>
http.post(`/ops/runbook/sequences/${encodeURIComponent(sequenceKey)}/resolve`, payload || {}),
executeRunbookSequence: (sequenceKey: string, payload?: Record<string, unknown>) =>
http.post(`/ops/runbook/sequences/${encodeURIComponent(sequenceKey)}/execute`, payload || {}),
nodes: () => http.get("/ops/nodes"),
nodeHandover: (nodeCode: string, params?: Record<string, unknown>) =>
http.get(`/ops/nodes/${encodeURIComponent(nodeCode)}/handover`, { params }),
nodeOnboarding: (nodeCode: string, params?: Record<string, unknown>) =>
http.get(`/ops/nodes/${encodeURIComponent(nodeCode)}/onboarding`, { params }),
previewNodeOnboardingRecovery: (nodeCode: string, payload?: Record<string, unknown>) =>
http.post(`/ops/nodes/${encodeURIComponent(nodeCode)}/onboarding/recovery/preview`, payload || {}),
executeNodeOnboardingRecovery: (nodeCode: string, payload?: Record<string, unknown>) =>
http.post(`/ops/nodes/${encodeURIComponent(nodeCode)}/onboarding/recovery/execute`, payload || {}),
nodeSceneLog: (nodeCode: string, params?: Record<string, unknown>) =>
http.get(`/ops/nodes/${encodeURIComponent(nodeCode)}/scene-log`, { params }),
buildNodeHandoverBootstrapPlan: (nodeCode: string, payload?: Record<string, unknown>) =>
http.post(`/ops/nodes/${encodeURIComponent(nodeCode)}/handover/bootstrap-plan`, payload || {}),
deliveryQueue: (nodeCode: string) => http.get(`/ops/nodes/${encodeURIComponent(nodeCode)}/delivery-queue`),
deliveryQueueRecords: (nodeCode: string, params?: Record<string, unknown>) =>
http.get(`/ops/nodes/${encodeURIComponent(nodeCode)}/delivery-queue/records`, { params }),
flushDeliveryQueue: (nodeCode: string, payload?: Record<string, unknown>) =>
http.post(`/ops/nodes/${encodeURIComponent(nodeCode)}/delivery-queue/flush`, payload || {}),
replayDeliveryQueue: (nodeCode: string, payload?: Record<string, unknown>) =>
http.post(`/ops/nodes/${encodeURIComponent(nodeCode)}/delivery-queue/replay`, payload || {}),
replayDeliveryQueueRecord: (nodeCode: string, recordId: string, payload?: Record<string, unknown>) =>
http.post(
`/ops/nodes/${encodeURIComponent(nodeCode)}/delivery-queue/records/${encodeURIComponent(recordId)}/replay`,
payload || {}
),
discardDeliveryQueueRecord: (nodeCode: string, recordId: string, payload?: Record<string, unknown>) =>
http.post(
`/ops/nodes/${encodeURIComponent(nodeCode)}/delivery-queue/records/${encodeURIComponent(recordId)}/discard`,
payload || {}
),
upsertNode: (payload: Record<string, unknown>) => http.post("/ops/nodes", payload),
syncNodesFromCluster: (dryRun = false) => http.post(`/ops/nodes/sync-from-cluster?dry_run=${dryRun ? "true" : "false"}`),
previewPolicy: (payload: Record<string, unknown>) => http.post("/ops/policy/preview", payload),
jobs: (params?: Record<string, unknown>) => http.get("/ops/jobs", { params }),
jobDetail: (jobId: number) => http.get(`/ops/jobs/${jobId}`),
jobEvents: (jobId: number, params?: Record<string, unknown>) => http.get(`/ops/jobs/${jobId}/events`, { params }),
previewDriverAction: (payload: Record<string, unknown>) => http.post("/ops/driver-actions/preview", payload),
resolveDriverAction: (payload: Record<string, unknown>) => http.post("/ops/driver-actions/resolve", payload),
executeDriverAction: (payload: Record<string, unknown>) => http.post("/ops/driver-actions/execute", payload),
executeResolvedDriverAction: (payload: Record<string, unknown>) => http.post("/ops/driver-actions/execute-resolved", payload),
resolveCodexAction: (payload: Record<string, unknown>) => http.post("/ops/codex-actions/resolve", payload),
executeCodexAction: (payload: Record<string, unknown>) => http.post("/ops/codex-actions/execute", payload),
createJobBatch: (payload: Record<string, unknown>) => http.post("/ops/jobs/batch", payload),
approveJob: (jobId: number, payload?: Record<string, unknown>) => http.post(`/ops/jobs/${jobId}/approve`, payload || {}),
cancelJob: (jobId: number, payload?: Record<string, unknown>) => http.post(`/ops/jobs/${jobId}/cancel`, payload || {}),
dispatchJob: (jobId: number) => http.post(`/ops/jobs/${jobId}/dispatch`),
issueAgentToken: (payload: Record<string, unknown>) => http.post("/ops/agent/tokens", payload),
buildAgentBootstrapPlan: (payload: Record<string, unknown>) => http.post("/ops/agent/bootstrap-plan", payload),
releases: (params?: Record<string, unknown>) => http.get("/ops/releases", { params }),
latestRelease: (channel = "stable") => http.get("/ops/releases/latest", { params: { channel } }),
latestReleasePackageMetadata: () => http.get("/ops/releases/package-metadata/latest"),
releaseLaunchpad: (channel = "stable") => http.get("/ops/releases/launchpad", { params: { channel } }),
releaseDetail: (releaseId: number) => http.get(`/ops/releases/${releaseId}`),
createRelease: (payload: Record<string, unknown>) => http.post("/ops/releases", payload),
createReleaseFromLatestPackage: (payload?: Record<string, unknown>) => http.post("/ops/releases/from-package/latest", payload || {}),
createReleaseFromLatestPackageAndSmartRollout: (payload?: Record<string, unknown>) =>
http.post("/ops/releases/from-package/latest/smart-rollout", payload || {}),
createSmartRolloutForRelease: (releaseId: number, payload?: Record<string, unknown>) =>
http.post(`/ops/releases/${releaseId}/smart-rollout`, payload || {}),
activateRelease: (releaseId: number) => http.post(`/ops/releases/${releaseId}/activate`),
releaseRollouts: (releaseId: number, params?: Record<string, unknown>) => http.get(`/ops/releases/${releaseId}/rollouts`, { params }),
createRollout: (releaseId: number, payload: Record<string, unknown>) => http.post(`/ops/releases/${releaseId}/rollouts`, payload),
rolloutDetail: (rolloutId: number) => http.get(`/ops/rollouts/${rolloutId}`),
rolloutJobs: (rolloutId: number, params?: Record<string, unknown>) => http.get(`/ops/rollouts/${rolloutId}/jobs`, { params }),
advanceRollout: (rolloutId: number, payload?: Record<string, unknown>) => http.post(`/ops/rollouts/${rolloutId}/advance`, payload || {})
};
export const settingsApi = {
getSettings: () => http.get("/settings"),
updateSettings: (payload: Record<string, unknown>) => http.put("/settings", payload),