feat: add deployable alpha silo

This commit is contained in:
2026-07-11 00:25:45 +08:00
parent 44557da499
commit 9e954790dc
57 changed files with 2792 additions and 400 deletions
@@ -32,7 +32,7 @@ export interface ResolvedFeishuApplication extends Required<FeishuApplicationCre
readonly organizationId: string;
}
interface FeishuSecretPayloadV1 extends Required<FeishuApplicationCredentialInput> {
export interface FeishuSecretPayloadV1 extends Required<FeishuApplicationCredentialInput> {
readonly schemaVersion: 1;
}
@@ -46,8 +46,8 @@ export class FeishuApplicationConnectionService {
async rotateCustomerApplication(
input: RotateFeishuApplicationInput,
): Promise<FeishuApplicationConnectionMetadata & { readonly created: boolean }> {
const payload = validateCredential(input);
const appIdentityFingerprint = fingerprintAppId(payload.appId);
const payload = validateFeishuApplicationCredential(input);
const appIdentityFingerprint = fingerprintFeishuAppId(payload.appId);
await this.prisma.$transaction(async (tx) => {
await requireFeishuAdmin(tx, input);
await assertAppIdentityAvailable(tx, input.organizationId, appIdentityFingerprint);
@@ -287,7 +287,7 @@ export function decryptFeishuCredential(
secretVersionId: input.secretVersionId,
}, envelope);
const validated = validateStoredPayload(payload);
if (fingerprintAppId(validated.appId) !== input.appIdentityFingerprint) {
if (fingerprintFeishuAppId(validated.appId) !== input.appIdentityFingerprint) {
throw new Error("Feishu Application app identity fingerprint mismatch");
}
return validated;
@@ -387,7 +387,7 @@ export async function rewrapStoredFeishuApplicationEnvelopes(
return { verified, rewrapped };
}
function validateCredential(input: FeishuApplicationCredentialInput): FeishuSecretPayloadV1 {
export function validateFeishuApplicationCredential(input: FeishuApplicationCredentialInput): FeishuSecretPayloadV1 {
const appId = nonEmpty(input.appId, "Feishu appId");
const appSecret = nonEmpty(input.appSecret, "Feishu appSecret");
const botOpenId = nonEmpty(input.botOpenId, "Feishu botOpenId");
@@ -474,7 +474,7 @@ function metadata(
};
}
function fingerprintAppId(appId: string): string {
export function fingerprintFeishuAppId(appId: string): string {
return createHash("sha256").update("cph-feishu-app\0").update(appId, "utf8").digest("hex");
}