@lmcc-dev/mult-fetch-mcp-server 1.0.3 → 1.2.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 (136) hide show
  1. package/README.md +11 -9
  2. package/README.zh.md +19 -10
  3. package/dist/i18n-test-report.json +8 -0
  4. package/dist/i18n-unused-keys-report.json +8 -0
  5. package/dist/src/client.js +75 -62
  6. package/dist/src/index.js +0 -0
  7. package/dist/src/lib/BrowserFetcher.js +12 -12
  8. package/dist/src/lib/NodeFetcher.js +165 -106
  9. package/dist/src/lib/fetch.js +40 -0
  10. package/dist/src/lib/fetchers/FetcherFactory.js +43 -0
  11. package/dist/src/lib/fetchers/browser/BrowserFetcher.js +381 -0
  12. package/dist/src/lib/fetchers/browser/BrowserInstance.js +180 -0
  13. package/dist/src/lib/fetchers/browser/PageOperations.js +168 -0
  14. package/dist/src/lib/fetchers/common/types.js +41 -0
  15. package/dist/src/lib/fetchers/common/utils.js +141 -0
  16. package/dist/src/lib/fetchers/index.js +62 -0
  17. package/dist/src/lib/fetchers/node/HttpClient.js +239 -0
  18. package/dist/src/lib/fetchers/node/NodeFetcher.js +180 -0
  19. package/dist/src/lib/i18n/index.js +105 -17
  20. package/dist/src/lib/i18n/keys/base.js +41 -0
  21. package/dist/src/lib/i18n/keys/browser.js +91 -0
  22. package/dist/src/lib/i18n/keys/client.js +68 -0
  23. package/dist/src/lib/i18n/keys/errors.js +49 -0
  24. package/dist/src/lib/i18n/keys/factory.js +46 -0
  25. package/dist/src/lib/i18n/keys/fetcher.js +87 -0
  26. package/dist/src/lib/i18n/keys/index.js +16 -0
  27. package/dist/src/lib/i18n/keys/node.js +69 -0
  28. package/dist/src/lib/i18n/keys/prompts.js +79 -0
  29. package/dist/src/lib/i18n/keys/resources.js +53 -0
  30. package/dist/src/lib/i18n/keys/server.js +67 -0
  31. package/dist/src/lib/i18n/keys/tools.js +39 -0
  32. package/dist/src/lib/i18n/keys.js +504 -0
  33. package/dist/src/lib/i18n/locales/en/browser.js +79 -55
  34. package/dist/src/lib/i18n/locales/en/client.js +57 -33
  35. package/dist/src/lib/i18n/locales/en/errors.js +36 -12
  36. package/dist/src/lib/i18n/locales/en/factory.js +38 -0
  37. package/dist/src/lib/i18n/locales/en/fetcher.js +67 -60
  38. package/dist/src/lib/i18n/locales/en/index.js +9 -7
  39. package/dist/src/lib/i18n/locales/en/node.js +57 -35
  40. package/dist/src/lib/i18n/locales/en/prompts.js +42 -65
  41. package/dist/src/lib/i18n/locales/en/resources.js +52 -40
  42. package/dist/src/lib/i18n/locales/en/server.js +49 -24
  43. package/dist/src/lib/i18n/locales/en/tools.js +27 -19
  44. package/dist/src/lib/i18n/locales/zh/browser.js +79 -56
  45. package/dist/src/lib/i18n/locales/zh/client.js +57 -32
  46. package/dist/src/lib/i18n/locales/zh/errors.js +36 -12
  47. package/dist/src/lib/i18n/locales/zh/factory.js +38 -0
  48. package/dist/src/lib/i18n/locales/zh/fetcher.js +67 -60
  49. package/dist/src/lib/i18n/locales/zh/index.js +9 -7
  50. package/dist/src/lib/i18n/locales/zh/node.js +61 -36
  51. package/dist/src/lib/i18n/locales/zh/prompts.js +35 -57
  52. package/dist/src/lib/i18n/locales/zh/resources.js +51 -39
  53. package/dist/src/lib/i18n/locales/zh/server.js +51 -25
  54. package/dist/src/lib/i18n/locales/zh/tools.js +27 -19
  55. package/dist/src/lib/i18n/logger.js +90 -19
  56. package/dist/src/lib/logger.js +135 -14
  57. package/dist/src/lib/server/browser.js +12 -18
  58. package/dist/src/lib/server/fetcher.js +13 -34
  59. package/dist/src/lib/server/index.js +2 -2
  60. package/dist/src/lib/server/prompts.js +1 -1
  61. package/dist/src/lib/server/resources.js +1 -1
  62. package/dist/src/lib/server/tools.js +404 -308
  63. package/dist/src/lib/utils/ErrorHandler.js +125 -0
  64. package/dist/src/lib/utils/errorDetection.js +41 -0
  65. package/dist/src/lib/utils/errors.js +279 -0
  66. package/dist/src/mcp-server.js +0 -0
  67. package/dist/src/test-i18n.js +139 -0
  68. package/dist/tests/BrowserFetcher.test.js +951 -0
  69. package/dist/tests/NodeFetcher.test.js +263 -0
  70. package/dist/tests/client.test.js +211 -0
  71. package/dist/tests/fetch.test.js +70 -0
  72. package/dist/tests/fetchers/Fetcher.test.js +108 -0
  73. package/dist/tests/fetchers/browser/BrowserFetcher.test.js +195 -0
  74. package/dist/tests/fetchers/browser/BrowserInstance.test.js +163 -0
  75. package/dist/tests/fetchers/node/NodeFetcher.test.js +211 -0
  76. package/dist/tests/i18n-missing-keys.js +364 -0
  77. package/dist/tests/i18n-remove-unused-keys.js +236 -0
  78. package/dist/tests/i18n-test-report.json +2004 -0
  79. package/dist/tests/i18n-unused-keys.js +425 -0
  80. package/dist/tests/i18n.test.js +178 -0
  81. package/dist/tests/logger.test.js +100 -0
  82. package/dist/tests/mcp-server.test.js +113 -0
  83. package/dist/tests/server/browser.test.js +201 -0
  84. package/dist/tests/server/fetcher.test.js +173 -0
  85. package/dist/tests/server/index.test.js +122 -0
  86. package/dist/tests/server/prompts.test.js +246 -0
  87. package/dist/tests/server/resources.test.js +395 -0
  88. package/dist/tests/server/tools.test.js +223 -0
  89. package/dist/tests/setup.js +36 -0
  90. package/dist/tests/src/lib/i18n/index.js +108 -0
  91. package/dist/tests/src/lib/i18n/keys/base.js +47 -0
  92. package/dist/tests/src/lib/i18n/keys/browser.js +93 -0
  93. package/dist/tests/src/lib/i18n/keys/client.js +70 -0
  94. package/dist/tests/src/lib/i18n/keys/errors.js +34 -0
  95. package/dist/tests/src/lib/i18n/keys/fetcher.js +84 -0
  96. package/dist/tests/src/lib/i18n/keys/index.js +31 -0
  97. package/dist/tests/src/lib/i18n/keys/node.js +56 -0
  98. package/dist/tests/src/lib/i18n/keys/prompts.js +82 -0
  99. package/dist/tests/src/lib/i18n/keys/resources.js +50 -0
  100. package/dist/tests/src/lib/i18n/keys/server.js +64 -0
  101. package/dist/tests/src/lib/i18n/keys/tools.js +34 -0
  102. package/dist/tests/src/lib/i18n/locales/en/browser.js +88 -0
  103. package/dist/tests/src/lib/i18n/locales/en/client.js +66 -0
  104. package/dist/tests/src/lib/i18n/locales/en/errors.js +28 -0
  105. package/dist/tests/src/lib/i18n/locales/en/fetcher.js +71 -0
  106. package/dist/tests/src/lib/i18n/locales/en/index.js +29 -0
  107. package/dist/tests/src/lib/i18n/locales/en/node.js +51 -0
  108. package/dist/tests/src/lib/i18n/locales/en/prompts.js +52 -0
  109. package/dist/tests/src/lib/i18n/locales/en/resources.js +50 -0
  110. package/dist/tests/src/lib/i18n/locales/en/server.js +56 -0
  111. package/dist/tests/src/lib/i18n/locales/en/tools.js +28 -0
  112. package/dist/tests/src/lib/i18n/locales/zh/browser.js +87 -0
  113. package/dist/tests/src/lib/i18n/locales/zh/client.js +66 -0
  114. package/dist/tests/src/lib/i18n/locales/zh/errors.js +28 -0
  115. package/dist/tests/src/lib/i18n/locales/zh/fetcher.js +71 -0
  116. package/dist/tests/src/lib/i18n/locales/zh/index.js +29 -0
  117. package/dist/tests/src/lib/i18n/locales/zh/node.js +51 -0
  118. package/dist/tests/src/lib/i18n/locales/zh/prompts.js +53 -0
  119. package/dist/tests/src/lib/i18n/locales/zh/resources.js +50 -0
  120. package/dist/tests/src/lib/i18n/locales/zh/server.js +57 -0
  121. package/dist/tests/src/lib/i18n/locales/zh/tools.js +28 -0
  122. package/dist/tests/src/lib/i18n/logger.js +114 -0
  123. package/dist/tests/src/lib/logger.js +181 -0
  124. package/dist/tests/test-direct-client.js +0 -0
  125. package/dist/tests/test-i18n.js +530 -0
  126. package/dist/tests/test-mcp-methods.js +1 -1
  127. package/dist/tests/test-mcp.js +0 -0
  128. package/dist/tests/test-mini4k.js +0 -0
  129. package/dist/tests/tests/test-i18n.js +588 -0
  130. package/dist/tests/types.test.js +57 -0
  131. package/dist/tests/utils/ErrorHandler.test.js +144 -0
  132. package/dist/vitest.config.js +29 -0
  133. package/package.json +32 -19
  134. package/dist/src/cli-language.js +0 -78
  135. package/dist/src/lib/example.js +0 -93
  136. package/dist/src/lib/server/logger.js +0 -23
@@ -0,0 +1,504 @@
1
+ /*
2
+ * Author: Martin <lmccc.dev@gmail.com>
3
+ * Co-Author: AI Assistant (Claude)
4
+ * Description: This code was collaboratively developed by Martin and AI Assistant.
5
+ */
6
+ /**
7
+ * 创建键名生成器 - 用于生成特定模块的键名 (Create key name generator - for generating key names for specific modules)
8
+ * @param module 模块名称 (Module name)
9
+ * @returns 键名生成函数 (Key name generator function)
10
+ */
11
+ const createKeyGenerator = (module) => (key) => `${module}.${key}`;
12
+ /**
13
+ * 创建资源操作键 - 用于生成资源操作相关的键 (Create resource operation keys - for generating resource operation related keys)
14
+ * @param module 模块名称 (Module name)
15
+ * @param operation 操作名称 (Operation name)
16
+ * @returns 资源操作键对象 (Resource operation keys object)
17
+ */
18
+ const createResourceOperationKeys = (module, operation) => {
19
+ const keyGen = createKeyGenerator(`${module}.${operation}`);
20
+ return {
21
+ request: keyGen('request'),
22
+ success: keyGen('success'),
23
+ error: keyGen('error'),
24
+ notFound: keyGen('notFound'),
25
+ duplicate: keyGen('duplicate')
26
+ };
27
+ };
28
+ /**
29
+ * 创建资源键 - 用于生成资源相关的键 (Create resource keys - for generating resource related keys)
30
+ * @param module 模块名称 (Module name)
31
+ * @returns 资源键对象 (Resource keys object)
32
+ */
33
+ const createResourceKeys = (module) => {
34
+ return {
35
+ list: createResourceOperationKeys(module, 'list'),
36
+ get: createResourceOperationKeys(module, 'get'),
37
+ create: createResourceOperationKeys(module, 'create'),
38
+ update: createResourceOperationKeys(module, 'update'),
39
+ delete: createResourceOperationKeys(module, 'delete')
40
+ };
41
+ };
42
+ /**
43
+ * 获取器相关键 (Fetcher related keys)
44
+ */
45
+ export const FETCHER_KEYS = (() => {
46
+ const keyGen = createKeyGenerator('fetcher');
47
+ return {
48
+ // 延迟相关 (Delay related)
49
+ addingDelay: keyGen('addingDelay'),
50
+ delayCompleted: keyGen('delayCompleted'),
51
+ // 代理相关 (Proxy related)
52
+ usingProxy: keyGen('usingProxy'),
53
+ usingSpecifiedProxy: keyGen('usingSpecifiedProxy'),
54
+ attemptingToUseSystemProxy: keyGen('attemptingToUseSystemProxy'),
55
+ notUsingProxy: keyGen('notUsingProxy'),
56
+ finalProxyUsed: keyGen('finalProxyUsed'),
57
+ noProxy: keyGen('noProxy'),
58
+ usingHttpsProxy: keyGen('usingHttpsProxy'),
59
+ usingHttpProxy: keyGen('usingHttpProxy'),
60
+ // 请求相关 (Request related)
61
+ fetchingUrl: keyGen('fetchingUrl'),
62
+ usingUserAgent: keyGen('usingUserAgent'),
63
+ requestOptions: keyGen('requestOptions'),
64
+ startingFetch: keyGen('startingFetch'),
65
+ fetchCompleted: keyGen('fetchCompleted'),
66
+ // 响应相关 (Response related)
67
+ responseStatus: keyGen('responseStatus'),
68
+ redirectingTo: keyGen('redirectingTo'),
69
+ constructedFullRedirectUrl: keyGen('constructedFullRedirectUrl'),
70
+ requestSuccess: keyGen('requestSuccess'),
71
+ // 错误相关 (Error related)
72
+ errorResponse: keyGen('errorResponse'),
73
+ errorResponseBody: keyGen('errorResponseBody'),
74
+ errorReadingBody: keyGen('errorReadingBody'),
75
+ fetchError: keyGen('fetchError'),
76
+ requestAborted: keyGen('requestAborted'),
77
+ networkError: keyGen('networkError'),
78
+ requestTimeout: keyGen('requestTimeout'),
79
+ fetchFailed: keyGen('fetchFailed'),
80
+ tooManyRedirects: keyGen('tooManyRedirects'),
81
+ // 内容类型相关 (Content type related)
82
+ startingHtmlFetch: keyGen('startingHtmlFetch'),
83
+ readingText: keyGen('readingText'),
84
+ htmlContentLength: keyGen('htmlContentLength'),
85
+ startingJsonFetch: keyGen('startingJsonFetch'),
86
+ parsingJson: keyGen('parsingJson'),
87
+ jsonParsed: keyGen('jsonParsed'),
88
+ jsonParseError: keyGen('jsonParseError'),
89
+ startingTxtFetch: keyGen('startingTxtFetch'),
90
+ textContentLength: keyGen('textContentLength'),
91
+ startingMarkdownFetch: keyGen('startingMarkdownFetch'),
92
+ creatingTurndown: keyGen('creatingTurndown'),
93
+ convertingToMarkdown: keyGen('convertingToMarkdown'),
94
+ markdownContentLength: keyGen('markdownContentLength'),
95
+ // 系统代理相关 (System proxy related)
96
+ checkingProxyEnv: keyGen('checkingProxyEnv'),
97
+ envVarValue: keyGen('envVarValue'),
98
+ foundSystemProxy: keyGen('foundSystemProxy'),
99
+ systemCommandProxySettings: keyGen('systemCommandProxySettings'),
100
+ foundProxyFromCommand: keyGen('foundProxyFromCommand'),
101
+ errorGettingProxyFromCommand: keyGen('errorGettingProxyFromCommand'),
102
+ checkingSystemEnvVars: keyGen('checkingSystemEnvVars'),
103
+ windowsEnvVars: keyGen('windowsEnvVars'),
104
+ foundWindowsEnvProxy: keyGen('foundWindowsEnvProxy'),
105
+ errorGettingWindowsEnvVars: keyGen('errorGettingWindowsEnvVars'),
106
+ unixEnvVars: keyGen('unixEnvVars'),
107
+ foundUnixEnvProxy: keyGen('foundUnixEnvProxy'),
108
+ errorGettingUnixEnvVars: keyGen('errorGettingUnixEnvVars'),
109
+ errorGettingSystemEnvVars: keyGen('errorGettingSystemEnvVars'),
110
+ noSystemProxyFound: keyGen('noSystemProxyFound'),
111
+ // 通用 (General)
112
+ notSet: keyGen('notSet'),
113
+ debug: keyGen('debug'),
114
+ none: keyGen('none')
115
+ };
116
+ })();
117
+ /**
118
+ * 浏览器相关键 (Browser related keys)
119
+ */
120
+ export const BROWSER_KEYS = (() => {
121
+ const keyGen = createKeyGenerator('browser');
122
+ return {
123
+ // 浏览器生命周期 (Browser lifecycle)
124
+ closing: keyGen('closing'),
125
+ closed: keyGen('closed'),
126
+ starting: keyGen('starting'),
127
+ startingFailed: keyGen('startingFailed'),
128
+ alreadyRunning: keyGen('alreadyRunning'),
129
+ // 页面操作 (Page operations)
130
+ creatingPage: keyGen('creatingPage'),
131
+ navigatingTo: keyGen('navigatingTo'),
132
+ waitingForSelector: keyGen('waitingForSelector'),
133
+ waitingForTimeout: keyGen('waitingForTimeout'),
134
+ scrollingToBottom: keyGen('scrollingToBottom'),
135
+ gettingContent: keyGen('gettingContent'),
136
+ contentLength: keyGen('contentLength'),
137
+ // Cookie 相关 (Cookie related)
138
+ savingCookies: keyGen('savingCookies'),
139
+ cookiesSaved: keyGen('cookiesSaved'),
140
+ loadingCookies: keyGen('loadingCookies'),
141
+ cookiesLoaded: keyGen('cookiesLoaded'),
142
+ noCookiesFound: keyGen('noCookiesFound'),
143
+ // 错误相关 (Error related)
144
+ errorLoadingCookies: keyGen('errorLoadingCookies'),
145
+ errorSavingCookies: keyGen('errorSavingCookies'),
146
+ errorNavigating: keyGen('errorNavigating'),
147
+ errorGettingContent: keyGen('errorGettingContent'),
148
+ errorClosingBrowser: keyGen('errorClosingBrowser'),
149
+ errorCreatingPage: keyGen('errorCreatingPage'),
150
+ closingError: keyGen('closingError'),
151
+ // 额外的浏览器相关键 (Additional browser related keys)
152
+ waiting: keyGen('waiting'),
153
+ startupSuccess: keyGen('startupSuccess'),
154
+ navigating: keyGen('navigating'),
155
+ scrolling: keyGen('scrolling'),
156
+ scrollCompleted: keyGen('scrollCompleted'),
157
+ contentTruncated: keyGen('contentTruncated'),
158
+ pageClosed: keyGen('pageClosed'),
159
+ fetchError: keyGen('fetchError'),
160
+ highMemory: keyGen('highMemory'),
161
+ closingDueToMemory: keyGen('closingDueToMemory'),
162
+ forcingGC: keyGen('forcingGC'),
163
+ memoryCheckError: keyGen('memoryCheckError'),
164
+ usingCookies: keyGen('usingCookies'),
165
+ usingProxy: keyGen('usingProxy'),
166
+ // Cloudflare 相关 (Cloudflare related)
167
+ checkingCloudflare: keyGen('checkingCloudflare'),
168
+ cloudflareDetected: keyGen('cloudflareDetected'),
169
+ simulatingHuman: keyGen('simulatingHuman'),
170
+ simulatingHumanError: keyGen('simulatingHumanError'),
171
+ stillOnCloudflare: keyGen('stillOnCloudflare'),
172
+ bypassFailed: keyGen('bypassFailed'),
173
+ cloudflareError: keyGen('cloudflareError'),
174
+ continuingWithoutBypass: keyGen('continuingWithoutBypass'),
175
+ unableToBypassCloudflare: keyGen('unableToBypassCloudflare'),
176
+ // 获取和重试相关 (Fetch and retry related)
177
+ fetchingWithRetry: keyGen('fetchingWithRetry'),
178
+ memoryUsage: keyGen('memoryUsage'),
179
+ memoryTooHigh: keyGen('memoryTooHigh'),
180
+ contentTooLarge: keyGen('contentTooLarge'),
181
+ failedToParseJSON: keyGen('failedToParseJSON'),
182
+ startingBrowserFetchForMarkdown: keyGen('startingBrowserFetchForMarkdown'),
183
+ errorInBrowserFetchForMarkdown: keyGen('errorInBrowserFetchForMarkdown'),
184
+ fetchRequest: keyGen('fetchRequest'),
185
+ usingStoredCookies: keyGen('usingStoredCookies'),
186
+ closingInstance: keyGen('closingInstance'),
187
+ fetchErrorWithAttempt: keyGen('fetchErrorWithAttempt'),
188
+ retryingAfterDelay: keyGen('retryingAfterDelay'),
189
+ // 浏览器启动相关 (Browser startup related)
190
+ browserStartupSuccess: keyGen('browserStartupSuccess'),
191
+ browserStartupFailed: keyGen('browserStartupFailed'),
192
+ usingCustomChromePath: keyGen('usingCustomChromePath'),
193
+ browserDisconnected: keyGen('browserDisconnected'),
194
+ waitingForBrowserStart: keyGen('waitingForBrowserStart'),
195
+ reusingExistingBrowser: keyGen('reusingExistingBrowser'),
196
+ startingBrowser: keyGen('startingBrowser'),
197
+ browserStarted: keyGen('browserStarted'),
198
+ browserStartError: keyGen('browserStartError')
199
+ };
200
+ })();
201
+ /**
202
+ * 资源相关键 (Resources related keys)
203
+ */
204
+ export const RESOURCES_KEYS = (() => {
205
+ const keyGen = createKeyGenerator('resources');
206
+ const resourceKeys = createResourceKeys('resources');
207
+ return {
208
+ ...resourceKeys,
209
+ // 额外的资源相关键 (Additional resource related keys)
210
+ fileReadError: keyGen('fileReadError'),
211
+ invalidUri: keyGen('invalidUri'),
212
+ notFound: keyGen('notFound'),
213
+ // 资源描述 (Resource descriptions)
214
+ readme: {
215
+ description: keyGen('readme.description')
216
+ },
217
+ package: {
218
+ description: keyGen('package.description')
219
+ },
220
+ index: {
221
+ description: keyGen('index.description')
222
+ },
223
+ client: {
224
+ description: keyGen('client.description')
225
+ },
226
+ // 资源模板描述 (Resource template descriptions)
227
+ sourceFile: {
228
+ name: keyGen('sourceFile.name'),
229
+ description: keyGen('sourceFile.description')
230
+ },
231
+ docFile: {
232
+ name: keyGen('docFile.name'),
233
+ description: keyGen('docFile.description')
234
+ },
235
+ filename: {
236
+ description: keyGen('filename.description')
237
+ }
238
+ };
239
+ })();
240
+ /**
241
+ * 服务器相关键 (Server related keys)
242
+ */
243
+ export const SERVER_KEYS = (() => {
244
+ const keyGen = createKeyGenerator('server');
245
+ return {
246
+ // 服务器状态相关 (Server status related)
247
+ starting: keyGen('starting'),
248
+ started: keyGen('started'),
249
+ stopping: keyGen('stopping'),
250
+ stopped: keyGen('stopped'),
251
+ error: keyGen('error'),
252
+ // 连接相关 (Connection related)
253
+ connecting: keyGen('connecting'),
254
+ connected: keyGen('connected'),
255
+ connectionError: keyGen('connectionError'),
256
+ disconnected: keyGen('disconnected'),
257
+ // 请求处理相关 (Request handling related)
258
+ requestReceived: keyGen('requestReceived'),
259
+ requestProcessed: keyGen('requestProcessed'),
260
+ requestError: keyGen('requestError'),
261
+ // 浏览器相关 (Browser related)
262
+ browser: {
263
+ initializing: keyGen('browser.initializing'),
264
+ initialized: keyGen('browser.initialized'),
265
+ error: keyGen('browser.error'),
266
+ closing: keyGen('browser.closing'),
267
+ closed: keyGen('browser.closed')
268
+ },
269
+ // 工具相关 (Tool related)
270
+ tool: {
271
+ requestReceived: keyGen('tool.requestReceived'),
272
+ requestProcessed: keyGen('tool.requestProcessed'),
273
+ requestError: keyGen('tool.requestError')
274
+ },
275
+ // 原有键 (Original keys)
276
+ receivedRequest: keyGen('receivedRequest'),
277
+ processingRequest: keyGen('processingRequest'),
278
+ requestCompleted: keyGen('requestCompleted'),
279
+ requestFailed: keyGen('requestFailed'),
280
+ receivedInterruptSignal: keyGen('receivedInterruptSignal'),
281
+ receivedTerminateSignal: keyGen('receivedTerminateSignal'),
282
+ uncaughtException: keyGen('uncaughtException'),
283
+ debug: keyGen('debug'),
284
+ listeningOn: keyGen('listeningOn'),
285
+ // 新增的翻译键 (New translation keys)
286
+ initializingBrowser: keyGen('initializingBrowser'),
287
+ closingBrowser: keyGen('closingBrowser'),
288
+ receivedToolRequest: keyGen('receivedToolRequest'),
289
+ processingToolRequestError: keyGen('processingToolRequestError'),
290
+ usingBrowserMode: keyGen('usingBrowserMode'),
291
+ usingAutoDetectMode: keyGen('usingAutoDetectMode'),
292
+ switchingToBrowserMode: keyGen('switchingToBrowserMode'),
293
+ fetchError: keyGen('fetchError')
294
+ };
295
+ })();
296
+ /**
297
+ * 客户端相关键 (Client related keys)
298
+ */
299
+ export const CLIENT_KEYS = (() => {
300
+ const keyGen = createKeyGenerator('client');
301
+ return {
302
+ connecting: keyGen('connecting'),
303
+ connected: keyGen('connected'),
304
+ disconnecting: keyGen('disconnecting'),
305
+ disconnected: keyGen('disconnected'),
306
+ error: keyGen('error'),
307
+ callTool: keyGen('callTool'),
308
+ callToolSuccess: keyGen('callToolSuccess'),
309
+ callToolError: keyGen('callToolError'),
310
+ statusCodeDetected: keyGen('statusCodeDetected'),
311
+ usageInfo: keyGen('usageInfo'),
312
+ exampleUsage: keyGen('exampleUsage'),
313
+ invalidJson: keyGen('invalidJson'),
314
+ usingCommandLineProxy: keyGen('usingCommandLineProxy'),
315
+ invalidProxyFormat: keyGen('invalidProxyFormat'),
316
+ usingEnvProxy: keyGen('usingEnvProxy'),
317
+ usingShellProxy: keyGen('usingShellProxy'),
318
+ noShellProxy: keyGen('noShellProxy'),
319
+ systemProxyDisabled: keyGen('systemProxyDisabled'),
320
+ usingSystemProxy: keyGen('usingSystemProxy'),
321
+ noSystemProxy: keyGen('noSystemProxy'),
322
+ requestFailed: keyGen('requestFailed'),
323
+ fatalError: keyGen('fatalError'),
324
+ startingServer: keyGen('startingServer'),
325
+ fetchingUrl: keyGen('fetchingUrl'),
326
+ usingMode: keyGen('usingMode'),
327
+ fetchFailed: keyGen('fetchFailed'),
328
+ fetchSuccess: keyGen('fetchSuccess'),
329
+ browserModeNeeded: keyGen('browserModeNeeded'),
330
+ retryingWithBrowser: keyGen('retryingWithBrowser'),
331
+ browserModeFetchFailed: keyGen('browserModeFetchFailed'),
332
+ browserModeFetchSuccess: keyGen('browserModeFetchSuccess'),
333
+ serverClosed: keyGen('serverClosed'),
334
+ proxySet: keyGen('proxySet')
335
+ };
336
+ })();
337
+ /**
338
+ * 错误相关键 (Error related keys)
339
+ */
340
+ export const ERROR_KEYS = (() => {
341
+ const keyGen = createKeyGenerator('error');
342
+ return {
343
+ unexpected: keyGen('unexpected'),
344
+ validation: keyGen('validation'),
345
+ notFound: keyGen('notFound'),
346
+ unauthorized: keyGen('unauthorized'),
347
+ forbidden: keyGen('forbidden'),
348
+ timeout: keyGen('timeout'),
349
+ // 通用错误消息 (Common error messages)
350
+ missingUrl: keyGen('missingUrl'),
351
+ invalidUrl: keyGen('invalidUrl'),
352
+ networkError: keyGen('networkError'),
353
+ browserError: keyGen('browserError'),
354
+ unexpectedError: keyGen('unexpectedError'),
355
+ cloudflareProtection: keyGen('cloudflareProtection'),
356
+ captchaRequired: keyGen('captchaRequired'),
357
+ connectionProblem: keyGen('connectionProblem')
358
+ };
359
+ })();
360
+ /**
361
+ * 工具相关键 (Tools related keys)
362
+ */
363
+ export const TOOLS_KEYS = (() => {
364
+ const keyGen = createKeyGenerator('tools');
365
+ return {
366
+ fetchHtml: {
367
+ description: keyGen('fetchHtml.description'),
368
+ error: keyGen('fetchHtml.error')
369
+ },
370
+ fetchJson: {
371
+ description: keyGen('fetchJson.description'),
372
+ error: keyGen('fetchJson.error'),
373
+ invalidJson: keyGen('fetchJson.invalidJson')
374
+ },
375
+ fetchTxt: {
376
+ description: keyGen('fetchTxt.description'),
377
+ error: keyGen('fetchTxt.error')
378
+ },
379
+ fetchMarkdown: {
380
+ description: keyGen('fetchMarkdown.description'),
381
+ error: keyGen('fetchMarkdown.error')
382
+ }
383
+ };
384
+ })();
385
+ /**
386
+ * 提示相关键 (Prompts related keys)
387
+ */
388
+ export const PROMPTS_KEYS = (() => {
389
+ const keyGen = createKeyGenerator('prompts');
390
+ return {
391
+ // 提示列表和获取 (Prompt list and get)
392
+ list: {
393
+ request: keyGen('list.request')
394
+ },
395
+ get: {
396
+ request: keyGen('get.request')
397
+ },
398
+ // 错误消息 (Error messages)
399
+ notFound: keyGen('notFound'),
400
+ missingRequiredArg: keyGen('missingRequiredArg'),
401
+ useBrowserValue: keyGen('useBrowserValue'),
402
+ // 通用提示 (Generic prompt)
403
+ generic: {
404
+ result: keyGen('generic.result'),
405
+ message: keyGen('generic.message'),
406
+ args: keyGen('generic.args')
407
+ },
408
+ // 是/否 (Yes/No)
409
+ yes: keyGen('yes'),
410
+ no: keyGen('no'),
411
+ // 提示描述和参数 (Prompt descriptions and parameters)
412
+ url: {
413
+ description: keyGen('url.description')
414
+ },
415
+ format: {
416
+ description: keyGen('format.description')
417
+ },
418
+ useBrowser: {
419
+ description: keyGen('useBrowser.description')
420
+ },
421
+ selector: {
422
+ description: keyGen('selector.description')
423
+ },
424
+ dataType: {
425
+ description: keyGen('dataType.description')
426
+ },
427
+ error: {
428
+ description: keyGen('error.description')
429
+ },
430
+ // 获取网站提示 (Fetch website prompt)
431
+ fetchWebsite: {
432
+ description: keyGen('fetchWebsite.description'),
433
+ result: keyGen('fetchWebsite.result'),
434
+ message: keyGen('fetchWebsite.message'),
435
+ response: keyGen('fetchWebsite.response'),
436
+ instruction: keyGen('fetchWebsite.instruction'),
437
+ formatInstruction: keyGen('fetchWebsite.formatInstruction'),
438
+ browserInstruction: keyGen('fetchWebsite.browserInstruction')
439
+ },
440
+ // 提取内容提示 (Extract content prompt)
441
+ extractContent: {
442
+ description: keyGen('extractContent.description'),
443
+ result: keyGen('extractContent.result'),
444
+ message: keyGen('extractContent.message'),
445
+ selectorInstruction: keyGen('extractContent.selectorInstruction'),
446
+ dataTypeInstruction: keyGen('extractContent.dataTypeInstruction')
447
+ },
448
+ // 调试获取提示 (Debug fetch prompt)
449
+ debugFetch: {
450
+ description: keyGen('debugFetch.description'),
451
+ result: keyGen('debugFetch.result'),
452
+ message: keyGen('debugFetch.message'),
453
+ errorDetails: keyGen('debugFetch.errorDetails'),
454
+ instruction: keyGen('debugFetch.instruction')
455
+ }
456
+ };
457
+ })();
458
+ /**
459
+ * 节点相关键 (Node related keys)
460
+ */
461
+ export const NODE_KEYS = (() => {
462
+ const keyGen = createKeyGenerator('node');
463
+ return {
464
+ // 延迟和代理相关 (Delay and proxy related)
465
+ addingDelay: keyGen('addingDelay'),
466
+ noProxy: keyGen('noProxy'),
467
+ usingProxy: keyGen('usingProxy'),
468
+ usingHttpsProxy: keyGen('usingHttpsProxy'),
469
+ usingHttpProxy: keyGen('usingHttpProxy'),
470
+ // 请求相关 (Request related)
471
+ usingUserAgent: keyGen('usingUserAgent'),
472
+ requestDetails: keyGen('requestDetails'),
473
+ requestOptions: keyGen('requestOptions'),
474
+ startingFetch: keyGen('startingFetch'),
475
+ fetchingUrl: keyGen('fetchingUrl'),
476
+ // 响应相关 (Response related)
477
+ responseStatus: keyGen('responseStatus'),
478
+ redirectingTo: keyGen('redirectingTo'),
479
+ constructedFullRedirectUrl: keyGen('constructedFullRedirectUrl'),
480
+ requestSuccess: keyGen('requestSuccess'),
481
+ // 错误相关 (Error related)
482
+ errorResponse: keyGen('errorResponse'),
483
+ errorResponseBody: keyGen('errorResponseBody'),
484
+ errorReadingBody: keyGen('errorReadingBody'),
485
+ fetchError: keyGen('fetchError'),
486
+ requestAborted: keyGen('requestAborted'),
487
+ networkError: keyGen('networkError'),
488
+ tooManyRedirects: keyGen('tooManyRedirects'),
489
+ // 内容类型相关 (Content type related)
490
+ startingHtmlFetch: keyGen('startingHtmlFetch'),
491
+ readingText: keyGen('readingText'),
492
+ htmlContentLength: keyGen('htmlContentLength'),
493
+ htmlFetchError: keyGen('htmlFetchError'),
494
+ startingJsonFetch: keyGen('startingJsonFetch'),
495
+ parsingJson: keyGen('parsingJson'),
496
+ jsonParsed: keyGen('jsonParsed'),
497
+ jsonParseError: keyGen('jsonParseError'),
498
+ jsonFetchError: keyGen('jsonFetchError'),
499
+ startingTxtFetch: keyGen('startingTxtFetch'),
500
+ startingMarkdownFetch: keyGen('startingMarkdownFetch'),
501
+ creatingTurndown: keyGen('creatingTurndown'),
502
+ convertingToMarkdown: keyGen('convertingToMarkdown')
503
+ };
504
+ })();
@@ -3,60 +3,84 @@
3
3
  * Co-Author: AI Assistant (Claude)
4
4
  * Description: This code was collaboratively developed by Martin and AI Assistant.
5
5
  */
6
+ import { BROWSER_KEYS } from '../../keys/browser.js';
6
7
  // 浏览器相关消息 (Browser related messages)
7
- export const browser = {
8
- closing: "Closing browser...",
9
- closed: "Browser closed",
10
- starting: "Starting new browser instance",
11
- startingFailed: "Browser startup failed: {{error}}",
12
- waiting: "Browser is starting, waiting...",
13
- startupSuccess: "Browser started successfully",
14
- navigating: "Navigating to URL...",
15
- waitingForSelector: "Waiting for selector: {{selector}}",
16
- waitingForTimeout: "Waiting for timeout: {{timeout}}",
17
- scrolling: "Auto-scrolling page...",
18
- scrollCompleted: "Auto-scroll completed",
19
- gettingContent: "Getting page content...",
20
- savingCookies: "Saving cookies...",
21
- contentLength: "Content length: {{length}}",
22
- contentTruncated: "Content too large, truncating...",
23
- pageClosed: "Page closed",
24
- fetchError: "Error in browser fetch: {{error}}",
25
- highMemory: "High memory usage detected, attempting to free resources...",
26
- closingDueToMemory: "Closing browser due to high memory usage...",
27
- closingError: "Error closing browser: {{error}}",
28
- forcingGC: "Forcing garbage collection...",
29
- memoryCheckError: "Error checking memory usage: {{error}}",
30
- usingCookies: "Using stored cookies for domain: {{domain}}",
31
- usingProxy: "Using proxy: {{proxy}}",
32
- checkingCloudflare: "Checking for Cloudflare protection...",
33
- cloudflareDetected: "Cloudflare protection detected, attempting to bypass...",
34
- simulatingHuman: "Simulating human behavior...",
35
- simulatingHumanError: "Error simulating human behavior: {{error}}",
36
- stillOnCloudflare: "Still on Cloudflare protection page, trying to refresh...",
37
- bypassFailed: "Failed to bypass Cloudflare protection",
38
- cloudflareError: "Error handling Cloudflare protection: {{error}}",
39
- continuingWithoutBypass: "Unable to bypass Cloudflare protection, continuing to try to get content...",
40
- fetchingWithRetry: "Fetching HTML with browser (attempt {{attempt}}/{{maxAttempts}}): {{url}}",
41
- memoryUsage: "Memory usage - Heap: {{heapUsed}}MB/{{heapTotal}}MB, RSS: {{rss}}MB",
42
- memoryTooHigh: "Memory usage too high - Heap: {{heapUsed}}MB/{{heapTotal}}MB, RSS: {{rss}}MB",
43
- unableToBypassCloudflare: "Unable to bypass Cloudflare protection, continuing to try to get content...",
44
- contentTooLarge: "Content too large, truncating...",
45
- failedToParseJSON: "Failed to parse JSON: {{error}}",
46
- startingBrowserFetchForMarkdown: "Starting browser fetch for Markdown: {{url}}",
47
- errorInBrowserFetchForMarkdown: "Error in browser fetch for Markdown: {{error}}",
48
- fetchRequest: "Browser fetch request: {{url}}",
49
- usingStoredCookies: "Using stored cookies for domain: {{domain}}",
50
- closingInstance: "Closing browser instance",
51
- fetchErrorWithAttempt: "Error in browser fetch (attempt {{attempt}}/{{maxAttempts}}): {{error}}",
52
- retryingAfterDelay: "Retrying after {{delayMs}}ms delay...",
53
- browserStartupSuccess: "Browser started successfully",
54
- browserStartupFailed: "Browser startup failed: {{error}}",
55
- usingCustomChromePath: "Using custom Chrome path: {{path}}",
56
- browserDisconnected: "Browser disconnected",
57
- waitingForBrowserStart: "Waiting for browser to start",
58
- reusingExistingBrowser: "Reusing existing browser instance",
59
- startingBrowser: "Starting browser",
60
- browserStarted: "Browser started successfully",
61
- browserStartError: "Browser startup error: {{error}}"
8
+ export default {
9
+ // 浏览器生命周期 (Browser lifecycle)
10
+ [BROWSER_KEYS.closing]: "Closing browser...",
11
+ [BROWSER_KEYS.closed]: "Browser closed",
12
+ [BROWSER_KEYS.starting]: "Starting new browser instance",
13
+ [BROWSER_KEYS.startingFailed]: "Browser startup failed: {{error}}",
14
+ [BROWSER_KEYS.alreadyRunning]: "Browser is starting, waiting...",
15
+ // 页面操作 (Page operations)
16
+ [BROWSER_KEYS.creatingPage]: "Creating new page",
17
+ [BROWSER_KEYS.navigatingTo]: "Navigating to URL: {{url}}",
18
+ [BROWSER_KEYS.waitingForSelector]: "Waiting for selector: {{selector}}",
19
+ [BROWSER_KEYS.waitingForTimeout]: "Waiting for timeout: {{timeout}}ms",
20
+ [BROWSER_KEYS.scrollingToBottom]: "Auto-scrolling page...",
21
+ [BROWSER_KEYS.scrollError]: "Error while scrolling: {{error}}",
22
+ [BROWSER_KEYS.gettingContent]: "Getting page content...",
23
+ [BROWSER_KEYS.contentLength]: "Content length: {{length}} bytes",
24
+ // Cookie 相关 (Cookie related)
25
+ [BROWSER_KEYS.savingCookies]: "Saving cookies for domain: {{domain}}",
26
+ [BROWSER_KEYS.cookiesSaved]: "Cookies saved successfully",
27
+ [BROWSER_KEYS.loadingCookies]: "Loading cookies for domain: {{domain}}",
28
+ [BROWSER_KEYS.cookiesLoaded]: "Cookies loaded successfully",
29
+ [BROWSER_KEYS.noCookiesFound]: "No cookies found for domain: {{domain}}",
30
+ // 错误相关 (Error related)
31
+ [BROWSER_KEYS.errorLoadingCookies]: "Error loading cookies: {{error}}",
32
+ [BROWSER_KEYS.errorSavingCookies]: "Error saving cookies: {{error}}",
33
+ [BROWSER_KEYS.errorNavigating]: "Error navigating to URL: {{error}}",
34
+ [BROWSER_KEYS.errorGettingContent]: "Error getting content: {{error}}",
35
+ [BROWSER_KEYS.errorClosingBrowser]: "Error closing browser: {{error}}",
36
+ [BROWSER_KEYS.errorCreatingPage]: "Error creating page: {{error}}",
37
+ [BROWSER_KEYS.closingError]: "Error during browser closing: {{error}}",
38
+ // 额外的浏览器相关键 (Additional browser related keys)
39
+ [BROWSER_KEYS.waiting]: "Browser is starting, waiting...",
40
+ [BROWSER_KEYS.startupSuccess]: "Browser started successfully",
41
+ [BROWSER_KEYS.navigating]: "Navigating to URL: {{url}}",
42
+ [BROWSER_KEYS.scrolling]: "Auto-scrolling page...",
43
+ [BROWSER_KEYS.scrollCompleted]: "Auto-scroll completed",
44
+ [BROWSER_KEYS.contentTruncated]: "Content too large, truncating...",
45
+ [BROWSER_KEYS.pageClosed]: "Page closed",
46
+ [BROWSER_KEYS.fetchError]: "Error in browser fetch: {{error}}",
47
+ [BROWSER_KEYS.highMemory]: "High memory usage detected: {{usage}}MB",
48
+ [BROWSER_KEYS.closingDueToMemory]: "Closing browser due to high memory usage",
49
+ [BROWSER_KEYS.forcingGC]: "Forcing garbage collection",
50
+ [BROWSER_KEYS.memoryCheckError]: "Error checking memory usage: {{error}}",
51
+ [BROWSER_KEYS.usingCookies]: "Using cookies for domain: {{domain}}",
52
+ [BROWSER_KEYS.usingProxy]: "Using proxy: {{proxy}}",
53
+ // Cloudflare 相关 (Cloudflare related)
54
+ [BROWSER_KEYS.checkingCloudflare]: "Checking for Cloudflare protection",
55
+ [BROWSER_KEYS.cloudflareDetected]: "Cloudflare protection detected",
56
+ [BROWSER_KEYS.simulatingHuman]: "Simulating human interaction to bypass Cloudflare",
57
+ [BROWSER_KEYS.simulatingHumanError]: "Error simulating human interaction: {{error}}",
58
+ [BROWSER_KEYS.stillOnCloudflare]: "Still on Cloudflare page after bypass attempt",
59
+ [BROWSER_KEYS.bypassFailed]: "Cloudflare bypass failed",
60
+ [BROWSER_KEYS.cloudflareError]: "Cloudflare error: {{error}}",
61
+ [BROWSER_KEYS.continuingWithoutBypass]: "Continuing without Cloudflare bypass",
62
+ [BROWSER_KEYS.unableToBypassCloudflare]: "Unable to bypass Cloudflare protection",
63
+ // 获取和重试相关 (Fetch and retry related)
64
+ [BROWSER_KEYS.fetchingWithRetry]: "Fetching with retry: attempt {{attempt}} of {{maxAttempts}}",
65
+ [BROWSER_KEYS.memoryUsage]: "Current memory usage: {{usage}}MB",
66
+ [BROWSER_KEYS.memoryTooHigh]: "Memory usage too high: {{usage}}MB",
67
+ [BROWSER_KEYS.contentTooLarge]: "Content too large: {{size}} bytes",
68
+ [BROWSER_KEYS.failedToParseJSON]: "Failed to parse JSON: {{error}}",
69
+ [BROWSER_KEYS.startingBrowserFetchForMarkdown]: "Starting browser fetch for Markdown",
70
+ [BROWSER_KEYS.errorInBrowserFetchForMarkdown]: "Error in browser fetch for Markdown: {{error}}",
71
+ [BROWSER_KEYS.fetchRequest]: "Fetch request: {{url}}",
72
+ [BROWSER_KEYS.usingStoredCookies]: "Using stored cookies for domain: {{domain}}",
73
+ [BROWSER_KEYS.closingInstance]: "Closing browser instance",
74
+ [BROWSER_KEYS.fetchErrorWithAttempt]: "Fetch error (attempt {{attempt}}): {{error}}",
75
+ [BROWSER_KEYS.retryingAfterDelay]: "Retrying after {{delay}}ms delay",
76
+ // 浏览器启动相关 (Browser startup related)
77
+ [BROWSER_KEYS.browserStartupSuccess]: "Browser startup successful",
78
+ [BROWSER_KEYS.browserStartupFailed]: "Browser startup failed: {{error}}",
79
+ [BROWSER_KEYS.usingCustomChromePath]: "Using custom Chrome path: {{path}}",
80
+ [BROWSER_KEYS.browserDisconnected]: "Browser disconnected",
81
+ [BROWSER_KEYS.waitingForBrowserStart]: "Waiting for browser to start...",
82
+ [BROWSER_KEYS.reusingExistingBrowser]: "Reusing existing browser instance",
83
+ [BROWSER_KEYS.startingBrowser]: "Starting browser...",
84
+ [BROWSER_KEYS.browserStarted]: "Browser started",
85
+ [BROWSER_KEYS.browserStartError]: "Browser start error: {{error}}"
62
86
  };