@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,242 @@
1
+ import { exec } from "child_process";
2
+ import { existsSync, readFileSync } from "fs";
3
+ import { platform } from "os";
4
+
5
+ /**
6
+ * CertInstaller — Cross-platform CA certificate installation/removal
7
+ * using elevated privilege execution.
8
+ *
9
+ * Windows: certutil (UAC prompt via runas)
10
+ * macOS: security (password prompt via osascript)
11
+ * Linux: distro-specific system trust stores (pkexec/sudo prompt)
12
+ */
13
+
14
+ interface CertResult {
15
+ success: boolean;
16
+ error?: string;
17
+ }
18
+
19
+ // Dynamically import @vscode/sudo-prompt to avoid bundling issues
20
+ async function getSudoPrompt(): Promise<typeof import("@vscode/sudo-prompt")> {
21
+ return await import("@vscode/sudo-prompt");
22
+ }
23
+
24
+ function execPromise(cmd: string): Promise<string> {
25
+ return new Promise((resolve, reject) => {
26
+ exec(cmd, { timeout: 30_000 }, (err, stdout, stderr) => {
27
+ if (err) reject(new Error(stderr || err.message));
28
+ else resolve(stdout);
29
+ });
30
+ });
31
+ }
32
+
33
+ function sudoExec(cmd: string, name: string): Promise<string> {
34
+ return new Promise(async (resolve, reject) => {
35
+ const sudo = await getSudoPrompt();
36
+ sudo.exec(cmd, { name }, (err?: Error, stdout?: string | Buffer) => {
37
+ if (err) reject(err);
38
+ else resolve(String(stdout ?? ""));
39
+ });
40
+ });
41
+ }
42
+
43
+ async function commandExists(command: string): Promise<boolean> {
44
+ try {
45
+ await execPromise(`command -v ${command}`);
46
+ return true;
47
+ } catch {
48
+ return false;
49
+ }
50
+ }
51
+
52
+ function isArchLikeLinux(): boolean {
53
+ if (existsSync("/etc/arch-release")) return true;
54
+
55
+ try {
56
+ const osRelease = readFileSync("/etc/os-release", "utf-8").toLowerCase();
57
+ return /(^|\n)id(_like)?=.*\b(arch|manjaro|endeavouros|garuda)\b/.test(
58
+ osRelease,
59
+ );
60
+ } catch {
61
+ return false;
62
+ }
63
+ }
64
+
65
+ export class CertInstaller {
66
+ /**
67
+ * Install CA certificate to the system trust store (requires elevation).
68
+ */
69
+ static async install(certPath: string): Promise<CertResult> {
70
+ try {
71
+ const os = platform();
72
+
73
+ if (os === "win32") {
74
+ await sudoExec(
75
+ `certutil -addstore Root "${certPath}"`,
76
+ "Anything Analyzer",
77
+ );
78
+ } else if (os === "darwin") {
79
+ await sudoExec(
80
+ `security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain "${certPath}"`,
81
+ "Anything Analyzer",
82
+ );
83
+ } else {
84
+ await this.installLinux(certPath);
85
+ }
86
+
87
+ return { success: true };
88
+ } catch (err) {
89
+ return { success: false, error: (err as Error).message };
90
+ }
91
+ }
92
+
93
+ /**
94
+ * Remove CA certificate from the system trust store (requires elevation).
95
+ */
96
+ static async uninstall(certPath: string): Promise<CertResult> {
97
+ try {
98
+ const os = platform();
99
+
100
+ if (os === "win32") {
101
+ await sudoExec(
102
+ `certutil -delstore Root "Anything Analyzer CA"`,
103
+ "Anything Analyzer",
104
+ );
105
+ } else if (os === "darwin") {
106
+ await sudoExec(
107
+ `security remove-trusted-cert -d "${certPath}"`,
108
+ "Anything Analyzer",
109
+ );
110
+ } else {
111
+ await this.uninstallLinux(certPath);
112
+ }
113
+
114
+ return { success: true };
115
+ } catch (err) {
116
+ return { success: false, error: (err as Error).message };
117
+ }
118
+ }
119
+
120
+ /**
121
+ * Check whether the CA certificate is currently trusted by the system.
122
+ */
123
+ static async isInstalled(_certPath: string): Promise<boolean> {
124
+ try {
125
+ const os = platform();
126
+
127
+ if (os === "win32") {
128
+ const out = await execPromise(
129
+ `certutil -store Root "Anything Analyzer CA"`,
130
+ );
131
+ return out.includes("Anything Analyzer CA");
132
+ } else if (os === "darwin") {
133
+ const out = await execPromise(
134
+ `security find-certificate -c "Anything Analyzer CA" /Library/Keychains/System.keychain`,
135
+ );
136
+ return out.includes("Anything Analyzer CA");
137
+ } else {
138
+ return this.isLinuxInstalled();
139
+ }
140
+ } catch {
141
+ return false;
142
+ }
143
+ }
144
+
145
+ private static async installLinux(certPath: string): Promise<void> {
146
+ if (isArchLikeLinux()) {
147
+ const dest =
148
+ "/etc/ca-certificates/trust-source/anchors/anything-analyzer.crt";
149
+ const refreshCmd = await this.getLinuxTrustRefreshCommand();
150
+ await sudoExec(
151
+ `mkdir -p /etc/ca-certificates/trust-source/anchors && cp "${certPath}" "${dest}" && ${refreshCmd}`,
152
+ "Anything Analyzer",
153
+ );
154
+ return;
155
+ }
156
+
157
+ if (await commandExists("update-ca-certificates")) {
158
+ const dest = "/usr/local/share/ca-certificates/anything-analyzer.crt";
159
+ await sudoExec(
160
+ `cp "${certPath}" "${dest}" && update-ca-certificates`,
161
+ "Anything Analyzer",
162
+ );
163
+ return;
164
+ }
165
+
166
+ if (await commandExists("update-ca-trust")) {
167
+ const dest = "/etc/pki/ca-trust/source/anchors/anything-analyzer.crt";
168
+ await sudoExec(
169
+ `mkdir -p /etc/pki/ca-trust/source/anchors && cp "${certPath}" "${dest}" && update-ca-trust extract`,
170
+ "Anything Analyzer",
171
+ );
172
+ return;
173
+ }
174
+
175
+ if (await commandExists("trust")) {
176
+ await sudoExec(
177
+ `trust anchor --store "${certPath}" && trust extract-compat`,
178
+ "Anything Analyzer",
179
+ );
180
+ return;
181
+ }
182
+
183
+ throw new Error("No supported Linux CA trust tool found");
184
+ }
185
+
186
+ private static async uninstallLinux(certPath: string): Promise<void> {
187
+ if (isArchLikeLinux()) {
188
+ const refreshCmd = await this.getLinuxTrustRefreshCommand();
189
+ await sudoExec(
190
+ `rm -f /etc/ca-certificates/trust-source/anchors/anything-analyzer.crt && ${refreshCmd}`,
191
+ "Anything Analyzer",
192
+ );
193
+ return;
194
+ }
195
+
196
+ if (await commandExists("update-ca-certificates")) {
197
+ await sudoExec(
198
+ `rm -f /usr/local/share/ca-certificates/anything-analyzer.crt && update-ca-certificates`,
199
+ "Anything Analyzer",
200
+ );
201
+ return;
202
+ }
203
+
204
+ if (await commandExists("update-ca-trust")) {
205
+ await sudoExec(
206
+ `rm -f /etc/pki/ca-trust/source/anchors/anything-analyzer.crt && update-ca-trust extract`,
207
+ "Anything Analyzer",
208
+ );
209
+ return;
210
+ }
211
+
212
+ if (await commandExists("trust")) {
213
+ await sudoExec(
214
+ `trust anchor --remove "${certPath}" && trust extract-compat`,
215
+ "Anything Analyzer",
216
+ );
217
+ return;
218
+ }
219
+
220
+ throw new Error("No supported Linux CA trust tool found");
221
+ }
222
+
223
+ private static async getLinuxTrustRefreshCommand(): Promise<string> {
224
+ if (await commandExists("update-ca-trust")) {
225
+ return "update-ca-trust extract";
226
+ }
227
+ if (await commandExists("trust")) {
228
+ return "trust extract-compat";
229
+ }
230
+ throw new Error("No supported Linux CA trust refresh tool found");
231
+ }
232
+
233
+ private static isLinuxInstalled(): boolean {
234
+ return (
235
+ existsSync(
236
+ "/etc/ca-certificates/trust-source/anchors/anything-analyzer.crt",
237
+ ) ||
238
+ existsSync("/usr/local/share/ca-certificates/anything-analyzer.crt") ||
239
+ existsSync("/etc/pki/ca-trust/source/anchors/anything-analyzer.crt")
240
+ );
241
+ }
242
+ }
@@ -0,0 +1,37 @@
1
+ import { readFileSync, writeFileSync, existsSync } from "fs";
2
+ import { join } from "path";
3
+ import { app } from "electron";
4
+
5
+ export interface MitmProxyConfig {
6
+ enabled: boolean;
7
+ port: number;
8
+ caInstalled: boolean;
9
+ systemProxy: boolean;
10
+ }
11
+
12
+ const DEFAULT_CONFIG: MitmProxyConfig = {
13
+ enabled: false,
14
+ port: 8888,
15
+ caInstalled: false,
16
+ systemProxy: false,
17
+ };
18
+
19
+ function getConfigPath(): string {
20
+ return join(app.getPath("userData"), "mitm-proxy-config.json");
21
+ }
22
+
23
+ export function loadMitmProxyConfig(): MitmProxyConfig {
24
+ const configPath = getConfigPath();
25
+ if (!existsSync(configPath)) return { ...DEFAULT_CONFIG };
26
+
27
+ try {
28
+ const raw = readFileSync(configPath, "utf-8");
29
+ return { ...DEFAULT_CONFIG, ...JSON.parse(raw) };
30
+ } catch {
31
+ return { ...DEFAULT_CONFIG };
32
+ }
33
+ }
34
+
35
+ export function saveMitmProxyConfig(config: MitmProxyConfig): void {
36
+ writeFileSync(getConfigPath(), JSON.stringify(config, null, 2), "utf-8");
37
+ }