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.
Files changed (261) hide show
  1. package/.claude/agents/check.md +122 -0
  2. package/.claude/agents/debug.md +106 -0
  3. package/.claude/agents/dispatch.md +214 -0
  4. package/.claude/agents/implement.md +96 -0
  5. package/.claude/agents/plan.md +396 -0
  6. package/.claude/agents/research.md +120 -0
  7. package/.claude/commands/evolve/merge.md +80 -0
  8. package/.claude/commands/trellis/before-backend-dev.md +13 -0
  9. package/.claude/commands/trellis/before-frontend-dev.md +13 -0
  10. package/.claude/commands/trellis/break-loop.md +107 -0
  11. package/.claude/commands/trellis/check-backend.md +13 -0
  12. package/.claude/commands/trellis/check-cross-layer.md +153 -0
  13. package/.claude/commands/trellis/check-frontend.md +13 -0
  14. package/.claude/commands/trellis/create-command.md +154 -0
  15. package/.claude/commands/trellis/finish-work.md +129 -0
  16. package/.claude/commands/trellis/integrate-skill.md +219 -0
  17. package/.claude/commands/trellis/onboard.md +358 -0
  18. package/.claude/commands/trellis/parallel.md +193 -0
  19. package/.claude/commands/trellis/record-session.md +62 -0
  20. package/.claude/commands/trellis/start.md +280 -0
  21. package/.claude/commands/trellis/update-spec.md +213 -0
  22. package/.claude/hooks/inject-subagent-context.py +758 -0
  23. package/.claude/hooks/ralph-loop.py +374 -0
  24. package/.claude/hooks/session-start.py +126 -0
  25. package/.claude/settings.json +41 -0
  26. package/.claude/skills/deepagents-guide/SKILL.md +428 -0
  27. package/.cursor/commands/trellis-before-backend-dev.md +13 -0
  28. package/.cursor/commands/trellis-before-frontend-dev.md +13 -0
  29. package/.cursor/commands/trellis-break-loop.md +107 -0
  30. package/.cursor/commands/trellis-check-backend.md +13 -0
  31. package/.cursor/commands/trellis-check-cross-layer.md +153 -0
  32. package/.cursor/commands/trellis-check-frontend.md +13 -0
  33. package/.cursor/commands/trellis-create-command.md +154 -0
  34. package/.cursor/commands/trellis-finish-work.md +129 -0
  35. package/.cursor/commands/trellis-integrate-skill.md +219 -0
  36. package/.cursor/commands/trellis-onboard.md +358 -0
  37. package/.cursor/commands/trellis-record-session.md +62 -0
  38. package/.cursor/commands/trellis-start.md +156 -0
  39. package/.cursor/commands/trellis-update-spec.md +213 -0
  40. package/.env.example +11 -0
  41. package/.husky/pre-commit +1 -0
  42. package/.mcp.json +8 -0
  43. package/.trellis/.template-hashes.json +65 -0
  44. package/.trellis/.version +1 -0
  45. package/.trellis/scripts/add-session.sh +384 -0
  46. package/.trellis/scripts/common/developer.sh +129 -0
  47. package/.trellis/scripts/common/git-context.sh +263 -0
  48. package/.trellis/scripts/common/paths.sh +208 -0
  49. package/.trellis/scripts/common/phase.sh +150 -0
  50. package/.trellis/scripts/common/registry.sh +247 -0
  51. package/.trellis/scripts/common/task-queue.sh +142 -0
  52. package/.trellis/scripts/common/task-utils.sh +151 -0
  53. package/.trellis/scripts/common/worktree.sh +128 -0
  54. package/.trellis/scripts/create-bootstrap.sh +299 -0
  55. package/.trellis/scripts/get-context.sh +7 -0
  56. package/.trellis/scripts/get-developer.sh +15 -0
  57. package/.trellis/scripts/init-developer.sh +34 -0
  58. package/.trellis/scripts/multi-agent/cleanup.sh +396 -0
  59. package/.trellis/scripts/multi-agent/create-pr.sh +241 -0
  60. package/.trellis/scripts/multi-agent/plan.sh +207 -0
  61. package/.trellis/scripts/multi-agent/start.sh +310 -0
  62. package/.trellis/scripts/multi-agent/status.sh +828 -0
  63. package/.trellis/scripts/task.sh +1118 -0
  64. package/.trellis/spec/backend/deepagents-guide.md +337 -0
  65. package/.trellis/spec/backend/directory-structure.md +126 -0
  66. package/.trellis/spec/backend/examples/skills/deepagents-guide/README.md +11 -0
  67. package/.trellis/spec/backend/examples/skills/deepagents-guide/agent.js.template +20 -0
  68. package/.trellis/spec/backend/examples/skills/deepagents-guide/skills-config.js.template +13 -0
  69. package/.trellis/spec/backend/examples/skills/deepagents-guide/subagent.js.template +19 -0
  70. package/.trellis/spec/backend/hook-guidelines.md +178 -0
  71. package/.trellis/spec/backend/index.md +36 -0
  72. package/.trellis/spec/backend/quality-guidelines.md +201 -0
  73. package/.trellis/spec/backend/state-management.md +76 -0
  74. package/.trellis/spec/backend/tool-guidelines.md +144 -0
  75. package/.trellis/spec/backend/type-safety.md +71 -0
  76. package/.trellis/spec/guides/code-reuse-thinking-guide.md +92 -0
  77. package/.trellis/spec/guides/cross-layer-thinking-guide.md +94 -0
  78. package/.trellis/spec/guides/index.md +79 -0
  79. package/.trellis/tasks/archive/02-02-evolving-skills/prd.md +61 -0
  80. package/.trellis/tasks/archive/02-02-evolving-skills/task.json +29 -0
  81. package/.trellis/tasks/archive/2026-02/00-bootstrap-guidelines/prd.md +86 -0
  82. package/.trellis/tasks/archive/2026-02/00-bootstrap-guidelines/task.json +27 -0
  83. package/.trellis/tasks/archive/2026-02/02-02-skills-system/check.jsonl +3 -0
  84. package/.trellis/tasks/archive/2026-02/02-02-skills-system/debug.jsonl +2 -0
  85. package/.trellis/tasks/archive/2026-02/02-02-skills-system/implement.jsonl +5 -0
  86. package/.trellis/tasks/archive/2026-02/02-02-skills-system/prd.md +33 -0
  87. package/.trellis/tasks/archive/2026-02/02-02-skills-system/task.json +41 -0
  88. package/.trellis/workflow.md +407 -0
  89. package/.trellis/workspace/index.md +123 -0
  90. package/.trellis/workspace/pony/index.md +40 -0
  91. package/.trellis/workspace/pony/journal-1.md +7 -0
  92. package/.trellis/worktree.yaml +47 -0
  93. package/AGENTS.md +18 -0
  94. package/CLAUDE.md +292 -0
  95. package/README.md +134 -0
  96. package/agents/deepspider.md +142 -0
  97. package/docs/DEBUG.md +42 -0
  98. package/docs/GUIDE.md +334 -0
  99. package/docs/PROMPT.md +60 -0
  100. package/docs/USAGE.md +226 -0
  101. package/eslint.config.js +51 -0
  102. package/package.json +78 -0
  103. package/requirements-crypto.txt +14 -0
  104. package/src/agent/index.js +97 -0
  105. package/src/agent/logger.js +164 -0
  106. package/src/agent/middleware/filterTools.js +64 -0
  107. package/src/agent/middleware/report.js +79 -0
  108. package/src/agent/prompts/system.js +315 -0
  109. package/src/agent/run.js +575 -0
  110. package/src/agent/skills/anti-detect/SKILL.md +28 -0
  111. package/src/agent/skills/anti-detect/evolved.md +12 -0
  112. package/src/agent/skills/captcha/SKILL.md +37 -0
  113. package/src/agent/skills/captcha/evolved.md +12 -0
  114. package/src/agent/skills/config.js +30 -0
  115. package/src/agent/skills/crawler/SKILL.md +9 -0
  116. package/src/agent/skills/crawler/evolved.md +16 -0
  117. package/src/agent/skills/dynamic-analysis/SKILL.md +91 -0
  118. package/src/agent/skills/dynamic-analysis/evolved.md +12 -0
  119. package/src/agent/skills/env/SKILL.md +72 -0
  120. package/src/agent/skills/env/evolved.md +12 -0
  121. package/src/agent/skills/evolve.js +79 -0
  122. package/src/agent/skills/general/SKILL.md +12 -0
  123. package/src/agent/skills/general/evolved.md +12 -0
  124. package/src/agent/skills/js2python/SKILL.md +30 -0
  125. package/src/agent/skills/js2python/evolved.md +13 -0
  126. package/src/agent/skills/report/SKILL.md +21 -0
  127. package/src/agent/skills/report/evolved.md +12 -0
  128. package/src/agent/skills/sandbox/SKILL.md +22 -0
  129. package/src/agent/skills/sandbox/evolved.md +16 -0
  130. package/src/agent/skills/static-analysis/SKILL.md +93 -0
  131. package/src/agent/skills/static-analysis/evolved.md +12 -0
  132. package/src/agent/skills/xpath/SKILL.md +119 -0
  133. package/src/agent/subagents/anti-detect.js +45 -0
  134. package/src/agent/subagents/captcha.js +51 -0
  135. package/src/agent/subagents/crawler.js +138 -0
  136. package/src/agent/subagents/dynamic.js +64 -0
  137. package/src/agent/subagents/env-agent.js +82 -0
  138. package/src/agent/subagents/index.js +37 -0
  139. package/src/agent/subagents/js2python.js +72 -0
  140. package/src/agent/subagents/sandbox.js +55 -0
  141. package/src/agent/subagents/static.js +66 -0
  142. package/src/agent/tools/analysis.js +135 -0
  143. package/src/agent/tools/analyzer.js +85 -0
  144. package/src/agent/tools/anti-detect.js +89 -0
  145. package/src/agent/tools/antidebug.js +64 -0
  146. package/src/agent/tools/async.js +43 -0
  147. package/src/agent/tools/browser.js +324 -0
  148. package/src/agent/tools/captcha.js +223 -0
  149. package/src/agent/tools/capture.js +179 -0
  150. package/src/agent/tools/correlate.js +303 -0
  151. package/src/agent/tools/crawler.js +116 -0
  152. package/src/agent/tools/cryptohook.js +80 -0
  153. package/src/agent/tools/debug.js +246 -0
  154. package/src/agent/tools/deobfuscator.js +90 -0
  155. package/src/agent/tools/env.js +83 -0
  156. package/src/agent/tools/envdump.js +92 -0
  157. package/src/agent/tools/evolve.js +164 -0
  158. package/src/agent/tools/extract.js +114 -0
  159. package/src/agent/tools/extractor.js +54 -0
  160. package/src/agent/tools/file.js +224 -0
  161. package/src/agent/tools/hook.js +84 -0
  162. package/src/agent/tools/hookManager.js +178 -0
  163. package/src/agent/tools/index.js +137 -0
  164. package/src/agent/tools/nodejs.js +101 -0
  165. package/src/agent/tools/patch.js +46 -0
  166. package/src/agent/tools/preprocess.js +71 -0
  167. package/src/agent/tools/profile.js +122 -0
  168. package/src/agent/tools/python.js +627 -0
  169. package/src/agent/tools/report.js +124 -0
  170. package/src/agent/tools/runtime.js +132 -0
  171. package/src/agent/tools/sandbox.js +79 -0
  172. package/src/agent/tools/store.js +73 -0
  173. package/src/agent/tools/trace.js +74 -0
  174. package/src/agent/tools/tracing.js +201 -0
  175. package/src/agent/tools/utils.js +51 -0
  176. package/src/agent/tools/verify.js +184 -0
  177. package/src/agent/tools/webcrack.js +109 -0
  178. package/src/analyzer/ASTAnalyzer.js +387 -0
  179. package/src/analyzer/CallStackAnalyzer.js +379 -0
  180. package/src/analyzer/Deobfuscator.js +289 -0
  181. package/src/analyzer/EncryptionAnalyzer.js +99 -0
  182. package/src/analyzer/index.js +22 -0
  183. package/src/browser/EnvBridge.js +186 -0
  184. package/src/browser/cdp.js +168 -0
  185. package/src/browser/client.js +197 -0
  186. package/src/browser/collector.js +444 -0
  187. package/src/browser/collectors/RequestCryptoLinker.js +109 -0
  188. package/src/browser/collectors/ResponseSearcher.js +107 -0
  189. package/src/browser/collectors/ScriptCollector.js +158 -0
  190. package/src/browser/collectors/index.js +26 -0
  191. package/src/browser/defaultHooks.js +932 -0
  192. package/src/browser/hooks/crypto.js +55 -0
  193. package/src/browser/hooks/index.js +64 -0
  194. package/src/browser/hooks/native.js +9 -0
  195. package/src/browser/hooks/network.js +33 -0
  196. package/src/browser/index.js +42 -0
  197. package/src/browser/interceptors/NetworkInterceptor.js +116 -0
  198. package/src/browser/interceptors/ScriptInterceptor.js +76 -0
  199. package/src/browser/interceptors/index.js +6 -0
  200. package/src/browser/ui/analysisPanel.js +1782 -0
  201. package/src/browser/ui/confirmDialog.js +158 -0
  202. package/src/browser/ui/panel.html +152 -0
  203. package/src/browser/ui/selector.js +170 -0
  204. package/src/config/index.js +5 -0
  205. package/src/config/paths.js +71 -0
  206. package/src/config/patterns/crypto.js +36 -0
  207. package/src/config/profiles/chrome.json +71 -0
  208. package/src/config/profiles/firefox.json +44 -0
  209. package/src/config/profiles/safari.json +38 -0
  210. package/src/core/EnvMonitor.js +200 -0
  211. package/src/core/PatchGenerator.js +278 -0
  212. package/src/core/Sandbox.js +181 -0
  213. package/src/env/AntiAntiDebug.js +111 -0
  214. package/src/env/AsyncHook.js +68 -0
  215. package/src/env/BrowserAPIList.js +265 -0
  216. package/src/env/CookieHook.js +48 -0
  217. package/src/env/CryptoHook.js +205 -0
  218. package/src/env/EnvCodeGenerator.js +157 -0
  219. package/src/env/EnvDumper.js +356 -0
  220. package/src/env/EnvExtractor.js +220 -0
  221. package/src/env/HookBase.js +618 -0
  222. package/src/env/NetworkHook.js +159 -0
  223. package/src/env/modules/bom/history.js +29 -0
  224. package/src/env/modules/bom/location.js +26 -0
  225. package/src/env/modules/bom/navigator.js +70 -0
  226. package/src/env/modules/bom/screen.js +26 -0
  227. package/src/env/modules/bom/storage.js +23 -0
  228. package/src/env/modules/dom/document.js +110 -0
  229. package/src/env/modules/dom/event.js +51 -0
  230. package/src/env/modules/index.js +34 -0
  231. package/src/env/modules/webapi/fetch.js +46 -0
  232. package/src/env/modules/webapi/url.js +47 -0
  233. package/src/env/modules/webapi/xhr.js +48 -0
  234. package/src/index.js +27 -0
  235. package/src/mcp/server.js +89 -0
  236. package/src/store/DataStore.js +708 -0
  237. package/src/store/Store.js +158 -0
  238. package/src/store/Validator.js +24 -0
  239. package/test/analyze.test.js +90 -0
  240. package/test/envdump.test.js +74 -0
  241. package/test/flow.test.js +90 -0
  242. package/test/hooks.test.js +138 -0
  243. package/test/plugin.test.js +35 -0
  244. package/test/refactor-full.test.js +30 -0
  245. package/test/refactor.test.js +21 -0
  246. package/test/samples/obfuscated.js +61 -0
  247. package/test/samples/original.js +66 -0
  248. package/test/samples/v10_eval_chain.js +52 -0
  249. package/test/samples/v11_bytecode_vm.js +81 -0
  250. package/test/samples/v12_polymorphic.js +69 -0
  251. package/test/samples/v1_ob_basic.js +98 -0
  252. package/test/samples/v2_ob_advanced.js +99 -0
  253. package/test/samples/v3_jjencode.js +77 -0
  254. package/test/samples/v4_aaencode.js +73 -0
  255. package/test/samples/v5_control_flow.js +86 -0
  256. package/test/samples/v6_string_encryption.js +71 -0
  257. package/test/samples/v7_jsvmp.js +83 -0
  258. package/test/samples/v8_anti_debug.js +79 -0
  259. package/test/samples/v9_proxy_trap.js +49 -0
  260. package/test/samples.test.js +96 -0
  261. package/test/webcrack.test.js +55 -0
@@ -0,0 +1,246 @@
1
+ /**
2
+ * DeepSpider - CDP 调试工具
3
+ */
4
+
5
+ import { z } from 'zod';
6
+ import { tool } from '@langchain/core/tools';
7
+ import { getBrowser } from '../../browser/index.js';
8
+ import { CDPSession } from '../../browser/cdp.js';
9
+
10
+ let cdpSession = null;
11
+ let isPaused = false;
12
+ let currentCallFrames = [];
13
+
14
+ /**
15
+ * 获取 CDP 会话
16
+ */
17
+ async function getSession() {
18
+ if (!cdpSession) {
19
+ const browser = await getBrowser();
20
+ cdpSession = await CDPSession.fromBrowser(browser);
21
+
22
+ // 监听暂停事件
23
+ cdpSession.on('Debugger.paused', (params) => {
24
+ isPaused = true;
25
+ currentCallFrames = params.callFrames || [];
26
+ console.log('[debug] Debugger paused, callFrames:', currentCallFrames.length);
27
+ });
28
+
29
+ // 监听恢复事件
30
+ cdpSession.on('Debugger.resumed', () => {
31
+ isPaused = false;
32
+ currentCallFrames = [];
33
+ console.log('[debug] Debugger resumed');
34
+ });
35
+ }
36
+ return cdpSession;
37
+ }
38
+
39
+ /**
40
+ * 检查是否处于暂停状态
41
+ */
42
+ function checkPaused() {
43
+ if (!isPaused || currentCallFrames.length === 0) {
44
+ return { success: false, error: '调试器未处于暂停状态,请先设置断点并触发断点' };
45
+ }
46
+ return null;
47
+ }
48
+
49
+ /**
50
+ * 设置断点
51
+ */
52
+ export const setBreakpoint = tool(
53
+ async ({ url, line, column }) => {
54
+ const session = await getSession();
55
+ const result = await session.setBreakpoint(url, line, column);
56
+ return JSON.stringify({ success: true, breakpointId: result.breakpointId });
57
+ },
58
+ {
59
+ name: 'set_breakpoint',
60
+ description: '在指定位置设置断点',
61
+ schema: z.object({
62
+ url: z.string().describe('脚本 URL'),
63
+ line: z.number().describe('行号'),
64
+ column: z.number().default(0).describe('列号'),
65
+ }),
66
+ }
67
+ );
68
+
69
+ /**
70
+ * 设置 XHR 断点
71
+ */
72
+ export const setXHRBreakpoint = tool(
73
+ async ({ urlPattern }) => {
74
+ const session = await getSession();
75
+ await session.setXHRBreakpoint(urlPattern);
76
+ return JSON.stringify({ success: true });
77
+ },
78
+ {
79
+ name: 'set_xhr_breakpoint',
80
+ description: '设置 XHR 请求断点',
81
+ schema: z.object({
82
+ urlPattern: z.string().default('').describe('URL 匹配模式'),
83
+ }),
84
+ }
85
+ );
86
+
87
+ /**
88
+ * 获取当前调用栈
89
+ */
90
+ export const getCallStack = tool(
91
+ async () => {
92
+ await getSession(); // 确保事件监听已注册
93
+
94
+ const pauseError = checkPaused();
95
+ if (pauseError) {
96
+ return JSON.stringify(pauseError);
97
+ }
98
+
99
+ const stack = currentCallFrames.map((frame, i) => ({
100
+ index: i,
101
+ callFrameId: frame.callFrameId,
102
+ functionName: frame.functionName || '(anonymous)',
103
+ url: frame.url,
104
+ line: frame.location.lineNumber,
105
+ column: frame.location.columnNumber,
106
+ }));
107
+
108
+ return JSON.stringify({ success: true, stack }, null, 2);
109
+ },
110
+ {
111
+ name: 'get_call_stack',
112
+ description: '获取当前断点处的调用栈(需要先触发断点)',
113
+ schema: z.object({}),
114
+ }
115
+ );
116
+
117
+ /**
118
+ * 获取栈帧变量
119
+ */
120
+ export const getFrameVariables = tool(
121
+ async ({ frameIndex }) => {
122
+ const session = await getSession();
123
+
124
+ const pauseError = checkPaused();
125
+ if (pauseError) {
126
+ return JSON.stringify(pauseError);
127
+ }
128
+
129
+ if (frameIndex >= currentCallFrames.length) {
130
+ return JSON.stringify({ success: false, error: `栈帧索引 ${frameIndex} 超出范围,当前共 ${currentCallFrames.length} 个栈帧` });
131
+ }
132
+
133
+ const callFrameId = currentCallFrames[frameIndex].callFrameId;
134
+
135
+ try {
136
+ const { result } = await session.send('Debugger.evaluateOnCallFrame', {
137
+ callFrameId,
138
+ expression: '(function() { var vars = {}; for (var k in this) vars[k] = typeof this[k]; return JSON.stringify(vars); })()',
139
+ returnByValue: true,
140
+ });
141
+
142
+ return JSON.stringify({ success: true, frameIndex, variables: JSON.parse(result.value || '{}') }, null, 2);
143
+ } catch (e) {
144
+ return JSON.stringify({ success: false, error: e.message });
145
+ }
146
+ },
147
+ {
148
+ name: 'get_frame_variables',
149
+ description: '获取指定栈帧的变量列表(需要先触发断点)',
150
+ schema: z.object({
151
+ frameIndex: z.number().default(0).describe('栈帧索引'),
152
+ }),
153
+ }
154
+ );
155
+
156
+ /**
157
+ * 在断点处执行表达式
158
+ */
159
+ export const evaluateAtBreakpoint = tool(
160
+ async ({ expression, frameIndex }) => {
161
+ const session = await getSession();
162
+
163
+ const pauseError = checkPaused();
164
+ if (pauseError) {
165
+ return JSON.stringify(pauseError);
166
+ }
167
+
168
+ if (frameIndex >= currentCallFrames.length) {
169
+ return JSON.stringify({ success: false, error: `栈帧索引 ${frameIndex} 超出范围` });
170
+ }
171
+
172
+ const callFrameId = currentCallFrames[frameIndex].callFrameId;
173
+
174
+ try {
175
+ const { result, exceptionDetails } = await session.send('Debugger.evaluateOnCallFrame', {
176
+ callFrameId,
177
+ expression,
178
+ returnByValue: true,
179
+ });
180
+
181
+ if (exceptionDetails) {
182
+ return JSON.stringify({ success: false, error: exceptionDetails.text || '执行出错' });
183
+ }
184
+
185
+ return JSON.stringify({ success: true, result: result.value }, null, 2);
186
+ } catch (e) {
187
+ return JSON.stringify({ success: false, error: e.message });
188
+ }
189
+ },
190
+ {
191
+ name: 'evaluate_at_breakpoint',
192
+ description: '在断点处执行表达式,获取变量值(需要先触发断点)',
193
+ schema: z.object({
194
+ expression: z.string().describe('要执行的表达式'),
195
+ frameIndex: z.number().default(0).describe('栈帧索引'),
196
+ }),
197
+ }
198
+ );
199
+
200
+ /**
201
+ * 继续执行
202
+ */
203
+ export const resumeExecution = tool(
204
+ async () => {
205
+ const session = await getSession();
206
+ try {
207
+ await session.send('Debugger.resume');
208
+ isPaused = false;
209
+ currentCallFrames = [];
210
+ return JSON.stringify({ success: true });
211
+ } catch (e) {
212
+ return JSON.stringify({ success: false, error: e.message });
213
+ }
214
+ },
215
+ {
216
+ name: 'resume_execution',
217
+ description: '继续执行(从断点恢复)',
218
+ schema: z.object({}),
219
+ }
220
+ );
221
+
222
+ /**
223
+ * 单步执行
224
+ */
225
+ export const stepOver = tool(
226
+ async () => {
227
+ const session = await getSession();
228
+ await session.send('Debugger.stepOver');
229
+ return JSON.stringify({ success: true });
230
+ },
231
+ {
232
+ name: 'step_over',
233
+ description: '单步执行(跳过函数调用)',
234
+ schema: z.object({}),
235
+ }
236
+ );
237
+
238
+ export const debugTools = [
239
+ setBreakpoint,
240
+ setXHRBreakpoint,
241
+ getCallStack,
242
+ getFrameVariables,
243
+ evaluateAtBreakpoint,
244
+ resumeExecution,
245
+ stepOver,
246
+ ];
@@ -0,0 +1,90 @@
1
+ /**
2
+ * DeepSpider - 反混淆工具
3
+ */
4
+
5
+ import { z } from 'zod';
6
+ import { tool } from '@langchain/core/tools';
7
+ import { Deobfuscator } from '../../analyzer/Deobfuscator.js';
8
+
9
+ /**
10
+ * 反混淆工具
11
+ */
12
+ export const deobfuscate = tool(
13
+ async ({ code, type }) => {
14
+ const deob = new Deobfuscator();
15
+ return JSON.stringify(deob.deobfuscate(code, type), null, 2);
16
+ },
17
+ {
18
+ name: 'deobfuscate',
19
+ description: '反混淆代码,还原可读性。支持 eval、string-array、hex-string 等类型。',
20
+ schema: z.object({
21
+ code: z.string().describe('混淆代码'),
22
+ type: z.enum(['auto', 'eval', 'string-array', 'hex-string', 'unicode'])
23
+ .optional().default('auto'),
24
+ }),
25
+ }
26
+ );
27
+
28
+ /**
29
+ * 反混淆流水线
30
+ */
31
+ export const deobfuscatePipeline = tool(
32
+ async ({ code, steps }) => {
33
+ const deob = new Deobfuscator();
34
+ return JSON.stringify(deob.runPipeline(code, steps), null, 2);
35
+ },
36
+ {
37
+ name: 'deobfuscate_pipeline',
38
+ description: '执行反混淆流水线,按步骤还原代码。',
39
+ schema: z.object({
40
+ code: z.string().describe('混淆代码'),
41
+ steps: z.array(z.string()).optional().describe(
42
+ '执行步骤: unicode, hex-string, base64, string-array, control-flow, deadcode, simplify, rename'
43
+ ),
44
+ }),
45
+ }
46
+ );
47
+
48
+ /**
49
+ * 混淆器识别
50
+ */
51
+ export const detectObfuscator = tool(
52
+ async ({ code }) => {
53
+ const deob = new Deobfuscator();
54
+ return JSON.stringify({
55
+ obfuscator: deob.detectObfuscator(code),
56
+ type: deob._detectType(code),
57
+ });
58
+ },
59
+ {
60
+ name: 'detect_obfuscator',
61
+ description: '识别代码使用的混淆器类型(obfuscator.io、sojson、jshaman等)。',
62
+ schema: z.object({
63
+ code: z.string().describe('JS代码'),
64
+ }),
65
+ }
66
+ );
67
+
68
+ /**
69
+ * 字符串解码
70
+ */
71
+ export const decodeStrings = tool(
72
+ async ({ code }) => {
73
+ const deob = new Deobfuscator();
74
+ return JSON.stringify(deob.decodeStrings(code), null, 2);
75
+ },
76
+ {
77
+ name: 'decode_strings',
78
+ description: '解码代码中的加密字符串(hex、unicode、base64)。',
79
+ schema: z.object({
80
+ code: z.string().describe('JS代码'),
81
+ }),
82
+ }
83
+ );
84
+
85
+ export const deobfuscatorTools = [
86
+ deobfuscate,
87
+ deobfuscatePipeline,
88
+ detectObfuscator,
89
+ decodeStrings,
90
+ ];
@@ -0,0 +1,83 @@
1
+ /**
2
+ * DeepSpider - 环境加载工具
3
+ * 提供预置浏览器环境模块的加载能力
4
+ */
5
+
6
+ import { z } from 'zod';
7
+ import { tool } from '@langchain/core/tools';
8
+ import { modules, loadOrder } from '../../env/modules/index.js';
9
+
10
+ /**
11
+ * 列出可用环境模块
12
+ */
13
+ export const listEnvModules = tool(
14
+ async () => {
15
+ return JSON.stringify({
16
+ modules: Object.keys(modules),
17
+ loadOrder,
18
+ description: {
19
+ navigator: '浏览器信息(userAgent, platform, plugins 等)',
20
+ location: 'URL 信息(href, hostname, protocol 等)',
21
+ document: 'DOM 操作(cookie, createElement 等)',
22
+ screen: '屏幕信息(width, height, colorDepth)',
23
+ storage: 'localStorage/sessionStorage',
24
+ history: '浏览历史',
25
+ fetch: 'Fetch API',
26
+ xhr: 'XMLHttpRequest',
27
+ url: 'URL/URLSearchParams',
28
+ event: '事件系统',
29
+ },
30
+ }, null, 2);
31
+ },
32
+ {
33
+ name: 'list_env_modules',
34
+ description: '列出所有可用的预置浏览器环境模块。',
35
+ schema: z.object({}),
36
+ }
37
+ );
38
+
39
+ /**
40
+ * 加载指定环境模块
41
+ */
42
+ export const loadEnvModule = tool(
43
+ async ({ name }) => {
44
+ const code = modules[name];
45
+ if (!code) {
46
+ return JSON.stringify({
47
+ success: false,
48
+ error: `模块 ${name} 不存在`,
49
+ available: Object.keys(modules),
50
+ });
51
+ }
52
+ return JSON.stringify({ success: true, name, code });
53
+ },
54
+ {
55
+ name: 'load_env_module',
56
+ description: '加载指定的预置浏览器环境模块代码。',
57
+ schema: z.object({
58
+ name: z.enum(['navigator', 'location', 'document', 'screen', 'storage', 'history', 'fetch', 'xhr', 'url', 'event'])
59
+ .describe('模块名称'),
60
+ }),
61
+ }
62
+ );
63
+
64
+ /**
65
+ * 加载全部环境模块
66
+ */
67
+ export const loadAllEnvModules = tool(
68
+ async () => {
69
+ const code = loadOrder.map(n => modules[n]).filter(Boolean).join('\n\n');
70
+ return JSON.stringify({
71
+ success: true,
72
+ modules: loadOrder,
73
+ code,
74
+ });
75
+ },
76
+ {
77
+ name: 'load_all_env_modules',
78
+ description: '加载全部预置浏览器环境模块,按正确顺序合并。',
79
+ schema: z.object({}),
80
+ }
81
+ );
82
+
83
+ export const envTools = [listEnvModules, loadEnvModule, loadAllEnvModules];
@@ -0,0 +1,92 @@
1
+ /**
2
+ * DeepSpider - 环境自吐工具
3
+ * 提供环境监控和自吐能力
4
+ */
5
+
6
+ import { z } from 'zod';
7
+ import { tool } from '@langchain/core/tools';
8
+ import { EnvDumper } from '../../env/EnvDumper.js';
9
+
10
+ const dumper = new EnvDumper();
11
+
12
+ /**
13
+ * 生成环境自吐代码
14
+ */
15
+ export const generateEnvDumpCode = tool(
16
+ async ({ targets, enableCallStack, maxValueLength }) => {
17
+ const code = dumper.generateDumpCode({
18
+ targets,
19
+ enableCallStack,
20
+ maxValueLength,
21
+ });
22
+
23
+ return JSON.stringify({
24
+ success: true,
25
+ code,
26
+ description: '环境自吐代码已生成,请在目标代码执行前注入此代码',
27
+ usage: "1. 先注入基础环境 2. 注入此自吐代码 3. 执行目标代码 4. 调用 __deepspider__.getLogs('env') 获取日志",
28
+ }, null, 2);
29
+ },
30
+ {
31
+ name: 'generate_env_dump_code',
32
+ description: '生成环境自吐注入代码。此代码会代理全局对象,记录所有环境访问。',
33
+ schema: z.object({
34
+ targets: z.array(z.string())
35
+ .default(['window', 'document', 'navigator', 'location'])
36
+ .describe('要监控的全局对象列表'),
37
+ enableCallStack: z.boolean()
38
+ .default(false)
39
+ .describe('是否记录调用栈'),
40
+ maxValueLength: z.number()
41
+ .default(70)
42
+ .describe('日志中值的最大长度'),
43
+ }),
44
+ }
45
+ );
46
+
47
+ /**
48
+ * 生成基础环境桩代码
49
+ */
50
+ export const generateBaseEnvCode = tool(
51
+ async () => {
52
+ const code = dumper.generateBaseEnv();
53
+
54
+ return JSON.stringify({
55
+ success: true,
56
+ code,
57
+ description: '基础环境桩代码,提供 window/document/navigator 等基础对象',
58
+ }, null, 2);
59
+ },
60
+ {
61
+ name: 'generate_base_env_code',
62
+ description: '生成基础环境桩代码,在沙箱中创建 window、document、navigator 等基础全局对象。',
63
+ schema: z.object({}),
64
+ }
65
+ );
66
+
67
+ /**
68
+ * 解析环境日志
69
+ */
70
+ export const parseEnvLogs = tool(
71
+ async ({ logsJson }) => {
72
+ const result = dumper.parseEnvLogs(logsJson);
73
+
74
+ return JSON.stringify({
75
+ success: !result.error,
76
+ ...result,
77
+ }, null, 2);
78
+ },
79
+ {
80
+ name: 'parse_env_logs',
81
+ description: '解析环境自吐日志,提取缺失的环境属性和调用记录。',
82
+ schema: z.object({
83
+ logsJson: z.string().describe("__deepspider__.getLogs('env') 返回的 JSON 字符串"),
84
+ }),
85
+ }
86
+ );
87
+
88
+ export const envDumpTools = [
89
+ generateEnvDumpCode,
90
+ generateBaseEnvCode,
91
+ parseEnvLogs,
92
+ ];
@@ -0,0 +1,164 @@
1
+ /**
2
+ * DeepSpider - evolve_skill 工具
3
+ * 让 Agent 可以追加经验到 evolved.md
4
+ */
5
+
6
+ import { z } from 'zod';
7
+ import { tool } from '@langchain/core/tools';
8
+ import fs from 'fs';
9
+ import path from 'path';
10
+ import { parseEvolvedMd, generateEvolvedMd, MERGE_THRESHOLD } from '../skills/evolve.js';
11
+ import { SKILLS } from '../skills/config.js';
12
+
13
+ // Skills 基础目录
14
+ const SKILLS_BASE = new URL('../skills/', import.meta.url).pathname;
15
+
16
+ /**
17
+ * 获取 skill 路径,支持动态创建
18
+ */
19
+ function getSkillPath(skillName) {
20
+ const skillMap = {
21
+ 'static-analysis': SKILLS.static,
22
+ 'dynamic-analysis': SKILLS.dynamic,
23
+ 'sandbox': SKILLS.sandbox,
24
+ 'env': SKILLS.env,
25
+ 'js2python': SKILLS.js2python,
26
+ 'report': SKILLS.report,
27
+ 'general': SKILLS.general,
28
+ };
29
+
30
+ // 检查是否是动态创建
31
+ if (skillName.startsWith('new:')) {
32
+ const newName = skillName.slice(4);
33
+ return { path: path.join(SKILLS_BASE, newName), isNew: true, name: newName };
34
+ }
35
+
36
+ const skillPath = skillMap[skillName];
37
+ return skillPath ? { path: skillPath, isNew: false, name: skillName } : null;
38
+ }
39
+
40
+ /**
41
+ * 创建新 skill 目录和模板文件
42
+ */
43
+ function createNewSkill(skillPath, skillName) {
44
+ // 创建目录
45
+ fs.mkdirSync(skillPath, { recursive: true });
46
+
47
+ // 创建 SKILL.md
48
+ const skillMd = `---
49
+ name: ${skillName}
50
+ description: |
51
+ ${skillName} 相关经验。
52
+ ---
53
+
54
+ # ${skillName}
55
+
56
+ 自动创建的 skill 目录。
57
+ `;
58
+ fs.writeFileSync(path.join(skillPath, 'SKILL.md'), skillMd, 'utf-8');
59
+
60
+ // 创建 evolved.md
61
+ const evolvedMd = `---
62
+ total: 0
63
+ last_merged: null
64
+ ---
65
+
66
+ ## 核心经验
67
+
68
+ <!-- 经过验证的高价值经验 -->
69
+
70
+ ## 近期发现
71
+
72
+ <!-- 最近发现,FIFO 滚动,最多保留 10 条 -->
73
+ `;
74
+ fs.writeFileSync(path.join(skillPath, 'evolved.md'), evolvedMd, 'utf-8');
75
+ }
76
+
77
+ /**
78
+ * evolve_skill 工具
79
+ */
80
+ export const evolveSkill = tool(
81
+ async ({ skill, title, scenario, insight, isCore }) => {
82
+ const skillInfo = getSkillPath(skill);
83
+ if (!skillInfo) {
84
+ return JSON.stringify({
85
+ success: false,
86
+ error: `未知的 skill: ${skill}。可用: static-analysis, dynamic-analysis, sandbox, env, js2python, report, general。或使用 new:<name> 创建新 skill。`
87
+ });
88
+ }
89
+
90
+ const { path: skillPath, isNew, name: skillName } = skillInfo;
91
+
92
+ // 如果是新 skill,先创建目录
93
+ if (isNew) {
94
+ createNewSkill(skillPath, skillName);
95
+ }
96
+
97
+ const evolvedPath = path.join(skillPath, 'evolved.md');
98
+
99
+ // 读取现有内容
100
+ let content = '';
101
+ try {
102
+ content = fs.readFileSync(evolvedPath, 'utf-8');
103
+ } catch (e) {
104
+ // 文件不存在,使用空内容
105
+ }
106
+
107
+ const data = parseEvolvedMd(content);
108
+
109
+ // 生成新条目
110
+ const date = new Date().toISOString().split('T')[0];
111
+ const entry = `### [${date}] ${title}
112
+ **场景**: ${scenario}
113
+ **经验**: ${insight}`;
114
+
115
+ if (isCore) {
116
+ // 追加到核心经验
117
+ data.core = data.core
118
+ ? `${data.core}\n\n${entry}`
119
+ : entry;
120
+ } else {
121
+ // 追加到近期发现
122
+ data.recent.push(entry);
123
+ // 保持最多 10 条
124
+ if (data.recent.length > 10) {
125
+ data.recent = data.recent.slice(-10);
126
+ }
127
+ }
128
+
129
+ data.total += 1;
130
+
131
+ // 写回文件
132
+ const newContent = generateEvolvedMd(data);
133
+ fs.writeFileSync(evolvedPath, newContent, 'utf-8');
134
+
135
+ // 检查阈值
136
+ const needsMerge = data.total >= MERGE_THRESHOLD;
137
+
138
+ return JSON.stringify({
139
+ success: true,
140
+ skill: skillName,
141
+ total: data.total,
142
+ needsMerge,
143
+ isNew,
144
+ message: isNew
145
+ ? `已创建新 skill "${skillName}" 并记录经验。`
146
+ : needsMerge
147
+ ? `经验已记录。动态经验已达 ${data.total} 条,建议执行 /evolve:merge ${skillName}。`
148
+ : `经验已记录到 ${skillName}。`
149
+ });
150
+ },
151
+ {
152
+ name: 'evolve_skill',
153
+ description: '记录分析过程中学到的经验。支持现有 skill 或 new:<name> 创建新 skill',
154
+ schema: z.object({
155
+ skill: z.string().describe('目标 skill: static-analysis, dynamic-analysis, sandbox, env, js2python, report, general,或 new:<name> 创建新 skill'),
156
+ title: z.string().describe('经验标题,简短描述'),
157
+ scenario: z.string().describe('具体场景/案例'),
158
+ insight: z.string().describe('一句话总结经验'),
159
+ isCore: z.boolean().default(false).describe('是否为核心经验'),
160
+ }),
161
+ }
162
+ );
163
+
164
+ export const evolveTools = [evolveSkill];