feat(server): refactor record schema (#14729)

#### PR Dependency Tree


* **PR #14729** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Transcriptions now produce structured meeting summaries (strict JSON)
and a normalized, speaker‑tagged, non‑overlapping transcript with legacy
projection support.

* **API**
* Submission accepts richer transcription input; results return
source‑audio metadata, slice manifest, quality indicators, normalized
segments/transcript, and structured summary JSON.

* **Frontend**
* Recording flow stores transcription metadata and uploads preprocessed
audio slices with slice/quality info; UI-side result normalization
applied.

* **Tests**
* Expanded unit, contract, and e2e coverage for normalization, payload
parsing, persistence/retry, and end‑to‑end transcription flows.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
DarkSky
2026-03-26 21:32:36 +08:00
committed by GitHub
parent a3379c8979
commit 5b05c5a1b2
29 changed files with 2977 additions and 463 deletions
+83 -1
View File
@@ -230,6 +230,24 @@ type AppConfigValidateResult {
value: JSON!
}
input AudioSliceManifestItemInput {
byteSize: Int
durationSec: Float!
fileName: String!
index: Int!
mimeType: String!
startSec: Float!
}
type AudioSliceManifestItemType {
byteSize: Int
durationSec: Float!
fileName: String!
index: Int!
mimeType: String!
startSec: Float!
}
type BlobNotFoundDataType {
blobId: String!
spaceId: String!
@@ -1049,6 +1067,7 @@ enum FeatureType {
FreePlan
LifetimeProPlan
ProPlan
QuotaExceededReadonlyWorkspace
TeamPlan
UnlimitedCopilot
UnlimitedWorkspace
@@ -1406,6 +1425,23 @@ input ManageUserInput {
name: String
}
type MeetingActionItemType {
deadline: String
description: String!
owner: String
}
type MeetingSummaryV2Type {
actionItems: [MeetingActionItemType!]!
attendees: [String!]!
blockers: [String!]!
decisions: [String!]!
durationMinutes: Float!
keyPoints: [String!]!
openQuestions: [String!]!
title: String!
}
type MemberNotFoundInSpaceDataType {
spaceId: String!
}
@@ -1613,7 +1649,7 @@ type Mutation {
sendVerifyChangeEmail(callbackUrl: String!, email: String!, token: String!): Boolean!
sendVerifyEmail(callbackUrl: String!): Boolean!
setBlob(blob: Upload!, workspaceId: String!): String!
submitAudioTranscription(blob: Upload, blobId: String!, blobs: [Upload!], workspaceId: String!): TranscriptionResultType
submitAudioTranscription(blob: Upload, blobId: String!, blobs: [Upload!], input: SubmitAudioTranscriptionInput, workspaceId: String!): TranscriptionResultType
"""Trigger cleanup of trashed doc embeddings"""
triggerCleanupTrashedDocEmbeddings: Boolean!
@@ -1671,6 +1707,15 @@ type NoMoreSeatDataType {
spaceId: String!
}
type NormalizedTranscriptSegmentType {
end: String!
endSec: Float!
speaker: String!
start: String!
startSec: Float!
text: String!
}
type NotInSpaceDataType {
spaceId: String!
}
@@ -2213,6 +2258,12 @@ type StreamObject {
type: String!
}
input SubmitAudioTranscriptionInput {
quality: TranscriptionQualityInput
sliceManifest: [AudioSliceManifestItemInput!]
sourceAudio: TranscriptionSourceAudioInput
}
type SubscriptionAlreadyExistsDataType {
plan: String!
}
@@ -2319,15 +2370,46 @@ type TranscriptionItemType {
transcription: String!
}
input TranscriptionQualityInput {
degraded: Boolean
overflowCount: Int
}
type TranscriptionQualityType {
degraded: Boolean
overflowCount: Int
}
type TranscriptionResultType {
actions: String
id: ID!
normalizedSegments: [NormalizedTranscriptSegmentType!]
normalizedTranscript: String
quality: TranscriptionQualityType
sliceManifest: [AudioSliceManifestItemType!]
sourceAudio: TranscriptionSourceAudioType
status: AiJobStatus!
summary: String
summaryJson: MeetingSummaryV2Type
title: String
transcription: [TranscriptionItemType!]
}
input TranscriptionSourceAudioInput {
channels: Int
durationMs: Int
mimeType: String
sampleRate: Int
}
type TranscriptionSourceAudioType {
blobId: String
channels: Int
durationMs: Int
mimeType: String
sampleRate: Int
}
union UnionNotificationBodyType = InvitationAcceptedNotificationBodyType | InvitationBlockedNotificationBodyType | InvitationNotificationBodyType | InvitationReviewApprovedNotificationBodyType | InvitationReviewDeclinedNotificationBodyType | InvitationReviewRequestNotificationBodyType | MentionNotificationBodyType
type UnknownOauthProviderDataType {