@mseep/anything-analyzer 3.6.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. package/.codeartsdoer/.codebaseignore +0 -0
  2. package/.codeartsdoer/AGENTS.md +12 -0
  3. package/.github/workflows/build.yml +146 -0
  4. package/README.en.md +264 -0
  5. package/README.md +276 -0
  6. package/RELEASE_NOTES.md +16 -0
  7. package/USAGE.md +490 -0
  8. package/color-preview-r3.html +414 -0
  9. package/color-preview.html +414 -0
  10. package/dev-app-update.yml +3 -0
  11. package/electron-builder.yml +36 -0
  12. package/electron.vite.config.ts +40 -0
  13. package/package.json +53 -0
  14. package/report-2026-04-13-copilot-claude-sonnet-4.6.md +955 -0
  15. package/resources/doloffer-logo.png +0 -0
  16. package/resources/entitlements.mac.plist +12 -0
  17. package/resources/icon.ico +0 -0
  18. package/resources/icon.png +0 -0
  19. package/src/main/ai/ai-analyzer.ts +517 -0
  20. package/src/main/ai/crypto-script-extractor.ts +206 -0
  21. package/src/main/ai/data-assembler.ts +205 -0
  22. package/src/main/ai/llm-router.ts +1120 -0
  23. package/src/main/ai/prompt-builder.ts +349 -0
  24. package/src/main/ai/scene-detector.ts +302 -0
  25. package/src/main/capture/capture-engine.ts +130 -0
  26. package/src/main/capture/interaction-recorder.ts +171 -0
  27. package/src/main/capture/js-injector.ts +57 -0
  28. package/src/main/capture/replay-engine.ts +256 -0
  29. package/src/main/capture/storage-collector.ts +76 -0
  30. package/src/main/cdp/cdp-manager.ts +233 -0
  31. package/src/main/db/database.ts +41 -0
  32. package/src/main/db/migrations.ts +235 -0
  33. package/src/main/db/repositories.ts +574 -0
  34. package/src/main/fingerprint/http-spoofing.ts +48 -0
  35. package/src/main/fingerprint/presets.ts +173 -0
  36. package/src/main/fingerprint/profile-generator.ts +115 -0
  37. package/src/main/fingerprint/profile-store.ts +52 -0
  38. package/src/main/index.ts +260 -0
  39. package/src/main/ipc.ts +856 -0
  40. package/src/main/logger.ts +42 -0
  41. package/src/main/mcp/mcp-config.ts +66 -0
  42. package/src/main/mcp/mcp-manager.ts +155 -0
  43. package/src/main/mcp/mcp-server.ts +1038 -0
  44. package/src/main/prompt-templates.ts +170 -0
  45. package/src/main/proxy/ca-manager.ts +204 -0
  46. package/src/main/proxy/cert-download-page.ts +171 -0
  47. package/src/main/proxy/cert-installer.ts +242 -0
  48. package/src/main/proxy/mitm-proxy-config.ts +37 -0
  49. package/src/main/proxy/mitm-proxy-server.ts +1085 -0
  50. package/src/main/proxy/system-proxy.ts +248 -0
  51. package/src/main/session/session-manager.ts +724 -0
  52. package/src/main/tab-manager.ts +582 -0
  53. package/src/main/updater.ts +111 -0
  54. package/src/main/window.ts +235 -0
  55. package/src/preload/hook-script.ts +270 -0
  56. package/src/preload/index.ts +211 -0
  57. package/src/preload/interaction-hook.ts +286 -0
  58. package/src/preload/stealth-script.ts +302 -0
  59. package/src/preload/target-preload.ts +15 -0
  60. package/src/renderer/App.tsx +656 -0
  61. package/src/renderer/components/AiLogDetail.tsx +173 -0
  62. package/src/renderer/components/AiLogList.tsx +101 -0
  63. package/src/renderer/components/AiLogView.module.css +364 -0
  64. package/src/renderer/components/AiLogView.tsx +86 -0
  65. package/src/renderer/components/AnalyzeBar.module.css +79 -0
  66. package/src/renderer/components/AnalyzeBar.tsx +104 -0
  67. package/src/renderer/components/BrowserPanel.module.css +67 -0
  68. package/src/renderer/components/BrowserPanel.tsx +90 -0
  69. package/src/renderer/components/ControlBar.module.css +47 -0
  70. package/src/renderer/components/ControlBar.tsx +205 -0
  71. package/src/renderer/components/HookLog.tsx +132 -0
  72. package/src/renderer/components/InteractionLog.tsx +183 -0
  73. package/src/renderer/components/MCPServerModal.tsx +427 -0
  74. package/src/renderer/components/PromptTemplateModal.tsx +254 -0
  75. package/src/renderer/components/ReportView.module.css +413 -0
  76. package/src/renderer/components/ReportView.tsx +429 -0
  77. package/src/renderer/components/RequestDetail.module.css +191 -0
  78. package/src/renderer/components/RequestDetail.tsx +202 -0
  79. package/src/renderer/components/RequestLog.module.css +69 -0
  80. package/src/renderer/components/RequestLog.tsx +208 -0
  81. package/src/renderer/components/SessionList.module.css +245 -0
  82. package/src/renderer/components/SessionList.tsx +247 -0
  83. package/src/renderer/components/SettingsModal.tsx +100 -0
  84. package/src/renderer/components/StatusBar.module.css +44 -0
  85. package/src/renderer/components/StatusBar.tsx +102 -0
  86. package/src/renderer/components/StorageView.module.css +41 -0
  87. package/src/renderer/components/StorageView.tsx +178 -0
  88. package/src/renderer/components/TabBar.module.css +88 -0
  89. package/src/renderer/components/TabBar.tsx +70 -0
  90. package/src/renderer/components/Titlebar.module.css +254 -0
  91. package/src/renderer/components/Titlebar.tsx +169 -0
  92. package/src/renderer/components/settings/FingerprintSection.tsx +198 -0
  93. package/src/renderer/components/settings/GeneralSection.tsx +164 -0
  94. package/src/renderer/components/settings/LLMSection.tsx +148 -0
  95. package/src/renderer/components/settings/MCPServerSection.tsx +136 -0
  96. package/src/renderer/components/settings/MitmProxySection.tsx +320 -0
  97. package/src/renderer/components/settings/ProxySection.tsx +110 -0
  98. package/src/renderer/css-modules.d.ts +4 -0
  99. package/src/renderer/hooks/useCapture.ts +383 -0
  100. package/src/renderer/hooks/useConfirm.tsx +91 -0
  101. package/src/renderer/hooks/useSession.ts +136 -0
  102. package/src/renderer/hooks/useTabs.ts +103 -0
  103. package/src/renderer/i18n/en.ts +167 -0
  104. package/src/renderer/i18n/index.ts +47 -0
  105. package/src/renderer/i18n/zh.ts +170 -0
  106. package/src/renderer/index.html +12 -0
  107. package/src/renderer/main.tsx +15 -0
  108. package/src/renderer/styles/global.css +144 -0
  109. package/src/renderer/styles/themes/ayu-dark.css +59 -0
  110. package/src/renderer/styles/themes/catppuccin.css +59 -0
  111. package/src/renderer/styles/themes/discord.css +59 -0
  112. package/src/renderer/styles/themes/dracula.css +59 -0
  113. package/src/renderer/styles/themes/github-dark.css +59 -0
  114. package/src/renderer/styles/themes/gruvbox.css +59 -0
  115. package/src/renderer/styles/themes/index.css +11 -0
  116. package/src/renderer/styles/themes/light.css +59 -0
  117. package/src/renderer/styles/themes/nord.css +59 -0
  118. package/src/renderer/styles/themes/one-dark.css +59 -0
  119. package/src/renderer/styles/themes/tokyo-night.css +59 -0
  120. package/src/renderer/styles/tokens.css +137 -0
  121. package/src/renderer/theme.ts +31 -0
  122. package/src/renderer/ui/Badge.module.css +38 -0
  123. package/src/renderer/ui/Badge.tsx +36 -0
  124. package/src/renderer/ui/Button.module.css +142 -0
  125. package/src/renderer/ui/Button.tsx +46 -0
  126. package/src/renderer/ui/Collapse.module.css +49 -0
  127. package/src/renderer/ui/Collapse.tsx +57 -0
  128. package/src/renderer/ui/CopyableBlock.module.css +56 -0
  129. package/src/renderer/ui/CopyableBlock.tsx +42 -0
  130. package/src/renderer/ui/Empty.module.css +19 -0
  131. package/src/renderer/ui/Empty.tsx +34 -0
  132. package/src/renderer/ui/Icons.tsx +346 -0
  133. package/src/renderer/ui/Input.module.css +103 -0
  134. package/src/renderer/ui/Input.tsx +94 -0
  135. package/src/renderer/ui/InputNumber.module.css +68 -0
  136. package/src/renderer/ui/InputNumber.tsx +104 -0
  137. package/src/renderer/ui/Modal.module.css +83 -0
  138. package/src/renderer/ui/Modal.tsx +67 -0
  139. package/src/renderer/ui/Popconfirm.module.css +73 -0
  140. package/src/renderer/ui/Popconfirm.tsx +74 -0
  141. package/src/renderer/ui/Progress.module.css +35 -0
  142. package/src/renderer/ui/Progress.tsx +30 -0
  143. package/src/renderer/ui/Select.module.css +91 -0
  144. package/src/renderer/ui/Select.tsx +100 -0
  145. package/src/renderer/ui/Spinner.module.css +44 -0
  146. package/src/renderer/ui/Spinner.tsx +27 -0
  147. package/src/renderer/ui/Switch.module.css +39 -0
  148. package/src/renderer/ui/Switch.tsx +43 -0
  149. package/src/renderer/ui/Tabs.module.css +76 -0
  150. package/src/renderer/ui/Tabs.tsx +53 -0
  151. package/src/renderer/ui/Tag.module.css +66 -0
  152. package/src/renderer/ui/Tag.tsx +47 -0
  153. package/src/renderer/ui/Timeline.module.css +42 -0
  154. package/src/renderer/ui/Timeline.tsx +29 -0
  155. package/src/renderer/ui/Toast.module.css +99 -0
  156. package/src/renderer/ui/Toast.tsx +90 -0
  157. package/src/renderer/ui/Tooltip.module.css +26 -0
  158. package/src/renderer/ui/Tooltip.tsx +23 -0
  159. package/src/renderer/ui/VirtualTable.module.css +230 -0
  160. package/src/renderer/ui/VirtualTable.tsx +416 -0
  161. package/src/renderer/ui/index.ts +55 -0
  162. package/src/shared/types.ts +695 -0
  163. package/tests/main/ai/crypto-script-extractor.test.ts +281 -0
  164. package/tests/main/ai/llm-router.test.ts +1537 -0
  165. package/tests/main/ai/prompt-builder.test.ts +178 -0
  166. package/tests/main/ai/scene-detector.test.ts +212 -0
  167. package/tests/main/db/migrations.test.ts +134 -0
  168. package/tests/main/release-workflow.test.ts +59 -0
  169. package/tsconfig.json +7 -0
  170. package/tsconfig.node.json +23 -0
  171. package/tsconfig.web.json +24 -0
  172. package/vitest.config.ts +13 -0
@@ -0,0 +1,695 @@
1
+ // ============================================================
2
+ // Shared type definitions for main process and renderer process
3
+ // ============================================================
4
+
5
+ /**
6
+ * Anything Analyzer 共享类型定义
7
+ *
8
+ * 命名约定说明:
9
+ * - CapturedRequest: 直接从 CDP 捕获的请求,使用 snake_case,与数据库表字段对应
10
+ * - FilteredRequest: 内存中处理过的请求数据,使用 camelCase,便于 JavaScript/TypeScript 代码使用
11
+ * - SceneHint, AuthChainItem: AI 分析结果类型,使用 camelCase
12
+ */
13
+
14
+ // ---- Session ----
15
+
16
+ export type SessionStatus = "running" | "paused" | "stopped";
17
+
18
+ export interface Session {
19
+ id: string;
20
+ name: string;
21
+ target_url: string;
22
+ status: SessionStatus;
23
+ created_at: number;
24
+ stopped_at: number | null;
25
+ }
26
+
27
+ // ---- Captured Request ----
28
+
29
+ export interface CapturedRequest {
30
+ id: string;
31
+ session_id: string;
32
+ sequence: number;
33
+ timestamp: number;
34
+ method: string;
35
+ url: string;
36
+ request_headers: string; // JSON
37
+ request_body: string | null;
38
+ status_code: number | null;
39
+ response_headers: string | null; // JSON
40
+ response_body: string | null;
41
+ content_type: string | null;
42
+ initiator: string | null; // JSON
43
+ duration_ms: number | null;
44
+ // 流式通信标记
45
+ is_streaming: boolean; // 用于识别 SSE(Server-Sent Events)响应,Content-Type 为 text/event-stream 时为 true
46
+ is_websocket: boolean; // 用于标记 WebSocket 升级请求,Upgrade 头为 websocket 时为 true
47
+ source?: 'cdp' | 'proxy';
48
+ }
49
+
50
+ // ---- JS Hook Record ----
51
+
52
+ export type HookType = "fetch" | "xhr" | "crypto" | "crypto_lib" | "cookie_set";
53
+
54
+ export interface JsHookRecord {
55
+ id: number;
56
+ session_id: string;
57
+ timestamp: number;
58
+ hook_type: HookType;
59
+ function_name: string;
60
+ arguments: string; // JSON
61
+ result: string | null; // JSON
62
+ call_stack: string | null;
63
+ related_request_id: string | null;
64
+ }
65
+
66
+ // ---- Storage Snapshot ----
67
+
68
+ export type StorageType = "cookie" | "localStorage" | "sessionStorage";
69
+
70
+ export interface StorageSnapshot {
71
+ id: number;
72
+ session_id: string;
73
+ timestamp: number;
74
+ domain: string;
75
+ storage_type: StorageType;
76
+ data: string; // JSON
77
+ }
78
+
79
+ // ---- Analysis Report ----
80
+
81
+ export interface AnalysisReport {
82
+ id: string;
83
+ session_id: string;
84
+ created_at: number;
85
+ llm_provider: string;
86
+ llm_model: string;
87
+ prompt_tokens: number | null;
88
+ completion_tokens: number | null;
89
+ report_content: string; // Markdown
90
+ filter_prompt_tokens: number | null; // Phase 1 预过滤 token 消耗
91
+ filter_completion_tokens: number | null;
92
+ }
93
+
94
+ // ---- AI Request Log ----
95
+
96
+ export interface AiRequestLog {
97
+ id: number;
98
+ session_id: string | null;
99
+ report_id: string | null;
100
+ type: 'analyze' | 'chat' | 'filter';
101
+ provider: string;
102
+ model: string;
103
+ request_url: string;
104
+ request_method: string;
105
+ request_headers: string; // JSON string, API key masked
106
+ request_body: string;
107
+ status_code: number | null;
108
+ response_headers: string | null;
109
+ response_body: string | null;
110
+ prompt_tokens: number;
111
+ completion_tokens: number;
112
+ duration_ms: number | null;
113
+ error: string | null;
114
+ created_at: number;
115
+ }
116
+
117
+ /** Data passed from LLMRouter intercept (without context fields filled by caller) */
118
+ export interface AiRequestLogData {
119
+ request_url: string;
120
+ request_method: string;
121
+ request_headers: string;
122
+ request_body: string;
123
+ status_code: number | null;
124
+ response_headers: string | null;
125
+ response_body: string | null;
126
+ duration_ms: number | null;
127
+ error: string | null;
128
+ }
129
+
130
+ // ---- Request Summary (Phase 1 预过滤) ----
131
+
132
+ /** Phase 1 轻量请求摘要,用于 AI 相关性过滤 */
133
+ export interface RequestSummary {
134
+ seq: number;
135
+ method: string;
136
+ url: string;
137
+ status: number | null;
138
+ contentType: string | null;
139
+ }
140
+
141
+ // ---- Scene Hint ----
142
+
143
+ export interface SceneHint {
144
+ scene: string; // 场景标签:ai-chat, auth-oauth, auth-token, auth-session, registration, login, websocket, sse-stream, api-general
145
+ confidence: "high" | "medium" | "low";
146
+ evidence: string; // 判断依据示例:"POST /v1/chat/completions with stream:true", "SSE response detected"
147
+ relatedRequestIds: string[]; // 关联的请求ID数组
148
+ }
149
+
150
+ // ---- Auth Chain Item ----
151
+
152
+ export interface AuthChainItem {
153
+ source: string; // 凭据获取来源。格式示例:"POST /api/login 响应"、"Set-Cookie header"
154
+ credentialType: string; // 凭据类型:Bearer Token, Refresh Token, Session Cookie, Token
155
+ credential: string; // 凭据值(脱敏处理:仅保留前后各8个字符)。格式示例:"Bearer eyJ...xxx"
156
+ consumers: string[]; // 使用该凭据的后续请求路径数组
157
+ }
158
+
159
+ // ---- Chat Message ----
160
+
161
+ export interface ChatMessage {
162
+ role: 'system' | 'user' | 'assistant';
163
+ content: string;
164
+ }
165
+
166
+ /**
167
+ * 从 assistant 消息内容中移除 <tool_context> 块(用于前端显示)。
168
+ * LLM 对话历史中保留该块以维持工具交互上下文。
169
+ */
170
+ export function stripToolContext(content: string): string {
171
+ return content.replace(/\n*<tool_context>[\s\S]*?<\/tool_context>\s*$/g, '');
172
+ }
173
+
174
+ // ---- Browser Tab ----
175
+
176
+ export interface BrowserTab {
177
+ id: string;
178
+ url: string;
179
+ title: string;
180
+ isActive: boolean;
181
+ isLoading?: boolean;
182
+ }
183
+
184
+ // ---- Auto Update ----
185
+
186
+ export type UpdateState =
187
+ | "idle"
188
+ | "checking"
189
+ | "available"
190
+ | "not-available"
191
+ | "downloading"
192
+ | "downloaded"
193
+ | "error";
194
+
195
+ export interface UpdateInfo {
196
+ version: string;
197
+ releaseNotes?: string;
198
+ }
199
+
200
+ export interface UpdateProgress {
201
+ percent: number;
202
+ bytesPerSecond: number;
203
+ transferred: number;
204
+ total: number;
205
+ }
206
+
207
+ export interface UpdateStatus {
208
+ state: UpdateState;
209
+ info?: UpdateInfo;
210
+ progress?: UpdateProgress;
211
+ error?: string;
212
+ }
213
+
214
+ // ---- LLM Provider Config ----
215
+
216
+ export type LLMProviderType = "openai" | "anthropic" | "minimax" | "custom";
217
+ export type OpenAIApiType = "completions" | "responses";
218
+
219
+ export interface LLMProviderConfig {
220
+ name: LLMProviderType;
221
+ apiType?: OpenAIApiType;
222
+ baseUrl: string;
223
+ apiKey: string;
224
+ model: string;
225
+ maxTokens: number;
226
+ }
227
+
228
+ // ---- Prompt Template ----
229
+
230
+ export interface PromptTemplate {
231
+ id: string;
232
+ name: string;
233
+ description: string;
234
+ systemPrompt: string;
235
+ requirements: string;
236
+ isBuiltin: boolean;
237
+ isModified: boolean;
238
+ }
239
+
240
+ // ---- MCP Server Config ----
241
+
242
+ interface MCPServerConfigBase {
243
+ id: string;
244
+ name: string;
245
+ enabled: boolean;
246
+ }
247
+
248
+ export interface MCPServerConfigStdio extends MCPServerConfigBase {
249
+ transport: "stdio";
250
+ command: string;
251
+ args: string[];
252
+ env: Record<string, string>;
253
+ }
254
+
255
+ export interface MCPServerConfigHttp extends MCPServerConfigBase {
256
+ transport: "streamableHttp";
257
+ url: string;
258
+ headers?: Record<string, string>;
259
+ }
260
+
261
+ export type MCPServerConfig = MCPServerConfigStdio | MCPServerConfigHttp;
262
+
263
+ // ---- Proxy Config ----
264
+
265
+ export interface ProxyConfig {
266
+ type: "none" | "http" | "https" | "socks5";
267
+ host: string;
268
+ port: number;
269
+ username?: string;
270
+ password?: string;
271
+ }
272
+
273
+ export interface MCPServerSettings {
274
+ enabled: boolean;
275
+ port: number;
276
+ authEnabled: boolean;
277
+ authToken: string;
278
+ }
279
+
280
+ // ---- MITM Proxy ----
281
+
282
+ export interface MitmProxyConfig {
283
+ enabled: boolean;
284
+ port: number;
285
+ caInstalled: boolean;
286
+ systemProxy: boolean;
287
+ }
288
+
289
+ export interface MitmProxyStatus {
290
+ running: boolean;
291
+ port: number | null;
292
+ caInitialized: boolean;
293
+ caInstalled: boolean;
294
+ caCertPath: string | null;
295
+ systemProxyEnabled: boolean;
296
+ }
297
+
298
+ // ---- Interaction Recording ----
299
+
300
+ export type InteractionType = 'click' | 'dblclick' | 'input' | 'scroll' | 'navigate' | 'hover';
301
+
302
+ export interface InteractionEvent {
303
+ id: number;
304
+ session_id: string;
305
+ sequence: number;
306
+ type: InteractionType;
307
+ timestamp: number;
308
+ // Position
309
+ x: number | null;
310
+ y: number | null;
311
+ viewport_x: number | null;
312
+ viewport_y: number | null;
313
+ // Element
314
+ selector: string | null;
315
+ xpath: string | null;
316
+ tag_name: string | null;
317
+ element_text: string | null;
318
+ attributes: string | null; // JSON
319
+ bounding_rect: string | null; // JSON
320
+ // Input
321
+ input_value: string | null;
322
+ key: string | null;
323
+ // Scroll
324
+ scroll_x: number | null;
325
+ scroll_y: number | null;
326
+ scroll_dx: number | null;
327
+ scroll_dy: number | null;
328
+ // Context
329
+ url: string;
330
+ page_title: string | null;
331
+ path: string | null; // JSON: mouse move path [{x, y, t}...]
332
+ created_at: number;
333
+ }
334
+
335
+ /** Raw interaction data sent from page injection script to main process */
336
+ export interface RawInteractionData {
337
+ type: InteractionType;
338
+ timestamp: number;
339
+ x?: number;
340
+ y?: number;
341
+ viewportX?: number;
342
+ viewportY?: number;
343
+ selector?: string;
344
+ xpath?: string;
345
+ tagName?: string;
346
+ elementText?: string;
347
+ attributes?: Record<string, string>;
348
+ boundingRect?: { x: number; y: number; width: number; height: number };
349
+ inputValue?: string;
350
+ key?: string;
351
+ scrollX?: number;
352
+ scrollY?: number;
353
+ scrollDX?: number;
354
+ scrollDY?: number;
355
+ url: string;
356
+ pageTitle?: string;
357
+ path?: Array<{ x: number; y: number; t: number }>;
358
+ }
359
+
360
+ // ---- Fingerprint Profile ----
361
+
362
+ export interface FingerprintProfile {
363
+ /** Bound to Session ID */
364
+ sessionId: string;
365
+ // Basic identity
366
+ userAgent: string;
367
+ platform: string; // "Win32" | "MacIntel" | "Linux x86_64"
368
+ oscpu: string;
369
+ appVersion: string;
370
+ // Hardware
371
+ screenWidth: number;
372
+ screenHeight: number;
373
+ colorDepth: number; // 24 | 32
374
+ devicePixelRatio: number; // 1 | 1.25 | 1.5 | 2
375
+ hardwareConcurrency: number; // 4 | 8 | 12 | 16
376
+ deviceMemory: number; // 4 | 8 | 16 | 32
377
+ // WebGL
378
+ webglVendor: string;
379
+ webglRenderer: string;
380
+ // Canvas & Audio noise seeds
381
+ canvasNoise: number;
382
+ audioNoise: number;
383
+ // Network / Geo
384
+ languages: string[];
385
+ timezone: string;
386
+ timezoneOffset: number;
387
+ // WebRTC
388
+ webrtcPolicy: 'block' | 'real' | 'fake';
389
+ }
390
+
391
+ // ---- Filtered Request ----
392
+
393
+ export interface FilteredRequest {
394
+ seq: number;
395
+ method: string;
396
+ url: string;
397
+ headers: Record<string, string>;
398
+ body: string | null;
399
+ status: number | null;
400
+ responseHeaders: Record<string, string> | null;
401
+ responseBody: string | null;
402
+ hooks: JsHookRecord[];
403
+ }
404
+
405
+ // ---- Crypto Script Snippet ----
406
+
407
+ export interface CryptoScriptSnippet {
408
+ scriptUrl: string;
409
+ lineRange: [number, number];
410
+ content: string;
411
+ matchedPatterns: string[];
412
+ tier: 1 | 2 | 3;
413
+ }
414
+
415
+ // ---- Assembled Data ----
416
+
417
+ export interface StorageDiff {
418
+ added: Record<string, string>;
419
+ changed: Record<string, { old: string; new: string }>;
420
+ removed: string[];
421
+ }
422
+
423
+ export interface AssembledData {
424
+ requests: FilteredRequest[];
425
+ storageDiff: {
426
+ cookies: StorageDiff;
427
+ localStorage: StorageDiff;
428
+ sessionStorage: StorageDiff;
429
+ };
430
+ estimatedTokens: number;
431
+ // AI 分析增强字段
432
+ sceneHints: SceneHint[]; // 通过规则推理检测的业务场景线索(如注册、登录、AI 对话等)
433
+ streamingRequests: FilteredRequest[]; // 流式通信请求(SSE 或 WebSocket),从 is_streaming/is_websocket 标记判断
434
+ authChain: AuthChainItem[]; // 身份认证链:凭据来源、类型、值及使用者
435
+ cryptoScripts: CryptoScriptSnippet[]; // 从已捕获的 JS 文件中提取的加密相关代码片段
436
+ }
437
+
438
+ // ---- Analysis Purpose ----
439
+
440
+ export const ANALYSIS_PURPOSES = [
441
+ { label: '自动识别', value: 'auto', description: '默认 — AI 自动检测场景并生成通用分析' },
442
+ { label: '逆向 API 协议', value: 'reverse-api', description: '聚焦 API 端点、请求/响应模式、鉴权流程、数据模型、复现代码' },
443
+ { label: '安全审计', value: 'security-audit', description: '聚焦认证安全、敏感数据暴露、CSRF/XSS 风险、权限控制' },
444
+ { label: '性能分析', value: 'performance', description: '聚焦请求时序、冗余请求、资源加载、缓存策略' },
445
+ { label: 'JS加密逆向', value: 'crypto-reverse', description: '聚焦JS加密算法识别、加密流程还原、密钥分析、Python复现代码' },
446
+ { label: '自定义...', value: 'custom', description: '输入自定义分析指令' },
447
+ ] as const;
448
+
449
+ export type AnalysisPurposeId = (typeof ANALYSIS_PURPOSES)[number]['value'];
450
+
451
+ // ---- IPC Channel Names ----
452
+
453
+ export const IPC_CHANNELS = {
454
+ // Session
455
+ SESSION_CREATE: "session:create",
456
+ SESSION_LIST: "session:list",
457
+ SESSION_START: "session:start",
458
+ SESSION_PAUSE: "session:pause",
459
+ SESSION_RESUME: "session:resume",
460
+ SESSION_STOP: "session:stop",
461
+ SESSION_DELETE: "session:delete",
462
+
463
+ // Browser
464
+ BROWSER_NAVIGATE: "browser:navigate",
465
+ BROWSER_BACK: "browser:back",
466
+ BROWSER_FORWARD: "browser:forward",
467
+ BROWSER_RELOAD: "browser:reload",
468
+ BROWSER_CLEAR_ENV: "browser:clearEnv",
469
+
470
+ // Data
471
+ DATA_REQUESTS: "data:requests",
472
+ DATA_HOOKS: "data:hooks",
473
+ DATA_STORAGE: "data:storage",
474
+ DATA_CLEAR: "data:clear",
475
+ DATA_EXPORT_REQUESTS: "data:exportRequests",
476
+
477
+ // AI Request Log
478
+ DATA_AI_LOGS: "data:aiRequestLogs",
479
+ DATA_AI_LOGS_ALL: "data:aiRequestLogsAll",
480
+ DATA_AI_LOG_DETAIL: "data:aiRequestLogDetail",
481
+
482
+ // AI
483
+ AI_ANALYZE: "ai:analyze",
484
+ AI_PROGRESS: "ai:progress",
485
+ AI_CHAT: "ai:chat",
486
+ AI_CANCEL: "ai:cancel",
487
+
488
+ // Settings
489
+ SETTINGS_GET_LLM: "settings:getLLM",
490
+ SETTINGS_SAVE_LLM: "settings:saveLLM",
491
+
492
+ // Tabs
493
+ TABS_CREATE: "tabs:create",
494
+ TABS_CLOSE: "tabs:close",
495
+ TABS_ACTIVATE: "tabs:activate",
496
+ TABS_LIST: "tabs:list",
497
+
498
+ // Tab events (main → renderer)
499
+ TABS_CREATED: "tabs:created",
500
+ TABS_CLOSED: "tabs:closed",
501
+ TABS_ACTIVATED: "tabs:activated",
502
+ TABS_UPDATED: "tabs:updated",
503
+
504
+ // Capture events (main → renderer)
505
+ CAPTURE_REQUEST: "capture:request",
506
+ CAPTURE_HOOK: "capture:hook",
507
+ CAPTURE_STORAGE: "capture:storage",
508
+
509
+ // Update
510
+ APP_VERSION: "app:version",
511
+ UPDATE_CHECK: "update:check",
512
+ UPDATE_INSTALL: "update:install",
513
+ UPDATE_STATUS: "update:status",
514
+
515
+ // Prompt Templates
516
+ TEMPLATES_LIST: "templates:list",
517
+ TEMPLATES_SAVE: "templates:save",
518
+ TEMPLATES_DELETE: "templates:delete",
519
+ TEMPLATES_RESET: "templates:reset",
520
+
521
+ // MCP Servers
522
+ MCP_LIST: "mcp:list",
523
+ MCP_SAVE: "mcp:save",
524
+ MCP_DELETE: "mcp:delete",
525
+
526
+ // Proxy
527
+ PROXY_GET: "proxy:get",
528
+ PROXY_SAVE: "proxy:save",
529
+
530
+ // MCP Server
531
+ MCP_SERVER_GET_CONFIG: "mcp-server:getConfig",
532
+ MCP_SERVER_SAVE_CONFIG: "mcp-server:saveConfig",
533
+ MCP_SERVER_STATUS: "mcp-server:status",
534
+
535
+ // MITM Proxy
536
+ MITM_GET_CONFIG: "mitm-proxy:getConfig",
537
+ MITM_SAVE_CONFIG: "mitm-proxy:saveConfig",
538
+ MITM_STATUS: "mitm-proxy:status",
539
+ MITM_INSTALL_CA: "mitm-proxy:installCA",
540
+ MITM_UNINSTALL_CA: "mitm-proxy:uninstallCA",
541
+ MITM_EXPORT_CA: "mitm-proxy:exportCA",
542
+ MITM_REGENERATE_CA: "mitm-proxy:regenerateCA",
543
+ MITM_ENABLE_SYSTEM_PROXY: "mitm-proxy:enableSystemProxy",
544
+ MITM_DISABLE_SYSTEM_PROXY: "mitm-proxy:disableSystemProxy",
545
+
546
+ // Fingerprint
547
+ FINGERPRINT_GET: "fingerprint:get",
548
+ FINGERPRINT_UPDATE: "fingerprint:update",
549
+ FINGERPRINT_REGENERATE: "fingerprint:regenerate",
550
+ FINGERPRINT_ENABLE: "fingerprint:enable",
551
+ FINGERPRINT_DISABLE: "fingerprint:disable",
552
+ } as const;
553
+
554
+ // ---- Electron API (exposed via contextBridge) ----
555
+
556
+ export interface ElectronAPI {
557
+ // Window control (frameless window)
558
+ minimizeWindow: () => Promise<void>;
559
+ maximizeWindow: () => Promise<void>;
560
+ closeWindow: () => Promise<void>;
561
+ isWindowMaximized: () => Promise<boolean>;
562
+
563
+ createSession: (name: string, targetUrl: string) => Promise<Session>;
564
+ listSessions: () => Promise<Session[]>;
565
+ startCapture: (sessionId: string) => Promise<void>;
566
+ pauseCapture: (sessionId: string) => Promise<void>;
567
+ resumeCapture: (sessionId: string) => Promise<void>;
568
+ stopCapture: (sessionId: string) => Promise<void>;
569
+ deleteSession: (sessionId: string) => Promise<void>;
570
+
571
+ navigate: (url: string) => Promise<void>;
572
+ goBack: () => Promise<void>;
573
+ goForward: () => Promise<void>;
574
+ reload: () => Promise<void>;
575
+ setBrowserRatio: (ratio: number) => Promise<void>;
576
+ setTargetViewVisible: (visible: boolean) => Promise<void>;
577
+ toggleDevTools: () => Promise<void>;
578
+ exportFile: (defaultName: string, content: string) => Promise<boolean>;
579
+ openExternal: (url: string) => Promise<void>;
580
+
581
+ getRequests: (sessionId: string) => Promise<CapturedRequest[]>;
582
+ getHooks: (sessionId: string) => Promise<JsHookRecord[]>;
583
+ getStorage: (sessionId: string) => Promise<StorageSnapshot[]>;
584
+ getReports: (sessionId: string) => Promise<AnalysisReport[]>;
585
+ clearCaptureData: (sessionId: string) => Promise<void>;
586
+
587
+ startAnalysis: (sessionId: string, purpose?: string, selectedSeqs?: number[]) => Promise<AnalysisReport>;
588
+ cancelAnalysis: (sessionId: string) => Promise<void>;
589
+ sendFollowUp: (sessionId: string, reportId: string, history: ChatMessage[], userMessage: string) => Promise<string>;
590
+ getChatMessages: (reportId: string) => Promise<ChatMessage[]>;
591
+ saveChatMessages: (reportId: string, messages: ChatMessage[]) => Promise<void>;
592
+ syncBrowserBounds: (bounds: {
593
+ x: number;
594
+ y: number;
595
+ width: number;
596
+ height: number;
597
+ }) => void;
598
+
599
+ getLLMConfig: () => Promise<LLMProviderConfig | null>;
600
+ saveLLMConfig: (config: LLMProviderConfig) => Promise<void>;
601
+
602
+ // Tab management
603
+ createTab: (url?: string) => Promise<BrowserTab>;
604
+ closeTab: (tabId: string) => Promise<void>;
605
+ activateTab: (tabId: string) => Promise<void>;
606
+ listTabs: () => Promise<BrowserTab[]>;
607
+
608
+ // Tab events
609
+ onTabCreated: (callback: (tab: BrowserTab) => void) => void;
610
+ onTabClosed: (callback: (data: { tabId: string }) => void) => void;
611
+ onTabActivated: (
612
+ callback: (data: { tabId: string; url: string; title: string }) => void,
613
+ ) => void;
614
+ onTabUpdated: (
615
+ callback: (data: { tabId: string; url?: string; title?: string; isLoading?: boolean }) => void,
616
+ ) => void;
617
+
618
+ onRequestCaptured: (callback: (data: CapturedRequest) => void) => void;
619
+ onHookCaptured: (callback: (data: JsHookRecord) => void) => void;
620
+ onStorageCaptured: (callback: (data: StorageSnapshot) => void) => void;
621
+ onAnalysisProgress: (callback: (chunk: string) => void) => void;
622
+ removeAllListeners: (channel: string) => void;
623
+
624
+ // Auto update
625
+ getAppVersion: () => Promise<string>;
626
+ checkForUpdate: () => Promise<void>;
627
+ installUpdate: () => void;
628
+ onUpdateStatus: (callback: (status: UpdateStatus) => void) => void;
629
+
630
+ // Prompt Templates
631
+ getPromptTemplates: () => Promise<PromptTemplate[]>;
632
+ savePromptTemplate: (template: PromptTemplate) => Promise<void>;
633
+ deletePromptTemplate: (id: string) => Promise<void>;
634
+ resetPromptTemplate: (id: string) => Promise<void>;
635
+
636
+ // MCP Servers
637
+ getMCPServers: () => Promise<MCPServerConfig[]>;
638
+ saveMCPServer: (server: MCPServerConfig) => Promise<void>;
639
+ deleteMCPServer: (id: string) => Promise<void>;
640
+
641
+ // Export requests
642
+ exportRequests: (sessionId: string) => Promise<boolean>;
643
+
644
+ // AI Request Logs
645
+ getAiRequestLogs: (sessionId: string) => Promise<AiRequestLog[]>;
646
+ getAiRequestLogsAll: (limit: number, offset: number) => Promise<AiRequestLog[]>;
647
+ getAiRequestLogDetail: (id: number) => Promise<AiRequestLog | null>;
648
+
649
+ // Proxy
650
+ getProxyConfig: () => Promise<ProxyConfig | null>;
651
+ saveProxyConfig: (config: ProxyConfig) => Promise<void>;
652
+
653
+ // Browser environment
654
+ clearBrowserEnv: () => Promise<void>;
655
+
656
+ // MCP Server
657
+ getMCPServerConfig: () => Promise<MCPServerSettings>;
658
+ saveMCPServerConfig: (config: MCPServerSettings) => Promise<void>;
659
+ getMCPServerStatus: () => Promise<{ running: boolean; port: number | null }>;
660
+
661
+ // MITM Proxy
662
+ getMitmProxyConfig: () => Promise<MitmProxyConfig>;
663
+ saveMitmProxyConfig: (config: MitmProxyConfig) => Promise<void>;
664
+ getMitmProxyStatus: () => Promise<MitmProxyStatus>;
665
+ installMitmCA: () => Promise<{ success: boolean; error?: string }>;
666
+ uninstallMitmCA: () => Promise<{ success: boolean; error?: string }>;
667
+ exportMitmCA: () => Promise<boolean>;
668
+ regenerateMitmCA: () => Promise<void>;
669
+ enableMitmSystemProxy: () => Promise<{ success: boolean; error?: string }>;
670
+ disableMitmSystemProxy: () => Promise<{ success: boolean; error?: string }>;
671
+
672
+ // Fingerprint
673
+ getFingerprintProfile: (sessionId: string) => Promise<FingerprintProfile | null>;
674
+ updateFingerprintProfile: (profile: FingerprintProfile) => Promise<void>;
675
+ regenerateFingerprintProfile: (sessionId: string) => Promise<FingerprintProfile>;
676
+ enableFingerprint: (sessionId: string) => Promise<void>;
677
+ disableFingerprint: () => Promise<void>;
678
+
679
+ // Interaction Recording
680
+ getInteractions: (sessionId: string, limit?: number) => Promise<InteractionEvent[]>;
681
+ getInteractionCount: (sessionId: string) => Promise<number>;
682
+ clearInteractions: (sessionId: string) => Promise<void>;
683
+ onInteractionRecorded: (callback: (data: { type: string; sequence: number; timestamp: number }) => void) => void;
684
+
685
+ // Log files
686
+ getLogPath: () => Promise<string>;
687
+ openLogFolder: () => Promise<void>;
688
+ exportLogs: () => Promise<boolean>;
689
+ }
690
+
691
+ declare global {
692
+ interface Window {
693
+ electronAPI: ElectronAPI;
694
+ }
695
+ }