- 左树右 diff:左栏全 PR 文件树 + 统计条(共改 N · +X−Y · 已查看 M/N),右栏选中单文件内联 diff - 用 @git-diff-view/react 只渲染当前选中文件,绕开上万行全量渲染的性能坑 - gitea 新增 listPullRequestFiles、getPullRequest 取 merge_base/head,按需回两版原文 - diff 走 merge_base→head 三点口径(与 Gitea 网页一致),getRawFile 404 兜底成全增/全删/改名 - 已查看态按 head sha 落盘、新 push 自然重置;去掉提交列表、原生 diff 与 spx-gitea 虚拟文档 provider
193 lines
8.0 KiB
TypeScript
193 lines
8.0 KiB
TypeScript
/**
|
|
* Mirror of `src/panel/messages.ts` for the webview side.
|
|
*
|
|
* Kept in sync manually; if the two ever diverge that's a step-3+ concern.
|
|
*/
|
|
|
|
import type { Issue, IssueColumn, ManagedSessionsData } from '../types'
|
|
|
|
export interface ToastLink {
|
|
label: string
|
|
url: string
|
|
}
|
|
|
|
/**
|
|
* PR 改动里的一个文件:status 取 added/modified/deleted/renamed/copied 等,
|
|
* additions/deletions 求和成统计条,previousFilename 在改名时给出旧路径。
|
|
*/
|
|
export interface PrFile {
|
|
path: string
|
|
status: string
|
|
additions: number
|
|
deletions: number
|
|
previousFilename?: string
|
|
}
|
|
|
|
export type ToastLevel = 'info' | 'success' | 'error'
|
|
|
|
/**
|
|
* Mirror of the extension-side LogEntry in src/logging/logger.ts.
|
|
* Kept manually in sync — workspace boundaries prevent direct import.
|
|
*/
|
|
export type LogLevel = 'info' | 'warn' | 'error'
|
|
|
|
export interface LogEntry {
|
|
ts: number
|
|
level: LogLevel
|
|
source: string
|
|
message: string
|
|
details?: string
|
|
}
|
|
|
|
/**
|
|
* Mirror of the extension-side ProfilesData in src/profiles/store.ts.
|
|
* Workspace 级 profile 表:每行一个 key,跨多个 profile 列的字符串值。
|
|
*/
|
|
export interface ProfileRow {
|
|
key: string
|
|
values: Record<string, string>
|
|
}
|
|
|
|
export interface ProfilesData {
|
|
profiles: string[]
|
|
rows: ProfileRow[]
|
|
}
|
|
|
|
export type ExtensionToWebview
|
|
= | { type: 'issues/loading' }
|
|
| { type: 'issues/update', issues: Issue[], globalAutoReview: boolean, youtrackConfigured: boolean }
|
|
| { type: 'issues/error', message: string }
|
|
| { type: 'issue/patch', issueNumber: number, patch: { autoReview?: boolean, specFile?: string, planFile?: string, prDiffFile?: string, sessionId?: string, implementSessionId?: string, reviewSessionId?: string, testSessionId?: string, pr?: string, implementStatus?: 'running' | 'done' | 'failed', column?: IssueColumn, worktreePath?: string, prMerged?: boolean, prMergedAt?: string, branch?: string, color?: string, worktreeExists?: boolean, brainstormTabOpen?: boolean, implementTabOpen?: boolean, reviewTabOpen?: boolean, testTabOpen?: boolean, profilePath?: string, testProfilePath?: string } }
|
|
| { type: 'issue/pr-diff-summary-done', issueNumber: number }
|
|
| { type: 'issue/append', issue: Issue, select?: boolean }
|
|
| { type: 'issue/select-by-number', issueNumber: number }
|
|
| {
|
|
type: 'settings/show'
|
|
host: string
|
|
errorMessage?: string
|
|
canCancel?: boolean
|
|
tokenSaved: boolean
|
|
webhookPort: number
|
|
brainstormPrompt: string
|
|
implementPlanPrompt: string
|
|
autoReview: boolean
|
|
reviewPrompt: string
|
|
devBranch: string
|
|
autoBuildBranch: string
|
|
worktreeDirectory: string
|
|
worktreeOpenWith: 'vscode' | 'pycharm'
|
|
pycharmCommand: string
|
|
worktreePostCreateScript: string
|
|
worktreePreRemoveScript: string
|
|
implTabPreCreateScript: string
|
|
implTabPostCloseScript: string
|
|
youtrackBaseUrl?: string
|
|
youtrackProjectShortName?: string
|
|
youtrackCloseCommand?: string
|
|
youtrackTokenSaved?: boolean
|
|
}
|
|
| { type: 'youtrack/projects', projects: Array<{ id: string, name: string, shortName: string }>, error?: string }
|
|
| {
|
|
type: 'toast/show'
|
|
id: string
|
|
level: ToastLevel
|
|
message: string
|
|
spinner?: boolean
|
|
link?: ToastLink
|
|
dismissOnTimer?: number
|
|
}
|
|
| { type: 'toast/dismiss', id: string }
|
|
| { type: 'profiles/update', profiles: Array<{ name: string, path: string }> }
|
|
| { type: 'logs/snapshot', entries: LogEntry[] }
|
|
| { type: 'logs/append', entry: LogEntry }
|
|
| { type: 'logs/cleared' }
|
|
| { type: 'commit/state', running: boolean }
|
|
| { type: 'commit/has-changes', value: boolean }
|
|
| {
|
|
type: 'branch-sync/status'
|
|
behind: number
|
|
devBranch: string
|
|
autoBuildBranch: string
|
|
unavailable?: boolean
|
|
reason?: string
|
|
}
|
|
| { type: 'env-lock/status', locked: boolean, fileCount: number, failedCount?: number }
|
|
| { type: 'issue/remove', issueNumber: number }
|
|
| { type: 'profiles/show', data: ProfilesData }
|
|
| { type: 'managed-sessions/show', data: ManagedSessionsData }
|
|
| { type: 'pr-files/show', issueNumber: number, headSha: string, mergeBase: string, files: PrFile[], confirmed: string[], error?: string }
|
|
| { type: 'pr-file-diff/show', issueNumber: number, path: string, oldContent: string, newContent: string, oldLang?: string, newLang?: string, error?: string }
|
|
|
|
export type WebviewToExtension
|
|
= | { type: 'issues/refresh' }
|
|
| {
|
|
type: 'settings/save'
|
|
host: string
|
|
token: string
|
|
webhookPort: number
|
|
brainstormPrompt: string
|
|
implementPlanPrompt: string
|
|
autoReview: boolean
|
|
reviewPrompt: string
|
|
devBranch: string
|
|
autoBuildBranch: string
|
|
worktreeDirectory: string
|
|
worktreeOpenWith: 'vscode' | 'pycharm'
|
|
pycharmCommand: string
|
|
worktreePostCreateScript: string
|
|
worktreePreRemoveScript: string
|
|
implTabPreCreateScript: string
|
|
implTabPostCloseScript: string
|
|
youtrackBaseUrl: string
|
|
youtrackProjectShortName: string
|
|
youtrackCloseCommand: string
|
|
youtrackToken: string
|
|
}
|
|
| { type: 'settings/edit-request' }
|
|
| { type: 'youtrack/list-projects', baseUrl: string, token: string }
|
|
| { type: 'youtrack/import' }
|
|
| { type: 'issue/create', userRequest: string, images?: Array<{ mediaType: string, base64: string }>, profilePath?: string }
|
|
| { type: 'toast/open-url', url: string }
|
|
| { type: 'session/resume', sessionId: string, profilePath?: string, cwd?: string, issueNumber?: number }
|
|
| { type: 'session/focus', issueNumber: number }
|
|
| { type: 'session/resume-review', sessionId: string, issueNumber: number, cwd?: string }
|
|
| { type: 'session/resume-test', sessionId: string, issueNumber: number, cwd?: string }
|
|
| { type: 'session/start-test', issueNumber: number }
|
|
| { type: 'editor/open-file', path: string }
|
|
| { type: 'profiles/list' }
|
|
| { type: 'issue/implement', issueNumber: number, planFile: string, profilePath?: string, sessionId?: string }
|
|
| { type: 'issue/generate-pr-diff-summary', issueNumber: number }
|
|
| { type: 'pr/open', pr: string }
|
|
| { type: 'worktree/open', path: string }
|
|
| { type: 'worktree/delete', issueNumber: number, path: string }
|
|
| { type: 'git/merge-preview', issueNumber: number, branch: string }
|
|
| { type: 'column/change', issueNumber: number, toColumn: 'todo' | 'in-progress' | 'review' | 'done', source?: 'gitea' | 'youtrack', externalId?: string }
|
|
| { type: 'dependency/set', issueNumber: number, prerequisiteNumber: number }
|
|
| { type: 'dependency/clear', issueNumber: number, prerequisiteNumber: number }
|
|
| { type: 'issue/update-auto-review', issueNumber: number, value: boolean }
|
|
| { type: 'issue/update-profile-path', issueNumber: number, profilePath: string }
|
|
| { type: 'issue/update-test-profile-path', issueNumber: number, testProfilePath: string }
|
|
| { type: 'logs/fetch' }
|
|
| { type: 'logs/clear' }
|
|
| { type: 'commit/run' }
|
|
| { type: 'session/close-tab', issueNumber: number, kind: 'brainstorm' | 'implement' | 'review' | 'test' }
|
|
| { type: 'branch-sync/check' }
|
|
| { type: 'branch-sync/run' }
|
|
| { type: 'env-lock/check' }
|
|
| { type: 'env-lock/toggle' }
|
|
| { type: 'issue/delete', issueNumber: number }
|
|
| { type: 'issue/close', issueNumber: number }
|
|
| { type: 'brainstorm/start', issueNumber: number }
|
|
| { type: 'profiles/get' }
|
|
| { type: 'profiles/save', data: ProfilesData }
|
|
| { type: 'profiles/open', value: string }
|
|
| { type: 'managed-sessions/get' }
|
|
| { type: 'managed-sessions/create', profilePath: string, name?: string, prompt?: string }
|
|
| { type: 'managed-sessions/rename', sessionId: string, name: string }
|
|
| { type: 'managed-sessions/resume', sessionId: string }
|
|
| { type: 'managed-sessions/delete', sessionId: string }
|
|
| { type: 'managed-sessions/close-tab', sessionId: string }
|
|
| { type: 'pr-files/get', issueNumber: number }
|
|
| { type: 'pr-file-diff/get', issueNumber: number, path: string, previousPath?: string }
|
|
| { type: 'pr-review/set', issueNumber: number, headSha: string, confirmed: string[] }
|