feat(feedback): 新增用户反馈提交、分页列表与语音描述

支持 Bug/需求提交、截图与聊天同款语音输入,全站反馈分页浏览与详情页,并从聊天与空间页提供入口。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
john
2026-06-29 20:49:15 +08:00
parent 08c5b22d4a
commit 18ea4f82fd
19 changed files with 2846 additions and 150 deletions
+75 -4
View File
@@ -107,20 +107,41 @@ export type SessionEvent =
| { type: 'Ping' }
| { type: 'ActiveRequests'; request_ids: string[] };
export type Session = {
export type SessionSummary = {
id: string;
name: string;
working_dir: string;
message_count: number;
created_at?: string;
updated_at?: string;
user_set_name?: boolean;
recipe?: { title?: string | null } | null;
};
export type Session = SessionSummary & {
working_dir: string;
conversation?: Message[] | null;
conversation_page?: SessionConversationPage;
};
export type SessionListPage = {
total?: number;
offset?: number;
limit?: number;
has_more?: boolean;
query?: string;
};
export type SessionConversationPage = {
total?: number;
before?: number;
limit?: number;
returned?: number;
has_more_before?: boolean;
};
export type SessionListResponse = {
sessions: Session[];
sessions: SessionSummary[];
page?: SessionListPage;
};
export type HarnessBootstrapResponse = {
@@ -129,6 +150,14 @@ export type HarnessBootstrapResponse = {
refreshed: boolean;
};
export type UserMemorySyncResponse = {
ok: true;
analyzed: number;
memories: number;
totalMemories: number;
syncedToSession: boolean;
};
export type ChatState = 'idle' | 'loading' | 'connecting' | 'streaming' | 'waiting' | 'error';
export type ToolConfirmation = {
@@ -232,6 +261,47 @@ export type PortalUser = {
publishSkillName?: string;
};
export type FeedbackSubmissionType = 'bug' | 'feature' | 'other';
export type FeedbackImageInput = {
filename: string;
mimeType: string;
dataBase64: string;
};
export type FeedbackContextInput = {
pageUrl?: string;
pagePath?: string;
userAgent?: string;
viewport?: string;
sessionId?: string;
appVersion?: string;
};
export type FeedbackSubmission = {
id: string;
userId?: string;
type: FeedbackSubmissionType;
title: string;
description?: string;
contact?: string | null;
status: 'pending' | 'reviewing' | 'resolved' | 'closed';
images?: FeedbackImageInput[];
imageCount?: number;
context?: FeedbackContextInput;
submitterDisplayName?: string | null;
createdAt: number;
updatedAt?: number;
};
export type FeedbackBoardPage = {
items: FeedbackSubmission[];
page: number;
pageSize: number;
total: number;
totalPages: number;
};
export type MindSpaceQuota = {
quotaBytes: number;
usedBytes: number;
@@ -629,7 +699,8 @@ export type PolicyDefinition = {
export type AuthStatus = {
authenticated: boolean;
mode?: 'user' | 'legacy' | 'none';
mode?: 'user' | 'legacy' | 'none' | 'unavailable';
message?: string;
user?: PortalUser | null;
capabilities?: CapabilityMap;
grantedSkills?: string[];