feat(i8-i9): webhook DEAD replay, read-only delivery status, and callback UI

I8: platform proxies replay to webhook; webhook ops token filter and internal
replay endpoint; delivery service supports read/replay flows.

I9: platform GET callback webhook delivery status by inbox id; UI shows
read-only status block and handles load errors without blocking the page.

Also refresh OpenAPI, Runbook notes, test fixtures and YAML; fix Vite dev
axios baseURL so /api uses proxy; improve login error messaging.

Made-with: Cursor
This commit is contained in:
2026-04-07 21:26:44 +08:00
parent 5e051633ec
commit d53ddf32c8
20 changed files with 874 additions and 6 deletions
@@ -1041,6 +1041,33 @@
}
}
},
"/api/v1/callback-inbox/{id}/replay-webhook-delivery" : {
"post" : {
"tags" : [ "callback-inbox-controller" ],
"operationId" : "replayWebhookDelivery",
"parameters" : [ {
"name" : "id",
"in" : "path",
"required" : true,
"schema" : {
"type" : "integer",
"format" : "int64"
}
} ],
"responses" : {
"200" : {
"description" : "OK",
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/CallbackWebhookReplayResponse"
}
}
}
}
}
}
},
"/api/v1/auth/login" : {
"post" : {
"tags" : [ "auth-controller" ],
@@ -1570,6 +1597,33 @@
}
}
},
"/api/v1/callback-inbox/{id}/webhook-delivery" : {
"get" : {
"tags" : [ "callback-inbox-controller" ],
"operationId" : "getWebhookDelivery",
"parameters" : [ {
"name" : "id",
"in" : "path",
"required" : true,
"schema" : {
"type" : "integer",
"format" : "int64"
}
} ],
"responses" : {
"200" : {
"description" : "OK",
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/CallbackWebhookDeliveryStatusResponse"
}
}
}
}
}
}
},
"/api/v1/audit-events" : {
"get" : {
"tags" : [ "audit-controller" ],
@@ -2096,6 +2150,17 @@
},
"required" : [ "customerId", "projectId" ]
},
"CallbackWebhookReplayResponse" : {
"type" : "object",
"properties" : {
"status" : {
"type" : "string"
},
"receiptId" : {
"type" : "string"
}
}
},
"LicenseSnStatusPatchRequest" : {
"type" : "object",
"properties" : {
@@ -2495,6 +2560,33 @@
}
}
},
"CallbackWebhookDeliveryStatusResponse" : {
"type" : "object",
"properties" : {
"receiptId" : {
"type" : "integer",
"format" : "int64"
},
"status" : {
"type" : "string"
},
"attempts" : {
"type" : "integer",
"format" : "int32"
},
"lastError" : {
"type" : "string"
},
"nextRetryAt" : {
"type" : "string",
"format" : "date-time"
},
"updatedAt" : {
"type" : "string",
"format" : "date-time"
}
}
},
"AuditEventResponse" : {
"type" : "object",
"properties" : {