@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.
- package/.codeartsdoer/.codebaseignore +0 -0
- package/.codeartsdoer/AGENTS.md +12 -0
- package/.github/workflows/build.yml +146 -0
- package/README.en.md +264 -0
- package/README.md +276 -0
- package/RELEASE_NOTES.md +16 -0
- package/USAGE.md +490 -0
- package/color-preview-r3.html +414 -0
- package/color-preview.html +414 -0
- package/dev-app-update.yml +3 -0
- package/electron-builder.yml +36 -0
- package/electron.vite.config.ts +40 -0
- package/package.json +53 -0
- package/report-2026-04-13-copilot-claude-sonnet-4.6.md +955 -0
- package/resources/doloffer-logo.png +0 -0
- package/resources/entitlements.mac.plist +12 -0
- package/resources/icon.ico +0 -0
- package/resources/icon.png +0 -0
- package/src/main/ai/ai-analyzer.ts +517 -0
- package/src/main/ai/crypto-script-extractor.ts +206 -0
- package/src/main/ai/data-assembler.ts +205 -0
- package/src/main/ai/llm-router.ts +1120 -0
- package/src/main/ai/prompt-builder.ts +349 -0
- package/src/main/ai/scene-detector.ts +302 -0
- package/src/main/capture/capture-engine.ts +130 -0
- package/src/main/capture/interaction-recorder.ts +171 -0
- package/src/main/capture/js-injector.ts +57 -0
- package/src/main/capture/replay-engine.ts +256 -0
- package/src/main/capture/storage-collector.ts +76 -0
- package/src/main/cdp/cdp-manager.ts +233 -0
- package/src/main/db/database.ts +41 -0
- package/src/main/db/migrations.ts +235 -0
- package/src/main/db/repositories.ts +574 -0
- package/src/main/fingerprint/http-spoofing.ts +48 -0
- package/src/main/fingerprint/presets.ts +173 -0
- package/src/main/fingerprint/profile-generator.ts +115 -0
- package/src/main/fingerprint/profile-store.ts +52 -0
- package/src/main/index.ts +260 -0
- package/src/main/ipc.ts +856 -0
- package/src/main/logger.ts +42 -0
- package/src/main/mcp/mcp-config.ts +66 -0
- package/src/main/mcp/mcp-manager.ts +155 -0
- package/src/main/mcp/mcp-server.ts +1038 -0
- package/src/main/prompt-templates.ts +170 -0
- package/src/main/proxy/ca-manager.ts +204 -0
- package/src/main/proxy/cert-download-page.ts +171 -0
- package/src/main/proxy/cert-installer.ts +242 -0
- package/src/main/proxy/mitm-proxy-config.ts +37 -0
- package/src/main/proxy/mitm-proxy-server.ts +1085 -0
- package/src/main/proxy/system-proxy.ts +248 -0
- package/src/main/session/session-manager.ts +724 -0
- package/src/main/tab-manager.ts +582 -0
- package/src/main/updater.ts +111 -0
- package/src/main/window.ts +235 -0
- package/src/preload/hook-script.ts +270 -0
- package/src/preload/index.ts +211 -0
- package/src/preload/interaction-hook.ts +286 -0
- package/src/preload/stealth-script.ts +302 -0
- package/src/preload/target-preload.ts +15 -0
- package/src/renderer/App.tsx +656 -0
- package/src/renderer/components/AiLogDetail.tsx +173 -0
- package/src/renderer/components/AiLogList.tsx +101 -0
- package/src/renderer/components/AiLogView.module.css +364 -0
- package/src/renderer/components/AiLogView.tsx +86 -0
- package/src/renderer/components/AnalyzeBar.module.css +79 -0
- package/src/renderer/components/AnalyzeBar.tsx +104 -0
- package/src/renderer/components/BrowserPanel.module.css +67 -0
- package/src/renderer/components/BrowserPanel.tsx +90 -0
- package/src/renderer/components/ControlBar.module.css +47 -0
- package/src/renderer/components/ControlBar.tsx +205 -0
- package/src/renderer/components/HookLog.tsx +132 -0
- package/src/renderer/components/InteractionLog.tsx +183 -0
- package/src/renderer/components/MCPServerModal.tsx +427 -0
- package/src/renderer/components/PromptTemplateModal.tsx +254 -0
- package/src/renderer/components/ReportView.module.css +413 -0
- package/src/renderer/components/ReportView.tsx +429 -0
- package/src/renderer/components/RequestDetail.module.css +191 -0
- package/src/renderer/components/RequestDetail.tsx +202 -0
- package/src/renderer/components/RequestLog.module.css +69 -0
- package/src/renderer/components/RequestLog.tsx +208 -0
- package/src/renderer/components/SessionList.module.css +245 -0
- package/src/renderer/components/SessionList.tsx +247 -0
- package/src/renderer/components/SettingsModal.tsx +100 -0
- package/src/renderer/components/StatusBar.module.css +44 -0
- package/src/renderer/components/StatusBar.tsx +102 -0
- package/src/renderer/components/StorageView.module.css +41 -0
- package/src/renderer/components/StorageView.tsx +178 -0
- package/src/renderer/components/TabBar.module.css +88 -0
- package/src/renderer/components/TabBar.tsx +70 -0
- package/src/renderer/components/Titlebar.module.css +254 -0
- package/src/renderer/components/Titlebar.tsx +169 -0
- package/src/renderer/components/settings/FingerprintSection.tsx +198 -0
- package/src/renderer/components/settings/GeneralSection.tsx +164 -0
- package/src/renderer/components/settings/LLMSection.tsx +148 -0
- package/src/renderer/components/settings/MCPServerSection.tsx +136 -0
- package/src/renderer/components/settings/MitmProxySection.tsx +320 -0
- package/src/renderer/components/settings/ProxySection.tsx +110 -0
- package/src/renderer/css-modules.d.ts +4 -0
- package/src/renderer/hooks/useCapture.ts +383 -0
- package/src/renderer/hooks/useConfirm.tsx +91 -0
- package/src/renderer/hooks/useSession.ts +136 -0
- package/src/renderer/hooks/useTabs.ts +103 -0
- package/src/renderer/i18n/en.ts +167 -0
- package/src/renderer/i18n/index.ts +47 -0
- package/src/renderer/i18n/zh.ts +170 -0
- package/src/renderer/index.html +12 -0
- package/src/renderer/main.tsx +15 -0
- package/src/renderer/styles/global.css +144 -0
- package/src/renderer/styles/themes/ayu-dark.css +59 -0
- package/src/renderer/styles/themes/catppuccin.css +59 -0
- package/src/renderer/styles/themes/discord.css +59 -0
- package/src/renderer/styles/themes/dracula.css +59 -0
- package/src/renderer/styles/themes/github-dark.css +59 -0
- package/src/renderer/styles/themes/gruvbox.css +59 -0
- package/src/renderer/styles/themes/index.css +11 -0
- package/src/renderer/styles/themes/light.css +59 -0
- package/src/renderer/styles/themes/nord.css +59 -0
- package/src/renderer/styles/themes/one-dark.css +59 -0
- package/src/renderer/styles/themes/tokyo-night.css +59 -0
- package/src/renderer/styles/tokens.css +137 -0
- package/src/renderer/theme.ts +31 -0
- package/src/renderer/ui/Badge.module.css +38 -0
- package/src/renderer/ui/Badge.tsx +36 -0
- package/src/renderer/ui/Button.module.css +142 -0
- package/src/renderer/ui/Button.tsx +46 -0
- package/src/renderer/ui/Collapse.module.css +49 -0
- package/src/renderer/ui/Collapse.tsx +57 -0
- package/src/renderer/ui/CopyableBlock.module.css +56 -0
- package/src/renderer/ui/CopyableBlock.tsx +42 -0
- package/src/renderer/ui/Empty.module.css +19 -0
- package/src/renderer/ui/Empty.tsx +34 -0
- package/src/renderer/ui/Icons.tsx +346 -0
- package/src/renderer/ui/Input.module.css +103 -0
- package/src/renderer/ui/Input.tsx +94 -0
- package/src/renderer/ui/InputNumber.module.css +68 -0
- package/src/renderer/ui/InputNumber.tsx +104 -0
- package/src/renderer/ui/Modal.module.css +83 -0
- package/src/renderer/ui/Modal.tsx +67 -0
- package/src/renderer/ui/Popconfirm.module.css +73 -0
- package/src/renderer/ui/Popconfirm.tsx +74 -0
- package/src/renderer/ui/Progress.module.css +35 -0
- package/src/renderer/ui/Progress.tsx +30 -0
- package/src/renderer/ui/Select.module.css +91 -0
- package/src/renderer/ui/Select.tsx +100 -0
- package/src/renderer/ui/Spinner.module.css +44 -0
- package/src/renderer/ui/Spinner.tsx +27 -0
- package/src/renderer/ui/Switch.module.css +39 -0
- package/src/renderer/ui/Switch.tsx +43 -0
- package/src/renderer/ui/Tabs.module.css +76 -0
- package/src/renderer/ui/Tabs.tsx +53 -0
- package/src/renderer/ui/Tag.module.css +66 -0
- package/src/renderer/ui/Tag.tsx +47 -0
- package/src/renderer/ui/Timeline.module.css +42 -0
- package/src/renderer/ui/Timeline.tsx +29 -0
- package/src/renderer/ui/Toast.module.css +99 -0
- package/src/renderer/ui/Toast.tsx +90 -0
- package/src/renderer/ui/Tooltip.module.css +26 -0
- package/src/renderer/ui/Tooltip.tsx +23 -0
- package/src/renderer/ui/VirtualTable.module.css +230 -0
- package/src/renderer/ui/VirtualTable.tsx +416 -0
- package/src/renderer/ui/index.ts +55 -0
- package/src/shared/types.ts +695 -0
- package/tests/main/ai/crypto-script-extractor.test.ts +281 -0
- package/tests/main/ai/llm-router.test.ts +1537 -0
- package/tests/main/ai/prompt-builder.test.ts +178 -0
- package/tests/main/ai/scene-detector.test.ts +212 -0
- package/tests/main/db/migrations.test.ts +134 -0
- package/tests/main/release-workflow.test.ts +59 -0
- package/tsconfig.json +7 -0
- package/tsconfig.node.json +23 -0
- package/tsconfig.web.json +24 -0
- package/vitest.config.ts +13 -0
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { exec } from "child_process";
|
|
2
|
+
import { platform } from "os";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* SystemProxy — Set/unset the OS-level HTTP/HTTPS proxy.
|
|
6
|
+
*
|
|
7
|
+
* All operations target the **current user** level, so no elevation is needed.
|
|
8
|
+
*
|
|
9
|
+
* - Windows: registry HKCU\...\Internet Settings
|
|
10
|
+
* - macOS: networksetup
|
|
11
|
+
* - Linux: gsettings (GNOME)
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
interface ProxyResult {
|
|
15
|
+
success: boolean;
|
|
16
|
+
error?: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function execPromise(cmd: string): Promise<string> {
|
|
20
|
+
return new Promise((resolve, reject) => {
|
|
21
|
+
exec(cmd, { timeout: 10_000 }, (err, stdout, stderr) => {
|
|
22
|
+
if (err) reject(new Error(stderr || err.message));
|
|
23
|
+
else resolve(stdout.trim());
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Saved state before we touched the system proxy, for restoration. */
|
|
29
|
+
let savedState: { platform: string; data: Record<string, string> } | null =
|
|
30
|
+
null;
|
|
31
|
+
|
|
32
|
+
export class SystemProxy {
|
|
33
|
+
/**
|
|
34
|
+
* Set the system HTTP/HTTPS proxy to localhost:<port>.
|
|
35
|
+
* Saves original proxy state for later restoration.
|
|
36
|
+
*/
|
|
37
|
+
static async enable(port: number): Promise<ProxyResult> {
|
|
38
|
+
try {
|
|
39
|
+
const os = platform();
|
|
40
|
+
|
|
41
|
+
if (os === "win32") {
|
|
42
|
+
await this.enableWindows(port);
|
|
43
|
+
} else if (os === "darwin") {
|
|
44
|
+
await this.enableMacOS(port);
|
|
45
|
+
} else {
|
|
46
|
+
await this.enableLinux(port);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return { success: true };
|
|
50
|
+
} catch (err) {
|
|
51
|
+
return { success: false, error: (err as Error).message };
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Restore the system proxy to its original state.
|
|
57
|
+
*/
|
|
58
|
+
static async disable(): Promise<ProxyResult> {
|
|
59
|
+
try {
|
|
60
|
+
const os = platform();
|
|
61
|
+
|
|
62
|
+
if (os === "win32") {
|
|
63
|
+
await this.disableWindows();
|
|
64
|
+
} else if (os === "darwin") {
|
|
65
|
+
await this.disableMacOS();
|
|
66
|
+
} else {
|
|
67
|
+
await this.disableLinux();
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
savedState = null;
|
|
71
|
+
return { success: true };
|
|
72
|
+
} catch (err) {
|
|
73
|
+
return { success: false, error: (err as Error).message };
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Check whether the system proxy currently points to our MITM proxy.
|
|
79
|
+
*/
|
|
80
|
+
static async isEnabled(port: number): Promise<boolean> {
|
|
81
|
+
try {
|
|
82
|
+
const os = platform();
|
|
83
|
+
if (os === "win32") {
|
|
84
|
+
const out = await execPromise(
|
|
85
|
+
`reg query "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings" /v ProxyEnable`,
|
|
86
|
+
);
|
|
87
|
+
const serverOut = await execPromise(
|
|
88
|
+
`reg query "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings" /v ProxyServer`,
|
|
89
|
+
);
|
|
90
|
+
return (
|
|
91
|
+
out.includes("0x1") &&
|
|
92
|
+
serverOut.includes(`localhost:${port}`)
|
|
93
|
+
);
|
|
94
|
+
} else if (os === "darwin") {
|
|
95
|
+
const service = await this.getActiveMacService();
|
|
96
|
+
const out = await execPromise(
|
|
97
|
+
`networksetup -getwebproxy "${service}"`,
|
|
98
|
+
);
|
|
99
|
+
return (
|
|
100
|
+
out.includes("Enabled: Yes") &&
|
|
101
|
+
out.includes(`Port: ${port}`) &&
|
|
102
|
+
out.includes("Server: localhost")
|
|
103
|
+
);
|
|
104
|
+
} else {
|
|
105
|
+
const mode = await execPromise(
|
|
106
|
+
`gsettings get org.gnome.system.proxy mode`,
|
|
107
|
+
);
|
|
108
|
+
const host = await execPromise(
|
|
109
|
+
`gsettings get org.gnome.system.proxy.http host`,
|
|
110
|
+
);
|
|
111
|
+
return mode.includes("manual") && host.includes("localhost");
|
|
112
|
+
}
|
|
113
|
+
} catch {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// ---- Windows ----
|
|
119
|
+
|
|
120
|
+
private static async enableWindows(port: number): Promise<void> {
|
|
121
|
+
const regPath = `HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings`;
|
|
122
|
+
|
|
123
|
+
// Save current state
|
|
124
|
+
try {
|
|
125
|
+
const enableOut = await execPromise(
|
|
126
|
+
`reg query "${regPath}" /v ProxyEnable`,
|
|
127
|
+
);
|
|
128
|
+
const serverOut = await execPromise(
|
|
129
|
+
`reg query "${regPath}" /v ProxyServer`,
|
|
130
|
+
).catch(() => "");
|
|
131
|
+
const overrideOut = await execPromise(
|
|
132
|
+
`reg query "${regPath}" /v ProxyOverride`,
|
|
133
|
+
).catch(() => "");
|
|
134
|
+
|
|
135
|
+
savedState = {
|
|
136
|
+
platform: "win32",
|
|
137
|
+
data: {
|
|
138
|
+
enable: enableOut,
|
|
139
|
+
server: serverOut,
|
|
140
|
+
override: overrideOut,
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
} catch {
|
|
144
|
+
// No existing proxy — that's fine
|
|
145
|
+
savedState = { platform: "win32", data: { enable: "0x0" } };
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
await execPromise(
|
|
149
|
+
`reg add "${regPath}" /v ProxyEnable /t REG_DWORD /d 1 /f`,
|
|
150
|
+
);
|
|
151
|
+
await execPromise(
|
|
152
|
+
`reg add "${regPath}" /v ProxyServer /t REG_SZ /d "localhost:${port}" /f`,
|
|
153
|
+
);
|
|
154
|
+
await execPromise(
|
|
155
|
+
`reg add "${regPath}" /v ProxyOverride /t REG_SZ /d "localhost;127.0.0.1;<local>" /f`,
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
// Notify the system that proxy settings have changed
|
|
159
|
+
// InternetSetOption with INTERNET_OPTION_REFRESH
|
|
160
|
+
await execPromise(
|
|
161
|
+
`powershell -Command "[System.Runtime.InteropServices.RuntimeEnvironment]::FromGS 2>$null; $sig='[DllImport(\\"wininet.dll\\")]public static extern bool InternetSetOption(IntPtr a,int b,IntPtr c,int d);'; $type=Add-Type -MemberDefinition $sig -Name WinInet -PassThru; $type::InternetSetOption(0,39,0,0); $type::InternetSetOption(0,37,0,0)"`,
|
|
162
|
+
).catch(() => {});
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
private static async disableWindows(): Promise<void> {
|
|
166
|
+
const regPath = `HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings`;
|
|
167
|
+
await execPromise(
|
|
168
|
+
`reg add "${regPath}" /v ProxyEnable /t REG_DWORD /d 0 /f`,
|
|
169
|
+
);
|
|
170
|
+
|
|
171
|
+
// Notify system
|
|
172
|
+
await execPromise(
|
|
173
|
+
`powershell -Command "$sig='[DllImport(\\"wininet.dll\\")]public static extern bool InternetSetOption(IntPtr a,int b,IntPtr c,int d);'; $type=Add-Type -MemberDefinition $sig -Name WinInet2 -PassThru; $type::InternetSetOption(0,39,0,0); $type::InternetSetOption(0,37,0,0)"`,
|
|
174
|
+
).catch(() => {});
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// ---- macOS ----
|
|
178
|
+
|
|
179
|
+
private static async getActiveMacService(): Promise<string> {
|
|
180
|
+
const out = await execPromise(
|
|
181
|
+
`networksetup -listnetworkserviceorder | grep -B1 "$(route get default 2>/dev/null | grep interface | awk '{print $2}')" | head -1 | sed 's/^([0-9]*) //'`,
|
|
182
|
+
).catch(() => "");
|
|
183
|
+
// Fallback to common service names
|
|
184
|
+
if (!out || out.length < 2) {
|
|
185
|
+
const services = await execPromise(`networksetup -listallnetworkservices`);
|
|
186
|
+
if (services.includes("Wi-Fi")) return "Wi-Fi";
|
|
187
|
+
if (services.includes("Ethernet")) return "Ethernet";
|
|
188
|
+
return "Wi-Fi";
|
|
189
|
+
}
|
|
190
|
+
return out.trim();
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
private static async enableMacOS(port: number): Promise<void> {
|
|
194
|
+
const service = await this.getActiveMacService();
|
|
195
|
+
savedState = { platform: "darwin", data: { service } };
|
|
196
|
+
|
|
197
|
+
await execPromise(
|
|
198
|
+
`networksetup -setwebproxy "${service}" localhost ${port}`,
|
|
199
|
+
);
|
|
200
|
+
await execPromise(
|
|
201
|
+
`networksetup -setsecurewebproxy "${service}" localhost ${port}`,
|
|
202
|
+
);
|
|
203
|
+
await execPromise(
|
|
204
|
+
`networksetup -setproxybypassdomains "${service}" localhost 127.0.0.1`,
|
|
205
|
+
);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
private static async disableMacOS(): Promise<void> {
|
|
209
|
+
const service =
|
|
210
|
+
savedState?.platform === "darwin"
|
|
211
|
+
? savedState.data.service || "Wi-Fi"
|
|
212
|
+
: await this.getActiveMacService();
|
|
213
|
+
|
|
214
|
+
await execPromise(`networksetup -setwebproxystate "${service}" off`);
|
|
215
|
+
await execPromise(`networksetup -setsecurewebproxystate "${service}" off`);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// ---- Linux (GNOME) ----
|
|
219
|
+
|
|
220
|
+
private static async enableLinux(port: number): Promise<void> {
|
|
221
|
+
savedState = { platform: "linux", data: {} };
|
|
222
|
+
|
|
223
|
+
await execPromise(
|
|
224
|
+
`gsettings set org.gnome.system.proxy mode 'manual'`,
|
|
225
|
+
);
|
|
226
|
+
await execPromise(
|
|
227
|
+
`gsettings set org.gnome.system.proxy.http host 'localhost'`,
|
|
228
|
+
);
|
|
229
|
+
await execPromise(
|
|
230
|
+
`gsettings set org.gnome.system.proxy.http port ${port}`,
|
|
231
|
+
);
|
|
232
|
+
await execPromise(
|
|
233
|
+
`gsettings set org.gnome.system.proxy.https host 'localhost'`,
|
|
234
|
+
);
|
|
235
|
+
await execPromise(
|
|
236
|
+
`gsettings set org.gnome.system.proxy.https port ${port}`,
|
|
237
|
+
);
|
|
238
|
+
await execPromise(
|
|
239
|
+
`gsettings set org.gnome.system.proxy ignore-hosts "['localhost', '127.0.0.1', '::1']"`,
|
|
240
|
+
);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
private static async disableLinux(): Promise<void> {
|
|
244
|
+
await execPromise(
|
|
245
|
+
`gsettings set org.gnome.system.proxy mode 'none'`,
|
|
246
|
+
);
|
|
247
|
+
}
|
|
248
|
+
}
|