deepspider 0.1.0
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/.claude/agents/check.md +122 -0
- package/.claude/agents/debug.md +106 -0
- package/.claude/agents/dispatch.md +214 -0
- package/.claude/agents/implement.md +96 -0
- package/.claude/agents/plan.md +396 -0
- package/.claude/agents/research.md +120 -0
- package/.claude/commands/evolve/merge.md +80 -0
- package/.claude/commands/trellis/before-backend-dev.md +13 -0
- package/.claude/commands/trellis/before-frontend-dev.md +13 -0
- package/.claude/commands/trellis/break-loop.md +107 -0
- package/.claude/commands/trellis/check-backend.md +13 -0
- package/.claude/commands/trellis/check-cross-layer.md +153 -0
- package/.claude/commands/trellis/check-frontend.md +13 -0
- package/.claude/commands/trellis/create-command.md +154 -0
- package/.claude/commands/trellis/finish-work.md +129 -0
- package/.claude/commands/trellis/integrate-skill.md +219 -0
- package/.claude/commands/trellis/onboard.md +358 -0
- package/.claude/commands/trellis/parallel.md +193 -0
- package/.claude/commands/trellis/record-session.md +62 -0
- package/.claude/commands/trellis/start.md +280 -0
- package/.claude/commands/trellis/update-spec.md +213 -0
- package/.claude/hooks/inject-subagent-context.py +758 -0
- package/.claude/hooks/ralph-loop.py +374 -0
- package/.claude/hooks/session-start.py +126 -0
- package/.claude/settings.json +41 -0
- package/.claude/skills/deepagents-guide/SKILL.md +428 -0
- package/.cursor/commands/trellis-before-backend-dev.md +13 -0
- package/.cursor/commands/trellis-before-frontend-dev.md +13 -0
- package/.cursor/commands/trellis-break-loop.md +107 -0
- package/.cursor/commands/trellis-check-backend.md +13 -0
- package/.cursor/commands/trellis-check-cross-layer.md +153 -0
- package/.cursor/commands/trellis-check-frontend.md +13 -0
- package/.cursor/commands/trellis-create-command.md +154 -0
- package/.cursor/commands/trellis-finish-work.md +129 -0
- package/.cursor/commands/trellis-integrate-skill.md +219 -0
- package/.cursor/commands/trellis-onboard.md +358 -0
- package/.cursor/commands/trellis-record-session.md +62 -0
- package/.cursor/commands/trellis-start.md +156 -0
- package/.cursor/commands/trellis-update-spec.md +213 -0
- package/.env.example +11 -0
- package/.husky/pre-commit +1 -0
- package/.mcp.json +8 -0
- package/.trellis/.template-hashes.json +65 -0
- package/.trellis/.version +1 -0
- package/.trellis/scripts/add-session.sh +384 -0
- package/.trellis/scripts/common/developer.sh +129 -0
- package/.trellis/scripts/common/git-context.sh +263 -0
- package/.trellis/scripts/common/paths.sh +208 -0
- package/.trellis/scripts/common/phase.sh +150 -0
- package/.trellis/scripts/common/registry.sh +247 -0
- package/.trellis/scripts/common/task-queue.sh +142 -0
- package/.trellis/scripts/common/task-utils.sh +151 -0
- package/.trellis/scripts/common/worktree.sh +128 -0
- package/.trellis/scripts/create-bootstrap.sh +299 -0
- package/.trellis/scripts/get-context.sh +7 -0
- package/.trellis/scripts/get-developer.sh +15 -0
- package/.trellis/scripts/init-developer.sh +34 -0
- package/.trellis/scripts/multi-agent/cleanup.sh +396 -0
- package/.trellis/scripts/multi-agent/create-pr.sh +241 -0
- package/.trellis/scripts/multi-agent/plan.sh +207 -0
- package/.trellis/scripts/multi-agent/start.sh +310 -0
- package/.trellis/scripts/multi-agent/status.sh +828 -0
- package/.trellis/scripts/task.sh +1118 -0
- package/.trellis/spec/backend/deepagents-guide.md +337 -0
- package/.trellis/spec/backend/directory-structure.md +126 -0
- package/.trellis/spec/backend/examples/skills/deepagents-guide/README.md +11 -0
- package/.trellis/spec/backend/examples/skills/deepagents-guide/agent.js.template +20 -0
- package/.trellis/spec/backend/examples/skills/deepagents-guide/skills-config.js.template +13 -0
- package/.trellis/spec/backend/examples/skills/deepagents-guide/subagent.js.template +19 -0
- package/.trellis/spec/backend/hook-guidelines.md +178 -0
- package/.trellis/spec/backend/index.md +36 -0
- package/.trellis/spec/backend/quality-guidelines.md +201 -0
- package/.trellis/spec/backend/state-management.md +76 -0
- package/.trellis/spec/backend/tool-guidelines.md +144 -0
- package/.trellis/spec/backend/type-safety.md +71 -0
- package/.trellis/spec/guides/code-reuse-thinking-guide.md +92 -0
- package/.trellis/spec/guides/cross-layer-thinking-guide.md +94 -0
- package/.trellis/spec/guides/index.md +79 -0
- package/.trellis/tasks/archive/02-02-evolving-skills/prd.md +61 -0
- package/.trellis/tasks/archive/02-02-evolving-skills/task.json +29 -0
- package/.trellis/tasks/archive/2026-02/00-bootstrap-guidelines/prd.md +86 -0
- package/.trellis/tasks/archive/2026-02/00-bootstrap-guidelines/task.json +27 -0
- package/.trellis/tasks/archive/2026-02/02-02-skills-system/check.jsonl +3 -0
- package/.trellis/tasks/archive/2026-02/02-02-skills-system/debug.jsonl +2 -0
- package/.trellis/tasks/archive/2026-02/02-02-skills-system/implement.jsonl +5 -0
- package/.trellis/tasks/archive/2026-02/02-02-skills-system/prd.md +33 -0
- package/.trellis/tasks/archive/2026-02/02-02-skills-system/task.json +41 -0
- package/.trellis/workflow.md +407 -0
- package/.trellis/workspace/index.md +123 -0
- package/.trellis/workspace/pony/index.md +40 -0
- package/.trellis/workspace/pony/journal-1.md +7 -0
- package/.trellis/worktree.yaml +47 -0
- package/AGENTS.md +18 -0
- package/CLAUDE.md +292 -0
- package/README.md +134 -0
- package/agents/deepspider.md +142 -0
- package/docs/DEBUG.md +42 -0
- package/docs/GUIDE.md +334 -0
- package/docs/PROMPT.md +60 -0
- package/docs/USAGE.md +226 -0
- package/eslint.config.js +51 -0
- package/package.json +78 -0
- package/requirements-crypto.txt +14 -0
- package/src/agent/index.js +97 -0
- package/src/agent/logger.js +164 -0
- package/src/agent/middleware/filterTools.js +64 -0
- package/src/agent/middleware/report.js +79 -0
- package/src/agent/prompts/system.js +315 -0
- package/src/agent/run.js +575 -0
- package/src/agent/skills/anti-detect/SKILL.md +28 -0
- package/src/agent/skills/anti-detect/evolved.md +12 -0
- package/src/agent/skills/captcha/SKILL.md +37 -0
- package/src/agent/skills/captcha/evolved.md +12 -0
- package/src/agent/skills/config.js +30 -0
- package/src/agent/skills/crawler/SKILL.md +9 -0
- package/src/agent/skills/crawler/evolved.md +16 -0
- package/src/agent/skills/dynamic-analysis/SKILL.md +91 -0
- package/src/agent/skills/dynamic-analysis/evolved.md +12 -0
- package/src/agent/skills/env/SKILL.md +72 -0
- package/src/agent/skills/env/evolved.md +12 -0
- package/src/agent/skills/evolve.js +79 -0
- package/src/agent/skills/general/SKILL.md +12 -0
- package/src/agent/skills/general/evolved.md +12 -0
- package/src/agent/skills/js2python/SKILL.md +30 -0
- package/src/agent/skills/js2python/evolved.md +13 -0
- package/src/agent/skills/report/SKILL.md +21 -0
- package/src/agent/skills/report/evolved.md +12 -0
- package/src/agent/skills/sandbox/SKILL.md +22 -0
- package/src/agent/skills/sandbox/evolved.md +16 -0
- package/src/agent/skills/static-analysis/SKILL.md +93 -0
- package/src/agent/skills/static-analysis/evolved.md +12 -0
- package/src/agent/skills/xpath/SKILL.md +119 -0
- package/src/agent/subagents/anti-detect.js +45 -0
- package/src/agent/subagents/captcha.js +51 -0
- package/src/agent/subagents/crawler.js +138 -0
- package/src/agent/subagents/dynamic.js +64 -0
- package/src/agent/subagents/env-agent.js +82 -0
- package/src/agent/subagents/index.js +37 -0
- package/src/agent/subagents/js2python.js +72 -0
- package/src/agent/subagents/sandbox.js +55 -0
- package/src/agent/subagents/static.js +66 -0
- package/src/agent/tools/analysis.js +135 -0
- package/src/agent/tools/analyzer.js +85 -0
- package/src/agent/tools/anti-detect.js +89 -0
- package/src/agent/tools/antidebug.js +64 -0
- package/src/agent/tools/async.js +43 -0
- package/src/agent/tools/browser.js +324 -0
- package/src/agent/tools/captcha.js +223 -0
- package/src/agent/tools/capture.js +179 -0
- package/src/agent/tools/correlate.js +303 -0
- package/src/agent/tools/crawler.js +116 -0
- package/src/agent/tools/cryptohook.js +80 -0
- package/src/agent/tools/debug.js +246 -0
- package/src/agent/tools/deobfuscator.js +90 -0
- package/src/agent/tools/env.js +83 -0
- package/src/agent/tools/envdump.js +92 -0
- package/src/agent/tools/evolve.js +164 -0
- package/src/agent/tools/extract.js +114 -0
- package/src/agent/tools/extractor.js +54 -0
- package/src/agent/tools/file.js +224 -0
- package/src/agent/tools/hook.js +84 -0
- package/src/agent/tools/hookManager.js +178 -0
- package/src/agent/tools/index.js +137 -0
- package/src/agent/tools/nodejs.js +101 -0
- package/src/agent/tools/patch.js +46 -0
- package/src/agent/tools/preprocess.js +71 -0
- package/src/agent/tools/profile.js +122 -0
- package/src/agent/tools/python.js +627 -0
- package/src/agent/tools/report.js +124 -0
- package/src/agent/tools/runtime.js +132 -0
- package/src/agent/tools/sandbox.js +79 -0
- package/src/agent/tools/store.js +73 -0
- package/src/agent/tools/trace.js +74 -0
- package/src/agent/tools/tracing.js +201 -0
- package/src/agent/tools/utils.js +51 -0
- package/src/agent/tools/verify.js +184 -0
- package/src/agent/tools/webcrack.js +109 -0
- package/src/analyzer/ASTAnalyzer.js +387 -0
- package/src/analyzer/CallStackAnalyzer.js +379 -0
- package/src/analyzer/Deobfuscator.js +289 -0
- package/src/analyzer/EncryptionAnalyzer.js +99 -0
- package/src/analyzer/index.js +22 -0
- package/src/browser/EnvBridge.js +186 -0
- package/src/browser/cdp.js +168 -0
- package/src/browser/client.js +197 -0
- package/src/browser/collector.js +444 -0
- package/src/browser/collectors/RequestCryptoLinker.js +109 -0
- package/src/browser/collectors/ResponseSearcher.js +107 -0
- package/src/browser/collectors/ScriptCollector.js +158 -0
- package/src/browser/collectors/index.js +26 -0
- package/src/browser/defaultHooks.js +932 -0
- package/src/browser/hooks/crypto.js +55 -0
- package/src/browser/hooks/index.js +64 -0
- package/src/browser/hooks/native.js +9 -0
- package/src/browser/hooks/network.js +33 -0
- package/src/browser/index.js +42 -0
- package/src/browser/interceptors/NetworkInterceptor.js +116 -0
- package/src/browser/interceptors/ScriptInterceptor.js +76 -0
- package/src/browser/interceptors/index.js +6 -0
- package/src/browser/ui/analysisPanel.js +1782 -0
- package/src/browser/ui/confirmDialog.js +158 -0
- package/src/browser/ui/panel.html +152 -0
- package/src/browser/ui/selector.js +170 -0
- package/src/config/index.js +5 -0
- package/src/config/paths.js +71 -0
- package/src/config/patterns/crypto.js +36 -0
- package/src/config/profiles/chrome.json +71 -0
- package/src/config/profiles/firefox.json +44 -0
- package/src/config/profiles/safari.json +38 -0
- package/src/core/EnvMonitor.js +200 -0
- package/src/core/PatchGenerator.js +278 -0
- package/src/core/Sandbox.js +181 -0
- package/src/env/AntiAntiDebug.js +111 -0
- package/src/env/AsyncHook.js +68 -0
- package/src/env/BrowserAPIList.js +265 -0
- package/src/env/CookieHook.js +48 -0
- package/src/env/CryptoHook.js +205 -0
- package/src/env/EnvCodeGenerator.js +157 -0
- package/src/env/EnvDumper.js +356 -0
- package/src/env/EnvExtractor.js +220 -0
- package/src/env/HookBase.js +618 -0
- package/src/env/NetworkHook.js +159 -0
- package/src/env/modules/bom/history.js +29 -0
- package/src/env/modules/bom/location.js +26 -0
- package/src/env/modules/bom/navigator.js +70 -0
- package/src/env/modules/bom/screen.js +26 -0
- package/src/env/modules/bom/storage.js +23 -0
- package/src/env/modules/dom/document.js +110 -0
- package/src/env/modules/dom/event.js +51 -0
- package/src/env/modules/index.js +34 -0
- package/src/env/modules/webapi/fetch.js +46 -0
- package/src/env/modules/webapi/url.js +47 -0
- package/src/env/modules/webapi/xhr.js +48 -0
- package/src/index.js +27 -0
- package/src/mcp/server.js +89 -0
- package/src/store/DataStore.js +708 -0
- package/src/store/Store.js +158 -0
- package/src/store/Validator.js +24 -0
- package/test/analyze.test.js +90 -0
- package/test/envdump.test.js +74 -0
- package/test/flow.test.js +90 -0
- package/test/hooks.test.js +138 -0
- package/test/plugin.test.js +35 -0
- package/test/refactor-full.test.js +30 -0
- package/test/refactor.test.js +21 -0
- package/test/samples/obfuscated.js +61 -0
- package/test/samples/original.js +66 -0
- package/test/samples/v10_eval_chain.js +52 -0
- package/test/samples/v11_bytecode_vm.js +81 -0
- package/test/samples/v12_polymorphic.js +69 -0
- package/test/samples/v1_ob_basic.js +98 -0
- package/test/samples/v2_ob_advanced.js +99 -0
- package/test/samples/v3_jjencode.js +77 -0
- package/test/samples/v4_aaencode.js +73 -0
- package/test/samples/v5_control_flow.js +86 -0
- package/test/samples/v6_string_encryption.js +71 -0
- package/test/samples/v7_jsvmp.js +83 -0
- package/test/samples/v8_anti_debug.js +79 -0
- package/test/samples/v9_proxy_trap.js +49 -0
- package/test/samples.test.js +96 -0
- package/test/webcrack.test.js +55 -0
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
# DeepAgents 框架使用指南
|
|
2
|
+
|
|
3
|
+
> DeepSpider 项目的 DeepAgents 框架规范
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
DeepAgents 是基于 LangGraph 的 Agent 框架,DeepSpider 使用它构建多代理系统。
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Agent 创建
|
|
14
|
+
|
|
15
|
+
### 基础配置
|
|
16
|
+
|
|
17
|
+
```javascript
|
|
18
|
+
import { createDeepAgent, FilesystemBackend } from 'deepagents';
|
|
19
|
+
import { ChatOpenAI } from '@langchain/openai';
|
|
20
|
+
|
|
21
|
+
const agent = createDeepAgent({
|
|
22
|
+
name: 'deepspider',
|
|
23
|
+
model: new ChatOpenAI({ model: 'gpt-4o' }),
|
|
24
|
+
tools: coreTools,
|
|
25
|
+
subagents: allSubagents,
|
|
26
|
+
systemPrompt,
|
|
27
|
+
backend: new FilesystemBackend({ rootDir: './.deepspider-agent' }),
|
|
28
|
+
});
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### 必需参数
|
|
32
|
+
|
|
33
|
+
| 参数 | 类型 | 说明 |
|
|
34
|
+
|------|------|------|
|
|
35
|
+
| `name` | string | Agent 名称 |
|
|
36
|
+
| `model` | BaseChatModel | LLM 模型实例 |
|
|
37
|
+
| `tools` | Tool[] | 工具数组 |
|
|
38
|
+
| `systemPrompt` | string | 系统提示词 |
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## 子代理定义
|
|
43
|
+
|
|
44
|
+
### 字典式子代理
|
|
45
|
+
|
|
46
|
+
```javascript
|
|
47
|
+
export const staticSubagent = {
|
|
48
|
+
name: 'static-agent',
|
|
49
|
+
description: '静态代码分析专家。当需要分析混淆代码时使用。',
|
|
50
|
+
systemPrompt: `你是静态分析专家...`,
|
|
51
|
+
tools: [...analyzerTools, ...deobfuscatorTools],
|
|
52
|
+
middleware: [
|
|
53
|
+
createSkillsMiddleware({
|
|
54
|
+
backend: skillsBackend,
|
|
55
|
+
sources: [SKILLS.static],
|
|
56
|
+
}),
|
|
57
|
+
],
|
|
58
|
+
};
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 必需字段
|
|
62
|
+
|
|
63
|
+
| 字段 | 说明 |
|
|
64
|
+
|------|------|
|
|
65
|
+
| `name` | 子代理名称,用于调用 |
|
|
66
|
+
| `description` | 描述何时使用该子代理 |
|
|
67
|
+
| `systemPrompt` | 子代理的系统提示 |
|
|
68
|
+
| `tools` | 子代理可用的工具 |
|
|
69
|
+
|
|
70
|
+
### 可选字段
|
|
71
|
+
|
|
72
|
+
| 字段 | 说明 |
|
|
73
|
+
|------|------|
|
|
74
|
+
| `model` | 覆盖默认模型 |
|
|
75
|
+
| `middleware` | 子代理中间件(如 Skills) |
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## Skills 系统
|
|
80
|
+
|
|
81
|
+
### 配置独立 Skills
|
|
82
|
+
|
|
83
|
+
每个子代理只加载属于自己的 skills:
|
|
84
|
+
|
|
85
|
+
```javascript
|
|
86
|
+
// src/agent/skills/config.js
|
|
87
|
+
export const SKILLS = {
|
|
88
|
+
// 逆向分析
|
|
89
|
+
static: `${BASE_DIR}static-analysis`,
|
|
90
|
+
dynamic: `${BASE_DIR}dynamic-analysis`,
|
|
91
|
+
sandbox: `${BASE_DIR}sandbox`,
|
|
92
|
+
env: `${BASE_DIR}env`,
|
|
93
|
+
js2python: `${BASE_DIR}js2python`,
|
|
94
|
+
// 爬虫能力
|
|
95
|
+
captcha: `${BASE_DIR}captcha`,
|
|
96
|
+
antiDetect: `${BASE_DIR}anti-detect`,
|
|
97
|
+
crawler: `${BASE_DIR}crawler`,
|
|
98
|
+
};
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### 子代理绑定 Skills
|
|
102
|
+
|
|
103
|
+
```javascript
|
|
104
|
+
import { createSkillsMiddleware } from 'deepagents';
|
|
105
|
+
import { SKILLS, skillsBackend } from '../skills/config.js';
|
|
106
|
+
|
|
107
|
+
export const staticSubagent = {
|
|
108
|
+
// ...其他配置
|
|
109
|
+
middleware: [
|
|
110
|
+
createSkillsMiddleware({
|
|
111
|
+
backend: skillsBackend,
|
|
112
|
+
sources: [SKILLS.static], // 只加载静态分析 skill
|
|
113
|
+
}),
|
|
114
|
+
],
|
|
115
|
+
};
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### SKILL.md 格式
|
|
119
|
+
|
|
120
|
+
```markdown
|
|
121
|
+
---
|
|
122
|
+
name: skill-name
|
|
123
|
+
description: |
|
|
124
|
+
技能描述。触发场景。关键词。
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
# 技能内容
|
|
128
|
+
|
|
129
|
+
只写领域知识和经验,不写工具调用。
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### 自我进化 Skills
|
|
133
|
+
|
|
134
|
+
Skills 分为静态和动态两部分:
|
|
135
|
+
|
|
136
|
+
| 类型 | 文件 | 管理方式 |
|
|
137
|
+
|------|------|----------|
|
|
138
|
+
| 静态 | SKILL.md | Git 版本控制 |
|
|
139
|
+
| 动态 | evolved.md | 运行时积累 |
|
|
140
|
+
|
|
141
|
+
#### evolved.md 格式
|
|
142
|
+
|
|
143
|
+
```markdown
|
|
144
|
+
---
|
|
145
|
+
total: 5
|
|
146
|
+
last_merged: 2024-01-15
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## 核心经验
|
|
150
|
+
|
|
151
|
+
<!-- 经过验证的高价值经验 -->
|
|
152
|
+
|
|
153
|
+
### [2024-01-10] 经验标题
|
|
154
|
+
**场景**: 具体场景描述
|
|
155
|
+
**经验**: 一句话总结
|
|
156
|
+
|
|
157
|
+
## 近期发现
|
|
158
|
+
|
|
159
|
+
<!-- FIFO 滚动,最多 10 条 -->
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
#### 触发经验记录
|
|
163
|
+
|
|
164
|
+
在 subagent 的 systemPrompt 末尾添加引导:
|
|
165
|
+
|
|
166
|
+
```javascript
|
|
167
|
+
systemPrompt: `...原有内容...
|
|
168
|
+
|
|
169
|
+
## 经验记录
|
|
170
|
+
完成分析后,如发现有价值的经验,使用 evolve_skill 记录:
|
|
171
|
+
- skill: "static-analysis"
|
|
172
|
+
- 新技巧、踩坑记录、通用方案都值得记录`,
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
> **注意**: evolve_skill 工具不会自动触发,需要通过 Prompt 引导 Agent 主动调用。
|
|
176
|
+
|
|
177
|
+
#### 合并策略
|
|
178
|
+
|
|
179
|
+
- 近期发现保留最多 10 条(FIFO)
|
|
180
|
+
- 动态经验达到 20 条时提示合并
|
|
181
|
+
- 使用 `/evolve:merge <skill>` 命令触发合并
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## 后端存储
|
|
186
|
+
|
|
187
|
+
### FilesystemBackend(推荐)
|
|
188
|
+
|
|
189
|
+
```javascript
|
|
190
|
+
import { FilesystemBackend } from 'deepagents';
|
|
191
|
+
|
|
192
|
+
const backend = new FilesystemBackend({
|
|
193
|
+
rootDir: './.deepspider-agent',
|
|
194
|
+
});
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### StateBackend(临时)
|
|
198
|
+
|
|
199
|
+
```javascript
|
|
200
|
+
import { StateBackend } from 'deepagents';
|
|
201
|
+
|
|
202
|
+
const backend = new StateBackend(); // 数据不持久化
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
## 人机交互
|
|
208
|
+
|
|
209
|
+
### 配置敏感工具审批
|
|
210
|
+
|
|
211
|
+
```javascript
|
|
212
|
+
const agent = createDeepAgent({
|
|
213
|
+
interruptOn: {
|
|
214
|
+
sandbox_execute: { allowedDecisions: ['approve', 'reject', 'edit'] },
|
|
215
|
+
sandbox_inject: { allowedDecisions: ['approve', 'reject'] },
|
|
216
|
+
},
|
|
217
|
+
checkpointer: new MemorySaver(), // 必需
|
|
218
|
+
});
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## 最佳实践
|
|
224
|
+
|
|
225
|
+
### 子代理描述要具体
|
|
226
|
+
|
|
227
|
+
```javascript
|
|
228
|
+
// ✅ 好
|
|
229
|
+
description: '静态代码分析专家。当需要分析混淆代码结构时使用,适用于:Webpack 解包、反混淆、定位加密函数。'
|
|
230
|
+
|
|
231
|
+
// ❌ 差
|
|
232
|
+
description: '分析代码'
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### 工具集要专注
|
|
236
|
+
|
|
237
|
+
```javascript
|
|
238
|
+
// ✅ 好:静态分析子代理只有分析工具
|
|
239
|
+
tools: [...analyzerTools, ...deobfuscatorTools, ...traceTools]
|
|
240
|
+
|
|
241
|
+
// ❌ 差:混入不相关工具
|
|
242
|
+
tools: [...analyzerTools, ...browserTools, ...sandboxTools]
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### Skills 只写经验
|
|
246
|
+
|
|
247
|
+
```markdown
|
|
248
|
+
// ✅ 好:领域知识
|
|
249
|
+
## 常见检测点
|
|
250
|
+
- navigator.webdriver → undefined
|
|
251
|
+
- window.chrome → 完整对象
|
|
252
|
+
|
|
253
|
+
// ❌ 差:工具调用
|
|
254
|
+
## 工具使用
|
|
255
|
+
- sandbox_inject(code) - 注入代码
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
---
|
|
259
|
+
|
|
260
|
+
## 常见错误
|
|
261
|
+
|
|
262
|
+
### 错误 1: 所有 agent 加载全部 skills
|
|
263
|
+
|
|
264
|
+
**问题**: 使用单一 `SKILLS_DIR` 让所有 agent 加载全部 skills。
|
|
265
|
+
|
|
266
|
+
**后果**: 上下文膨胀,skills 内容与 agent 职责不匹配。
|
|
267
|
+
|
|
268
|
+
**正确做法**: 每个 agent 只加载自己的 skills。
|
|
269
|
+
|
|
270
|
+
### 错误 2: 主 agent 加载 skills
|
|
271
|
+
|
|
272
|
+
**问题**: 主 agent 配置了 `skills: [SKILLS_DIR]`。
|
|
273
|
+
|
|
274
|
+
**后果**: 主 agent 负责分发任务,不需要领域知识。
|
|
275
|
+
|
|
276
|
+
**正确做法**: 主 agent 不配置 skills,只有子代理配置。
|
|
277
|
+
|
|
278
|
+
### 错误 3: SKILL.md 写工具文档
|
|
279
|
+
|
|
280
|
+
**问题**: 在 SKILL.md 中列出工具名称和参数说明。
|
|
281
|
+
|
|
282
|
+
**后果**: 与 systemPrompt 重复,浪费 token。
|
|
283
|
+
|
|
284
|
+
**正确做法**: Skills 只写领域经验、技巧、常见问题。
|
|
285
|
+
|
|
286
|
+
### 错误 4: Skills 记录开发经验而非领域知识
|
|
287
|
+
|
|
288
|
+
**问题**: 在 evolved.md 中记录项目开发经验(如 Playwright 用法)。
|
|
289
|
+
|
|
290
|
+
**后果**: 污染 Agent 的领域知识库,与 JS 逆向分析无关。
|
|
291
|
+
|
|
292
|
+
**正确做法**: Skills 只记录 Agent 执行任务时需要的领域知识(如加密算法差异)。
|
|
293
|
+
|
|
294
|
+
### 错误 5: systemPrompt 中列出工具清单
|
|
295
|
+
|
|
296
|
+
**问题**: 在 systemPrompt 中手动列出工具名称和用法说明。
|
|
297
|
+
|
|
298
|
+
```javascript
|
|
299
|
+
// ❌ 差
|
|
300
|
+
systemPrompt: `你是分析专家。
|
|
301
|
+
|
|
302
|
+
## 可用工具
|
|
303
|
+
- analyze_ast: 分析 AST
|
|
304
|
+
- deobfuscate: 反混淆代码
|
|
305
|
+
...`
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
**后果**: LangChain 会自动注入工具信息,手动列出导致重复和不一致。
|
|
309
|
+
|
|
310
|
+
**正确做法**: systemPrompt 只写职责和工作流程,工具信息由框架自动注入。
|
|
311
|
+
|
|
312
|
+
### 错误 6: 子代理职责重叠
|
|
313
|
+
|
|
314
|
+
**问题**: 创建多个子代理处理相似任务(如 static-agent 和 algo-agent 都做加密分析)。
|
|
315
|
+
|
|
316
|
+
**后果**: 主 agent 难以选择正确的子代理,导致任务分发混乱。
|
|
317
|
+
|
|
318
|
+
**正确做法**: 合并职责相近的子代理,确保每个子代理有明确独立的职责边界。
|
|
319
|
+
|
|
320
|
+
### 错误 7: 引用不存在的工具模块
|
|
321
|
+
|
|
322
|
+
**问题**: 在子代理中导入不存在的工具模块(如 `browserTools` 实际文件名是 `trigger.js`)。
|
|
323
|
+
|
|
324
|
+
```javascript
|
|
325
|
+
// ❌ 差:模块不存在
|
|
326
|
+
import { browserTools } from '../tools/browser.js';
|
|
327
|
+
|
|
328
|
+
// ✅ 好:确认模块存在后再导入
|
|
329
|
+
import { browserTools } from '../tools/browser.js'; // 文件确实存在
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
**后果**: 运行时报错 `Cannot find module`。
|
|
333
|
+
|
|
334
|
+
**正确做法**:
|
|
335
|
+
1. 添加新子代理前,先确认所需工具模块存在
|
|
336
|
+
2. 工具模块命名应语义化(如 `browser.js` 比 `trigger.js` 更清晰)
|
|
337
|
+
3. 修改模块名时同步更新所有引用
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# Directory Structure
|
|
2
|
+
|
|
3
|
+
> DeepSpider 项目的代码组织结构
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
DeepSpider 是一个 Node.js 后端项目,基于 DeepAgents + Patchright 构建的 JS 逆向分析引擎。
|
|
10
|
+
项目采用模块化架构,按功能职责划分目录。
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Directory Layout
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
src/
|
|
18
|
+
├── agent/ # DeepAgent 系统(核心)
|
|
19
|
+
│ ├── index.js # Agent 主入口,createDeepSpiderAgent()
|
|
20
|
+
│ ├── run.js # Agent 运行入口
|
|
21
|
+
│ ├── tools/ # LangChain 工具集(90+)
|
|
22
|
+
│ │ ├── index.js # 工具导出汇总
|
|
23
|
+
│ │ ├── analyzer.js # AST 分析工具
|
|
24
|
+
│ │ ├── deobfuscator.js # 反混淆工具
|
|
25
|
+
│ │ └── ...
|
|
26
|
+
│ ├── subagents/ # 子代理定义
|
|
27
|
+
│ │ ├── index.js # 子代理导出
|
|
28
|
+
│ │ ├── static.js # 静态分析子代理
|
|
29
|
+
│ │ ├── dynamic.js # 动态分析子代理
|
|
30
|
+
│ │ └── sandbox.js # 沙箱执行子代理
|
|
31
|
+
│ ├── skills/ # Agent Skills(领域知识)
|
|
32
|
+
│ │ ├── config.js # Skills 配置
|
|
33
|
+
│ │ ├── static-analysis/ # 静态分析经验
|
|
34
|
+
│ │ ├── dynamic-analysis/ # 动态分析经验
|
|
35
|
+
│ │ ├── env/ # 补环境经验
|
|
36
|
+
│ │ ├── sandbox/ # 沙箱执行经验
|
|
37
|
+
│ │ └── js2python/ # JS转Python经验
|
|
38
|
+
│ ├── middleware/ # Agent 中间件
|
|
39
|
+
│ └── prompts/ # 系统提示词
|
|
40
|
+
├── browser/ # 浏览器运行时
|
|
41
|
+
│ ├── client.js # Patchright 客户端
|
|
42
|
+
│ ├── cdp.js # CDP 会话管理
|
|
43
|
+
│ ├── defaultHooks.js # 默认注入的 Hook
|
|
44
|
+
│ ├── interceptors/ # CDP 拦截器
|
|
45
|
+
│ ├── collectors/ # 数据采集器
|
|
46
|
+
│ ├── hooks/ # Hook 脚本
|
|
47
|
+
│ └── ui/ # 浏览器内 UI(注入脚本)
|
|
48
|
+
├── analyzer/ # 静态分析器
|
|
49
|
+
│ ├── ASTAnalyzer.js # AST 分析
|
|
50
|
+
│ ├── Deobfuscator.js # 反混淆器
|
|
51
|
+
│ └── EncryptionAnalyzer.js # 加密分析
|
|
52
|
+
├── store/ # 数据存储
|
|
53
|
+
│ └── DataStore.js # 文件系统存储
|
|
54
|
+
├── core/ # 核心模块
|
|
55
|
+
│ ├── Sandbox.js # 沙箱执行
|
|
56
|
+
│ └── PatchGenerator.js # 补丁生成
|
|
57
|
+
├── env/ # 环境补丁模块
|
|
58
|
+
│ ├── modules/ # 浏览器环境模拟
|
|
59
|
+
│ │ ├── bom/ # BOM 对象模拟
|
|
60
|
+
│ │ ├── dom/ # DOM 对象模拟
|
|
61
|
+
│ │ └── webapi/ # Web API 模拟
|
|
62
|
+
│ └── *Hook.js # 各类 Hook 实现
|
|
63
|
+
├── config/ # 配置
|
|
64
|
+
│ ├── index.js # 配置入口
|
|
65
|
+
│ ├── paths.js # 路径配置
|
|
66
|
+
│ └── patterns/ # 模式配置
|
|
67
|
+
├── mcp/ # MCP 服务
|
|
68
|
+
│ └── server.js # MCP 服务器
|
|
69
|
+
└── index.js # 主入口
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Module Organization
|
|
75
|
+
|
|
76
|
+
### 新功能开发指南
|
|
77
|
+
|
|
78
|
+
1. **新增工具**: 在 `src/agent/tools/` 下创建文件,导出工具数组,在 `index.js` 中汇总
|
|
79
|
+
2. **新增子代理**: 在 `src/agent/subagents/` 下创建文件,定义 subagent 对象
|
|
80
|
+
3. **新增 Skill**: 在 `src/agent/skills/` 下创建目录,包含 `SKILL.md` 文件
|
|
81
|
+
4. **新增分析器**: 在 `src/analyzer/` 下创建类文件
|
|
82
|
+
5. **新增 Hook**: 在 `src/browser/hooks/` 或 `src/env/` 下创建
|
|
83
|
+
6. **新增环境模拟**: 在 `src/env/modules/` 对应子目录下创建
|
|
84
|
+
|
|
85
|
+
### 模块依赖关系
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
agent/ ──────> tools/, subagents/, skills/, prompts/
|
|
89
|
+
│
|
|
90
|
+
└──────────> browser/, analyzer/, store/, core/
|
|
91
|
+
│
|
|
92
|
+
browser/ ─────> interceptors/, collectors/, hooks/, ui/
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Naming Conventions
|
|
98
|
+
|
|
99
|
+
### 文件命名
|
|
100
|
+
|
|
101
|
+
| 类型 | 命名规则 | 示例 |
|
|
102
|
+
|------|----------|------|
|
|
103
|
+
| 工具文件 | 小写,描述功能 | `analyzer.js`, `deobfuscator.js` |
|
|
104
|
+
| 类文件 | PascalCase | `ASTAnalyzer.js`, `DataStore.js` |
|
|
105
|
+
| Hook 文件 | *Hook.js | `CryptoHook.js`, `NetworkHook.js` |
|
|
106
|
+
| 索引文件 | index.js | `index.js` |
|
|
107
|
+
|
|
108
|
+
### 导出命名
|
|
109
|
+
|
|
110
|
+
| 类型 | 命名规则 | 示例 |
|
|
111
|
+
|------|----------|------|
|
|
112
|
+
| 工具数组 | *Tools | `analyzerTools`, `deobfuscatorTools` |
|
|
113
|
+
| 单个工具 | camelCase 动词 | `analyzeAst`, `deobfuscate` |
|
|
114
|
+
| 子代理 | *Subagent | `staticSubagent`, `dynamicSubagent` |
|
|
115
|
+
| 类 | PascalCase | `ASTAnalyzer`, `DataStore` |
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## Examples
|
|
120
|
+
|
|
121
|
+
### 良好组织的模块示例
|
|
122
|
+
|
|
123
|
+
- **工具模块**: `src/agent/tools/analyzer.js` - 清晰的工具定义和导出
|
|
124
|
+
- **子代理模块**: `src/agent/subagents/static.js` - 完整的子代理配置
|
|
125
|
+
- **分析器模块**: `src/analyzer/ASTAnalyzer.js` - 类的组织和方法划分
|
|
126
|
+
- **存储模块**: `src/store/DataStore.js` - 单例模式和完整的 CRUD 操作
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 主 Agent 创建示例
|
|
3
|
+
*/
|
|
4
|
+
import { createDeepAgent, FilesystemBackend } from 'deepagents';
|
|
5
|
+
import { ChatOpenAI } from '@langchain/openai';
|
|
6
|
+
import { MemorySaver } from '@langchain/langgraph';
|
|
7
|
+
|
|
8
|
+
export function createAgent(options = {}) {
|
|
9
|
+
const { model, tools, subagents, systemPrompt } = options;
|
|
10
|
+
|
|
11
|
+
return createDeepAgent({
|
|
12
|
+
name: 'my-agent',
|
|
13
|
+
model: new ChatOpenAI({ model }),
|
|
14
|
+
tools,
|
|
15
|
+
subagents,
|
|
16
|
+
systemPrompt,
|
|
17
|
+
backend: new FilesystemBackend({ rootDir: './agent-data' }),
|
|
18
|
+
checkpointer: new MemorySaver(),
|
|
19
|
+
});
|
|
20
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skills 配置示例
|
|
3
|
+
*/
|
|
4
|
+
import { FilesystemBackend } from 'deepagents';
|
|
5
|
+
|
|
6
|
+
export const skillsBackend = new FilesystemBackend({ rootDir: '/' });
|
|
7
|
+
|
|
8
|
+
const BASE_DIR = new URL('.', import.meta.url).pathname;
|
|
9
|
+
|
|
10
|
+
export const SKILLS = {
|
|
11
|
+
static: `${BASE_DIR}static-analysis`,
|
|
12
|
+
dynamic: `${BASE_DIR}dynamic-analysis`,
|
|
13
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 子代理定义示例
|
|
3
|
+
*/
|
|
4
|
+
import { createSkillsMiddleware } from 'deepagents';
|
|
5
|
+
import { SKILLS, skillsBackend } from '../skills/config.js';
|
|
6
|
+
import { myTools } from '../tools/my-tools.js';
|
|
7
|
+
|
|
8
|
+
export const mySubagent = {
|
|
9
|
+
name: 'my-agent',
|
|
10
|
+
description: '专家描述。触发场景。',
|
|
11
|
+
systemPrompt: `你是专家...`,
|
|
12
|
+
tools: [...myTools],
|
|
13
|
+
middleware: [
|
|
14
|
+
createSkillsMiddleware({
|
|
15
|
+
backend: skillsBackend,
|
|
16
|
+
sources: [SKILLS.mySkill],
|
|
17
|
+
}),
|
|
18
|
+
],
|
|
19
|
+
};
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
# Hook Guidelines
|
|
2
|
+
|
|
3
|
+
> 浏览器 Hook 注入规范
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
DeepSpider 使用 Hook 拦截浏览器 API 来采集加密调用、网络请求等数据。
|
|
10
|
+
Hook 脚本通过 CDP 注入到页面中执行。
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Hook Types
|
|
15
|
+
|
|
16
|
+
| Hook 类型 | 位置 | 用途 |
|
|
17
|
+
|-----------|------|------|
|
|
18
|
+
| CryptoHook | `src/env/CryptoHook.js` | 拦截加密 API |
|
|
19
|
+
| NetworkHook | `src/env/NetworkHook.js` | 拦截网络请求 |
|
|
20
|
+
| Browser Hooks | `src/browser/hooks/` | 浏览器注入脚本 |
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Browser Hook Pattern
|
|
25
|
+
|
|
26
|
+
浏览器注入脚本结构:
|
|
27
|
+
|
|
28
|
+
```javascript
|
|
29
|
+
// src/browser/hooks/crypto.js
|
|
30
|
+
export function getCryptoHookScript() {
|
|
31
|
+
return `
|
|
32
|
+
(function() {
|
|
33
|
+
const original = window.crypto.subtle.digest;
|
|
34
|
+
window.crypto.subtle.digest = async function(...args) {
|
|
35
|
+
console.log('[Hook] crypto.digest:', args);
|
|
36
|
+
return original.apply(this, args);
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
`;
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**示例**: `src/browser/hooks/crypto.js`
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Naming Conventions
|
|
48
|
+
|
|
49
|
+
| 类型 | 命名规则 | 示例 |
|
|
50
|
+
|------|----------|------|
|
|
51
|
+
| Hook 类 | *Hook | `CryptoHook`, `NetworkHook` |
|
|
52
|
+
| 脚本函数 | get*Script | `getCryptoHookScript()` |
|
|
53
|
+
| 全局对象 | __deepspider__* | `__deepspider__`, `__deepspider_send__` |
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Common Mistakes
|
|
58
|
+
|
|
59
|
+
### 1. 未保存原始函数
|
|
60
|
+
|
|
61
|
+
```javascript
|
|
62
|
+
// ❌ 错误:直接覆盖
|
|
63
|
+
window.fetch = function() { ... };
|
|
64
|
+
|
|
65
|
+
// ✅ 正确:保存原始函数
|
|
66
|
+
const originalFetch = window.fetch;
|
|
67
|
+
window.fetch = function(...args) {
|
|
68
|
+
// 记录
|
|
69
|
+
return originalFetch.apply(this, args);
|
|
70
|
+
};
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### 2. Hook 脚本未使用 IIFE
|
|
74
|
+
|
|
75
|
+
```javascript
|
|
76
|
+
// ❌ 错误:污染全局
|
|
77
|
+
const hook = ...;
|
|
78
|
+
|
|
79
|
+
// ✅ 正确:使用 IIFE 隔离
|
|
80
|
+
(function() {
|
|
81
|
+
const hook = ...;
|
|
82
|
+
})();
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### 3. 闭包变量陷阱
|
|
86
|
+
|
|
87
|
+
```javascript
|
|
88
|
+
// ❌ 错误:循环中的闭包
|
|
89
|
+
for (const trap in handler) {
|
|
90
|
+
wrappedHandler[trap] = function() {
|
|
91
|
+
console.log(trap); // trap 始终是最后一个值
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// ✅ 正确:使用函数工厂
|
|
96
|
+
function wrapTrap(trapName, fn) {
|
|
97
|
+
return function() {
|
|
98
|
+
console.log(trapName);
|
|
99
|
+
return fn.apply(this, arguments);
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
for (const trap in handler) {
|
|
103
|
+
wrappedHandler[trap] = wrapTrap(trap, handler[trap]);
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Anti-Detection Patterns
|
|
110
|
+
|
|
111
|
+
Hook 容易被网站检测,必须做好伪装。
|
|
112
|
+
|
|
113
|
+
### 1. toString 伪装(必须)
|
|
114
|
+
|
|
115
|
+
```javascript
|
|
116
|
+
const originalToString = Function.prototype.toString;
|
|
117
|
+
const hookedFns = new WeakMap();
|
|
118
|
+
|
|
119
|
+
// 包装函数
|
|
120
|
+
function native(hookFunc, originalFunc) {
|
|
121
|
+
hookedFns.set(hookFunc, originalToString.call(originalFunc));
|
|
122
|
+
return hookFunc;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// 重写 toString
|
|
126
|
+
Function.prototype.toString = function() {
|
|
127
|
+
return hookedFns.has(this)
|
|
128
|
+
? hookedFns.get(this)
|
|
129
|
+
: originalToString.call(this);
|
|
130
|
+
};
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### 2. getOwnPropertyDescriptor 保护
|
|
134
|
+
|
|
135
|
+
```javascript
|
|
136
|
+
// 网站可能检测属性描述符
|
|
137
|
+
const origGetDesc = Object.getOwnPropertyDescriptor;
|
|
138
|
+
Object.getOwnPropertyDescriptor = function(obj, prop) {
|
|
139
|
+
const desc = origGetDesc.call(Object, obj, prop);
|
|
140
|
+
if (desc && hookedFns.has(desc.value)) {
|
|
141
|
+
return { value: desc.value, writable: true, enumerable: false, configurable: true };
|
|
142
|
+
}
|
|
143
|
+
return desc;
|
|
144
|
+
};
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### 3. 隐藏内部属性
|
|
148
|
+
|
|
149
|
+
```javascript
|
|
150
|
+
// 隐藏 __deepspider__ 等内部属性
|
|
151
|
+
const hiddenProps = ['__deepspider__'];
|
|
152
|
+
const origKeys = Object.keys;
|
|
153
|
+
Object.keys = function(obj) {
|
|
154
|
+
const keys = origKeys.call(Object, obj);
|
|
155
|
+
return obj === window ? keys.filter(k => !hiddenProps.includes(k)) : keys;
|
|
156
|
+
};
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## Dynamic Hook Management
|
|
162
|
+
|
|
163
|
+
Hook 应支持运行时动态启用/禁用。
|
|
164
|
+
|
|
165
|
+
### 架构设计
|
|
166
|
+
|
|
167
|
+
| 类型 | 控制方式 | 用途 |
|
|
168
|
+
|------|----------|------|
|
|
169
|
+
| 内置 Hook | config[name] | xhr, fetch, crypto 等 |
|
|
170
|
+
| 自定义 Hook | hookRegistry | 针对特定网站 |
|
|
171
|
+
|
|
172
|
+
### 性能优化
|
|
173
|
+
|
|
174
|
+
| 配置项 | 默认 | 说明 |
|
|
175
|
+
|--------|------|------|
|
|
176
|
+
| captureStack | true | 关闭可提升性能 |
|
|
177
|
+
| silent | false | 关闭控制台输出 |
|
|
178
|
+
| logLimit | 50 | 每个 API 日志上限 |
|