@lmcc-dev/mult-fetch-mcp-server 1.2.1 → 1.3.1

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 (81) hide show
  1. package/README.md +80 -29
  2. package/README.zh.md +80 -29
  3. package/dist/i18n-test-report.json +2 -2
  4. package/dist/i18n-unused-keys-report.json +4 -4
  5. package/dist/src/client.js +522 -131
  6. package/dist/src/index.js +0 -0
  7. package/dist/src/lib/fetch.js +8 -0
  8. package/dist/src/lib/fetchers/browser/BrowserFetcher.js +139 -199
  9. package/dist/src/lib/fetchers/common/BaseFetcher.js +203 -0
  10. package/dist/src/lib/fetchers/common/types.js +4 -0
  11. package/dist/src/lib/fetchers/common/utils.js +1 -1
  12. package/dist/src/lib/fetchers/index.js +11 -0
  13. package/dist/src/lib/fetchers/node/NodeFetcher.js +91 -66
  14. package/dist/src/lib/i18n/keys/browser.js +40 -2
  15. package/dist/src/lib/i18n/keys/chunkManager.js +43 -0
  16. package/dist/src/lib/i18n/keys/client.js +53 -1
  17. package/dist/src/lib/i18n/keys/contentSize.js +20 -0
  18. package/dist/src/lib/i18n/keys/fetcher.js +88 -79
  19. package/dist/src/lib/i18n/keys/index.js +4 -0
  20. package/dist/src/lib/i18n/keys/node.js +7 -1
  21. package/dist/src/lib/i18n/keys/processor.js +30 -0
  22. package/dist/src/lib/i18n/keys/tools.js +5 -1
  23. package/dist/src/lib/i18n/keys/url.js +45 -0
  24. package/dist/src/lib/i18n/keys.js +25 -0
  25. package/dist/src/lib/i18n/locales/en/browser.js +52 -14
  26. package/dist/src/lib/i18n/locales/en/chunkManager.js +41 -0
  27. package/dist/src/lib/i18n/locales/en/client.js +62 -9
  28. package/dist/src/lib/i18n/locales/en/contentSize.js +17 -0
  29. package/dist/src/lib/i18n/locales/en/fetcher.js +50 -30
  30. package/dist/src/lib/i18n/locales/en/index.js +9 -1
  31. package/dist/src/lib/i18n/locales/en/node.js +26 -20
  32. package/dist/src/lib/i18n/locales/en/processor.js +28 -0
  33. package/dist/src/lib/i18n/locales/en/tools.js +5 -1
  34. package/dist/src/lib/i18n/locales/en/url.js +40 -0
  35. package/dist/src/lib/i18n/locales/en.js +51 -0
  36. package/dist/src/lib/i18n/locales/zh/browser.js +85 -47
  37. package/dist/src/lib/i18n/locales/zh/chunkManager.js +41 -0
  38. package/dist/src/lib/i18n/locales/zh/client.js +53 -1
  39. package/dist/src/lib/i18n/locales/zh/contentSize.js +17 -0
  40. package/dist/src/lib/i18n/locales/zh/fetcher.js +67 -47
  41. package/dist/src/lib/i18n/locales/zh/index.js +9 -1
  42. package/dist/src/lib/i18n/locales/zh/node.js +50 -44
  43. package/dist/src/lib/i18n/locales/zh/processor.js +28 -0
  44. package/dist/src/lib/i18n/locales/zh/tools.js +5 -1
  45. package/dist/src/lib/i18n/locales/zh/url.js +40 -0
  46. package/dist/src/lib/i18n/locales/zh.js +51 -0
  47. package/dist/src/lib/logger.js +11 -2
  48. package/dist/src/lib/server/fetcher.js +15 -5
  49. package/dist/src/lib/server/tools.js +202 -52
  50. package/dist/src/lib/types.js +5 -0
  51. package/dist/src/lib/utils/ChunkManager.js +177 -0
  52. package/dist/src/lib/utils/ContentProcessor.js +134 -0
  53. package/dist/src/lib/utils/ContentSizeManager.js +123 -0
  54. package/dist/src/lib/utils/TemplateUtils.js +71 -0
  55. package/dist/src/lib/utils/errors.js +2 -8
  56. package/dist/src/mcp-server.js +0 -0
  57. package/dist/src/test-i18n.js +0 -0
  58. package/dist/tests/BrowserFetcher.test.js +0 -0
  59. package/dist/tests/NodeFetcher.test.js +0 -0
  60. package/dist/tests/client.test.js +0 -0
  61. package/dist/tests/fetch.test.js +0 -0
  62. package/dist/tests/fetchers/plain-text.test.js +146 -0
  63. package/dist/tests/i18n-missing-keys.js +0 -0
  64. package/dist/tests/i18n-remove-unused-keys.js +0 -0
  65. package/dist/tests/i18n-unused-keys.js +0 -0
  66. package/dist/tests/i18n.test.js +0 -0
  67. package/dist/tests/logger.test.js +0 -0
  68. package/dist/tests/mcp-server.test.js +0 -0
  69. package/dist/tests/server/fetcher.test.js +69 -15
  70. package/dist/tests/server/tools.test.js +165 -16
  71. package/dist/tests/setup.js +0 -0
  72. package/dist/tests/test-direct-client.js +113 -5
  73. package/dist/tests/test-i18n.js +0 -0
  74. package/dist/tests/test-mcp-methods.js +67 -1
  75. package/dist/tests/test-mcp.js +83 -3
  76. package/dist/tests/test-mini4k.js +90 -3
  77. package/dist/tests/types.test.js +0 -0
  78. package/dist/tests/utils/ChunkManager.test.js +163 -0
  79. package/dist/tests/utils/ContentSizeManager.test.js +170 -0
  80. package/dist/vitest.config.js +0 -0
  81. package/package.json +28 -23
@@ -4,84 +4,93 @@
4
4
  * Description: This code was collaboratively developed by Martin and AI Assistant.
5
5
  */
6
6
  import { createKeyGenerator } from './base.js';
7
+ const PREFIX = 'fetcher';
8
+ const keyGen = createKeyGenerator(PREFIX);
7
9
  /**
8
- * 获取器相关键 (Fetcher related keys)
10
+ * 获取器相关的国际化键 (Internationalization keys related to fetcher)
9
11
  */
10
- export const FETCHER_KEYS = (() => {
11
- const keyGen = createKeyGenerator('fetcher');
12
- return {
13
- // 延迟相关 (Delay related)
14
- addingDelay: keyGen('addingDelay'),
15
- delayCompleted: keyGen('delayCompleted'),
16
- // 代理相关 (Proxy related)
17
- usingProxy: keyGen('usingProxy'),
18
- usingSpecifiedProxy: keyGen('usingSpecifiedProxy'),
19
- attemptingToUseSystemProxy: keyGen('attemptingToUseSystemProxy'),
20
- notUsingProxy: keyGen('notUsingProxy'),
21
- finalProxyUsed: keyGen('finalProxyUsed'),
22
- noProxy: keyGen('noProxy'),
23
- foundNoProxy: keyGen('foundNoProxy'),
24
- usingHttpsProxy: keyGen('usingHttpsProxy'),
25
- usingHttpProxy: keyGen('usingHttpProxy'),
26
- systemProxyDisabled: keyGen('systemProxyDisabled'),
27
- // 请求相关 (Request related)
28
- fetchingUrl: keyGen('fetchingUrl'),
29
- usingUserAgent: keyGen('usingUserAgent'),
30
- requestOptions: keyGen('requestOptions'),
31
- startingFetch: keyGen('startingFetch'),
32
- fetchCompleted: keyGen('fetchCompleted'),
33
- // 响应相关 (Response related)
34
- responseStatus: keyGen('responseStatus'),
35
- redirectingTo: keyGen('redirectingTo'),
36
- constructedFullRedirectUrl: keyGen('constructedFullRedirectUrl'),
37
- requestSuccess: keyGen('requestSuccess'),
38
- // 错误相关 (Error related)
39
- errorResponse: keyGen('errorResponse'),
40
- errorResponseBody: keyGen('errorResponseBody'),
41
- errorReadingBody: keyGen('errorReadingBody'),
42
- fetchError: keyGen('fetchError'),
43
- requestAborted: keyGen('requestAborted'),
44
- networkError: keyGen('networkError'),
45
- requestTimeout: keyGen('requestTimeout'),
46
- fetchFailed: keyGen('fetchFailed'),
47
- tooManyRedirects: keyGen('tooManyRedirects'),
48
- // 内容类型相关 (Content type related)
49
- startingHtmlFetch: keyGen('startingHtmlFetch'),
50
- fetchingHtml: keyGen('fetchingHtml'),
51
- fetchingJson: keyGen('fetchingJson'),
52
- fetchingTxt: keyGen('fetchingTxt'),
53
- fetchingMarkdown: keyGen('fetchingMarkdown'),
54
- readingText: keyGen('readingText'),
55
- htmlContentLength: keyGen('htmlContentLength'),
56
- startingJsonFetch: keyGen('startingJsonFetch'),
57
- parsingJson: keyGen('parsingJson'),
58
- jsonParsed: keyGen('jsonParsed'),
59
- jsonParseError: keyGen('jsonParseError'),
60
- startingTxtFetch: keyGen('startingTxtFetch'),
61
- textContentLength: keyGen('textContentLength'),
62
- startingMarkdownFetch: keyGen('startingMarkdownFetch'),
63
- creatingTurndown: keyGen('creatingTurndown'),
64
- convertingToMarkdown: keyGen('convertingToMarkdown'),
65
- markdownContentLength: keyGen('markdownContentLength'),
66
- // 系统代理相关 (System proxy related)
67
- checkingProxyEnv: keyGen('checkingProxyEnv'),
68
- envVarValue: keyGen('envVarValue'),
69
- foundSystemProxy: keyGen('foundSystemProxy'),
70
- systemCommandProxySettings: keyGen('systemCommandProxySettings'),
71
- foundProxyFromCommand: keyGen('foundProxyFromCommand'),
72
- errorGettingProxyFromCommand: keyGen('errorGettingProxyFromCommand'),
73
- checkingSystemEnvVars: keyGen('checkingSystemEnvVars'),
74
- windowsEnvVars: keyGen('windowsEnvVars'),
75
- foundWindowsEnvProxy: keyGen('foundWindowsEnvProxy'),
76
- errorGettingWindowsEnvVars: keyGen('errorGettingWindowsEnvVars'),
77
- unixEnvVars: keyGen('unixEnvVars'),
78
- foundUnixEnvProxy: keyGen('foundUnixEnvProxy'),
79
- errorGettingUnixEnvVars: keyGen('errorGettingUnixEnvVars'),
80
- errorGettingSystemEnvVars: keyGen('errorGettingSystemEnvVars'),
81
- noSystemProxyFound: keyGen('noSystemProxyFound'),
82
- // 通用 (General)
83
- notSet: keyGen('notSet'),
84
- debug: keyGen('debug'),
85
- none: keyGen('none')
86
- };
87
- })();
12
+ export const FETCHER_KEYS = {
13
+ // 内容大小相关 (Content size related)
14
+ contentLength: keyGen('contentLength'),
15
+ contentTooLarge: keyGen('contentTooLarge'),
16
+ contentTruncated: keyGen('contentTruncated'),
17
+ // 分块处理相关 (Chunk processing related)
18
+ chunkRetrievalFailed: keyGen('chunkRetrievalFailed'),
19
+ gettingChunkBySize: keyGen('gettingChunkBySize'),
20
+ chunkNotFound: keyGen('chunkNotFound'),
21
+ // 获取类型相关 (Fetch type related)
22
+ fetchingPlainText: keyGen('fetchingPlainText'),
23
+ // 延迟相关 (Delay related)
24
+ addingDelay: keyGen('addingDelay'),
25
+ delayCompleted: keyGen('delayCompleted'),
26
+ // 代理相关 (Proxy related)
27
+ usingProxy: keyGen('usingProxy'),
28
+ usingSpecifiedProxy: keyGen('usingSpecifiedProxy'),
29
+ attemptingToUseSystemProxy: keyGen('attemptingToUseSystemProxy'),
30
+ notUsingProxy: keyGen('notUsingProxy'),
31
+ finalProxyUsed: keyGen('finalProxyUsed'),
32
+ noProxy: keyGen('noProxy'),
33
+ foundNoProxy: keyGen('foundNoProxy'),
34
+ usingHttpsProxy: keyGen('usingHttpsProxy'),
35
+ usingHttpProxy: keyGen('usingHttpProxy'),
36
+ systemProxyDisabled: keyGen('systemProxyDisabled'),
37
+ // 请求相关 (Request related)
38
+ fetchingUrl: keyGen('fetchingUrl'),
39
+ usingUserAgent: keyGen('usingUserAgent'),
40
+ requestOptions: keyGen('requestOptions'),
41
+ startingFetch: keyGen('startingFetch'),
42
+ fetchCompleted: keyGen('fetchCompleted'),
43
+ // 响应相关 (Response related)
44
+ responseStatus: keyGen('responseStatus'),
45
+ redirectingTo: keyGen('redirectingTo'),
46
+ constructedFullRedirectUrl: keyGen('constructedFullRedirectUrl'),
47
+ requestSuccess: keyGen('requestSuccess'),
48
+ // 错误相关 (Error related)
49
+ errorResponse: keyGen('errorResponse'),
50
+ errorResponseBody: keyGen('errorResponseBody'),
51
+ errorReadingBody: keyGen('errorReadingBody'),
52
+ fetchError: keyGen('fetchError'),
53
+ requestAborted: keyGen('requestAborted'),
54
+ networkError: keyGen('networkError'),
55
+ requestTimeout: keyGen('requestTimeout'),
56
+ fetchFailed: keyGen('fetchFailed'),
57
+ tooManyRedirects: keyGen('tooManyRedirects'),
58
+ // 内容类型相关 (Content type related)
59
+ startingHtmlFetch: keyGen('startingHtmlFetch'),
60
+ fetchingHtml: keyGen('fetchingHtml'),
61
+ fetchingJson: keyGen('fetchingJson'),
62
+ fetchingTxt: keyGen('fetchingTxt'),
63
+ fetchingMarkdown: keyGen('fetchingMarkdown'),
64
+ readingText: keyGen('readingText'),
65
+ htmlContentLength: keyGen('htmlContentLength'),
66
+ startingJsonFetch: keyGen('startingJsonFetch'),
67
+ parsingJson: keyGen('parsingJson'),
68
+ jsonParsed: keyGen('jsonParsed'),
69
+ jsonParseError: keyGen('jsonParseError'),
70
+ startingTxtFetch: keyGen('startingTxtFetch'),
71
+ textContentLength: keyGen('textContentLength'),
72
+ startingMarkdownFetch: keyGen('startingMarkdownFetch'),
73
+ creatingTurndown: keyGen('creatingTurndown'),
74
+ convertingToMarkdown: keyGen('convertingToMarkdown'),
75
+ markdownContentLength: keyGen('markdownContentLength'),
76
+ // 系统代理相关 (System proxy related)
77
+ checkingProxyEnv: keyGen('checkingProxyEnv'),
78
+ envVarValue: keyGen('envVarValue'),
79
+ foundSystemProxy: keyGen('foundSystemProxy'),
80
+ systemCommandProxySettings: keyGen('systemCommandProxySettings'),
81
+ foundProxyFromCommand: keyGen('foundProxyFromCommand'),
82
+ errorGettingProxyFromCommand: keyGen('errorGettingProxyFromCommand'),
83
+ checkingSystemEnvVars: keyGen('checkingSystemEnvVars'),
84
+ windowsEnvVars: keyGen('windowsEnvVars'),
85
+ foundWindowsEnvProxy: keyGen('foundWindowsEnvProxy'),
86
+ errorGettingWindowsEnvVars: keyGen('errorGettingWindowsEnvVars'),
87
+ unixEnvVars: keyGen('unixEnvVars'),
88
+ foundUnixEnvProxy: keyGen('foundUnixEnvProxy'),
89
+ errorGettingUnixEnvVars: keyGen('errorGettingUnixEnvVars'),
90
+ errorGettingSystemEnvVars: keyGen('errorGettingSystemEnvVars'),
91
+ noSystemProxyFound: keyGen('noSystemProxyFound'),
92
+ // 通用 (General)
93
+ notSet: keyGen('notSet'),
94
+ debug: keyGen('debug'),
95
+ none: keyGen('none')
96
+ };
@@ -11,6 +11,10 @@ export * from './factory.js';
11
11
  export * from './fetcher.js';
12
12
  export * from './node.js';
13
13
  export * from './prompts.js';
14
+ export * from './processor.js';
14
15
  export * from './resources.js';
15
16
  export * from './server.js';
16
17
  export * from './tools.js';
18
+ export * from './chunkManager.js';
19
+ export * from './contentSize.js';
20
+ export * from './url.js';
@@ -64,6 +64,12 @@ export const NODE_KEYS = (() => {
64
64
  startingMarkdownFetch: keyGen('startingMarkdownFetch'),
65
65
  creatingTurndown: keyGen('creatingTurndown'),
66
66
  convertingToMarkdown: keyGen('convertingToMarkdown'),
67
- markdownContentLength: keyGen('markdownContentLength')
67
+ markdownContentLength: keyGen('markdownContentLength'),
68
+ startingPlainTextFetch: keyGen('startingPlainTextFetch'),
69
+ extractingText: keyGen('extractingText'),
70
+ textExtracted: keyGen('textExtracted'),
71
+ // 内容分段相关 (Content splitting related)
72
+ contentSplit: keyGen('contentSplit'),
73
+ gettingChunk: keyGen('gettingChunk')
68
74
  };
69
75
  })();
@@ -0,0 +1,30 @@
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
+ import { createKeyGenerator } from './base.js';
7
+ const PREFIX = 'processor';
8
+ const keyGen = createKeyGenerator(PREFIX);
9
+ /**
10
+ * 内容处理器相关的国际化键 (Internationalization keys related to content processor)
11
+ */
12
+ export const PROCESSOR_KEYS = {
13
+ // HTML转Markdown相关 (HTML to Markdown related)
14
+ creatingTurndown: keyGen('creatingTurndown'),
15
+ convertingToMarkdown: keyGen('convertingToMarkdown'),
16
+ markdownContentLength: keyGen('markdownContentLength'),
17
+ // HTML转纯文本相关 (HTML to plain text related)
18
+ creatingHtmlToText: keyGen('creatingHtmlToText'),
19
+ convertingToText: keyGen('convertingToText'),
20
+ textContentLength: keyGen('textContentLength'),
21
+ // JSON处理相关 (JSON processing related)
22
+ parsingJson: keyGen('parsingJson'),
23
+ jsonParsed: keyGen('jsonParsed'),
24
+ jsonParseError: keyGen('jsonParseError'),
25
+ // 文本处理相关 (Text processing related)
26
+ processingText: keyGen('processingText'),
27
+ // 内容大小验证相关 (Content size validation related)
28
+ contentTooLarge: keyGen('contentTooLarge'),
29
+ contentSizeOk: keyGen('contentSizeOk'),
30
+ };
@@ -34,6 +34,10 @@ export const TOOLS_KEYS = (() => {
34
34
  callError: keyGen('callError'),
35
35
  missingUrl: keyGen('missingUrl'),
36
36
  fetchRequest: keyGen('fetchRequest'),
37
- fetchError: keyGen('fetchError')
37
+ fetchError: keyGen('fetchError'),
38
+ // 参数相关 (Parameters related)
39
+ missingUrlOrChunkId: keyGen('missingUrlOrChunkId'),
40
+ missingStartCursor: keyGen('missingStartCursor'),
41
+ fetchChunkRequest: keyGen('fetchChunkRequest')
38
42
  };
39
43
  })();
@@ -0,0 +1,45 @@
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
+ import { createKeyGenerator } from './base.js';
7
+ /**
8
+ * URL相关键 (URL related keys)
9
+ */
10
+ export const URL_KEYS = (() => {
11
+ const keyGen = createKeyGenerator('url');
12
+ return {
13
+ // 验证相关 (Validation related)
14
+ invalidUrl: keyGen('invalidUrl'),
15
+ missingScheme: keyGen('missingScheme'),
16
+ invalidScheme: keyGen('invalidScheme'),
17
+ invalidHostname: keyGen('invalidHostname'),
18
+ // 处理相关 (Processing related)
19
+ parsing: keyGen('parsing'),
20
+ constructing: keyGen('constructing'),
21
+ normalizing: keyGen('normalizing'),
22
+ resolving: keyGen('resolving'),
23
+ // 组件相关 (Component related)
24
+ scheme: keyGen('scheme'),
25
+ username: keyGen('username'),
26
+ password: keyGen('password'),
27
+ hostname: keyGen('hostname'),
28
+ port: keyGen('port'),
29
+ path: keyGen('path'),
30
+ query: keyGen('query'),
31
+ fragment: keyGen('fragment'),
32
+ // 相对URL相关 (Relative URL related)
33
+ baseUrl: keyGen('baseUrl'),
34
+ relativeUrl: keyGen('relativeUrl'),
35
+ absoluteUrl: keyGen('absoluteUrl'),
36
+ // 转换相关 (Conversion related)
37
+ toString: keyGen('toString'),
38
+ toJSON: keyGen('toJSON'),
39
+ // 错误相关 (Error related)
40
+ parseError: keyGen('parseError'),
41
+ constructError: keyGen('constructError'),
42
+ normalizeError: keyGen('normalizeError'),
43
+ resolveError: keyGen('resolveError')
44
+ };
45
+ })();
@@ -502,3 +502,28 @@ export const NODE_KEYS = (() => {
502
502
  convertingToMarkdown: keyGen('convertingToMarkdown')
503
503
  };
504
504
  })();
505
+ /**
506
+ * 处理器相关键 (Processor related keys)
507
+ */
508
+ export const PROCESSOR_KEYS = (() => {
509
+ const keyGen = createKeyGenerator('processor');
510
+ return {
511
+ // HTML转Markdown相关 (HTML to Markdown related)
512
+ creatingTurndown: keyGen('creatingTurndown'),
513
+ convertingToMarkdown: keyGen('convertingToMarkdown'),
514
+ markdownContentLength: keyGen('markdownContentLength'),
515
+ // HTML转纯文本相关 (HTML to plain text related)
516
+ creatingHtmlToText: keyGen('creatingHtmlToText'),
517
+ convertingToText: keyGen('convertingToText'),
518
+ textContentLength: keyGen('textContentLength'),
519
+ // JSON处理相关 (JSON processing related)
520
+ parsingJson: keyGen('parsingJson'),
521
+ jsonParsed: keyGen('jsonParsed'),
522
+ jsonParseError: keyGen('jsonParseError'),
523
+ // 文本处理相关 (Text processing related)
524
+ processingText: keyGen('processingText'),
525
+ // 内容大小验证相关 (Content size validation related)
526
+ contentTooLarge: keyGen('contentTooLarge'),
527
+ contentSizeOk: keyGen('contentSizeOk'),
528
+ };
529
+ })();
@@ -11,7 +11,7 @@ export default {
11
11
  [BROWSER_KEYS.closed]: "Browser closed",
12
12
  [BROWSER_KEYS.starting]: "Starting new browser instance",
13
13
  [BROWSER_KEYS.startingFailed]: "Browser startup failed: {{error}}",
14
- [BROWSER_KEYS.alreadyRunning]: "Browser is starting, waiting...",
14
+ [BROWSER_KEYS.alreadyRunning]: "Browser is already starting, please wait...",
15
15
  // 页面操作 (Page operations)
16
16
  [BROWSER_KEYS.creatingPage]: "Creating new page",
17
17
  [BROWSER_KEYS.navigatingTo]: "Navigating to URL: {{url}}",
@@ -21,34 +21,36 @@ export default {
21
21
  [BROWSER_KEYS.scrollError]: "Error while scrolling: {{error}}",
22
22
  [BROWSER_KEYS.gettingContent]: "Getting page content...",
23
23
  [BROWSER_KEYS.contentLength]: "Content length: {{length}} bytes",
24
+ [BROWSER_KEYS.contentTruncated]: "Content truncated from {{originalLength}} to {{truncatedLength}} bytes",
25
+ [BROWSER_KEYS.contentSplit]: "Content split into {{chunks}} chunks",
26
+ [BROWSER_KEYS.startingHtmlFetch]: "Starting HTML fetch",
24
27
  // Cookie 相关 (Cookie related)
25
28
  [BROWSER_KEYS.savingCookies]: "Saving cookies for domain: {{domain}}",
26
- [BROWSER_KEYS.cookiesSaved]: "Cookies saved successfully",
29
+ [BROWSER_KEYS.cookiesSaved]: "Cookies saved",
27
30
  [BROWSER_KEYS.loadingCookies]: "Loading cookies for domain: {{domain}}",
28
- [BROWSER_KEYS.cookiesLoaded]: "Cookies loaded successfully",
31
+ [BROWSER_KEYS.cookiesLoaded]: "Cookies loaded",
29
32
  [BROWSER_KEYS.noCookiesFound]: "No cookies found for domain: {{domain}}",
30
33
  // 错误相关 (Error related)
31
34
  [BROWSER_KEYS.errorLoadingCookies]: "Error loading cookies: {{error}}",
32
35
  [BROWSER_KEYS.errorSavingCookies]: "Error saving cookies: {{error}}",
33
- [BROWSER_KEYS.errorNavigating]: "Error navigating to URL: {{error}}",
36
+ [BROWSER_KEYS.errorNavigating]: "Error navigating to {{url}}: {{error}}",
34
37
  [BROWSER_KEYS.errorGettingContent]: "Error getting content: {{error}}",
35
38
  [BROWSER_KEYS.errorClosingBrowser]: "Error closing browser: {{error}}",
36
39
  [BROWSER_KEYS.errorCreatingPage]: "Error creating page: {{error}}",
37
- [BROWSER_KEYS.closingError]: "Error during browser closing: {{error}}",
40
+ [BROWSER_KEYS.closingError]: "Error closing browser: {{error}}",
38
41
  // 额外的浏览器相关键 (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.waiting]: "Waiting for {{ms}}ms",
43
+ [BROWSER_KEYS.startupSuccess]: "Browser startup successful",
44
+ [BROWSER_KEYS.navigating]: "Navigating to {{url}}",
42
45
  [BROWSER_KEYS.scrolling]: "Auto-scrolling page...",
43
46
  [BROWSER_KEYS.scrollCompleted]: "Auto-scroll completed",
44
- [BROWSER_KEYS.contentTruncated]: "Content too large, truncating...",
45
47
  [BROWSER_KEYS.pageClosed]: "Page closed",
46
48
  [BROWSER_KEYS.fetchError]: "Error in browser fetch: {{error}}",
47
49
  [BROWSER_KEYS.highMemory]: "High memory usage detected: {{usage}}MB",
48
50
  [BROWSER_KEYS.closingDueToMemory]: "Closing browser due to high memory usage",
49
51
  [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.memoryCheckError]: "Error checking memory: {{error}}",
53
+ [BROWSER_KEYS.usingCookies]: "Using cookies for {{domain}}",
52
54
  [BROWSER_KEYS.usingProxy]: "Using proxy: {{proxy}}",
53
55
  // Cloudflare 相关 (Cloudflare related)
54
56
  [BROWSER_KEYS.checkingCloudflare]: "Checking for Cloudflare protection",
@@ -60,10 +62,14 @@ export default {
60
62
  [BROWSER_KEYS.cloudflareError]: "Cloudflare error: {{error}}",
61
63
  [BROWSER_KEYS.continuingWithoutBypass]: "Continuing without Cloudflare bypass",
62
64
  [BROWSER_KEYS.unableToBypassCloudflare]: "Unable to bypass Cloudflare protection",
65
+ [BROWSER_KEYS.cloudflareBypass]: "Attempting to bypass Cloudflare protection",
66
+ [BROWSER_KEYS.cloudflareBypassSuccess]: "Cloudflare protection bypassed",
67
+ [BROWSER_KEYS.cloudflareBypassFailed]: "Failed to bypass Cloudflare protection: {{error}}",
68
+ [BROWSER_KEYS.cloudflareBypassNotNeeded]: "Continuing without Cloudflare bypass",
63
69
  // 获取和重试相关 (Fetch and retry related)
64
70
  [BROWSER_KEYS.fetchingWithRetry]: "Fetching with retry: attempt {{attempt}} of {{maxAttempts}}",
65
71
  [BROWSER_KEYS.memoryUsage]: "Current memory usage: {{usage}}MB",
66
- [BROWSER_KEYS.memoryTooHigh]: "Memory usage too high: {{usage}}MB",
72
+ [BROWSER_KEYS.memoryTooHigh]: "Memory usage too high: {{heapUsed}}MB heap used, {{heapTotal}}MB heap total, {{rss}}MB RSS",
67
73
  [BROWSER_KEYS.contentTooLarge]: "Content too large: {{size}} bytes",
68
74
  [BROWSER_KEYS.failedToParseJSON]: "Failed to parse JSON: {{error}}",
69
75
  [BROWSER_KEYS.startingBrowserFetchForMarkdown]: "Starting browser fetch for Markdown",
@@ -78,9 +84,41 @@ export default {
78
84
  [BROWSER_KEYS.browserStartupFailed]: "Browser startup failed: {{error}}",
79
85
  [BROWSER_KEYS.usingCustomChromePath]: "Using custom Chrome path: {{path}}",
80
86
  [BROWSER_KEYS.browserDisconnected]: "Browser disconnected",
81
- [BROWSER_KEYS.waitingForBrowserStart]: "Waiting for browser to start...",
87
+ [BROWSER_KEYS.waitingForBrowserStart]: "Waiting for browser to start",
82
88
  [BROWSER_KEYS.reusingExistingBrowser]: "Reusing existing browser instance",
83
89
  [BROWSER_KEYS.startingBrowser]: "Starting browser...",
84
90
  [BROWSER_KEYS.browserStarted]: "Browser started",
85
- [BROWSER_KEYS.browserStartError]: "Browser start error: {{error}}"
91
+ [BROWSER_KEYS.browserStartError]: "Browser start error: {{error}}",
92
+ // Fetch 相关 (Fetch related)
93
+ [BROWSER_KEYS.htmlFetchError]: "Error fetching HTML: {{error}}",
94
+ [BROWSER_KEYS.jsonFetchError]: "Error fetching JSON: {{error}}",
95
+ [BROWSER_KEYS.txtFetchError]: "Error fetching text: {{error}}",
96
+ [BROWSER_KEYS.markdownFetchError]: "Error fetching Markdown: {{error}}",
97
+ [BROWSER_KEYS.creatingTurndown]: "Creating Turndown instance for Markdown conversion",
98
+ [BROWSER_KEYS.convertingToMarkdown]: "Converting HTML to Markdown",
99
+ [BROWSER_KEYS.markdownContentLength]: "Markdown content length: {{length}} bytes",
100
+ [BROWSER_KEYS.startingJsonFetch]: "Starting JSON fetch",
101
+ [BROWSER_KEYS.startingTxtFetch]: "Starting text fetch",
102
+ [BROWSER_KEYS.startingMarkdownFetch]: "Starting Markdown fetch",
103
+ [BROWSER_KEYS.startingPlainTextFetch]: "Starting plain text fetch",
104
+ [BROWSER_KEYS.extractingText]: "Extracting text from HTML content",
105
+ [BROWSER_KEYS.textExtracted]: "Text extracted, length: {{length}} bytes",
106
+ [BROWSER_KEYS.jsonParsed]: "JSON parsed successfully",
107
+ [BROWSER_KEYS.jsonParseError]: "Error parsing JSON: {{error}}",
108
+ // 代理相关 (Proxy related)
109
+ [BROWSER_KEYS.proxyConnected]: "Connected to proxy: {{proxy}}",
110
+ [BROWSER_KEYS.proxyError]: "Proxy error: {{error}}",
111
+ // 响应相关 (Response related)
112
+ [BROWSER_KEYS.responseStatus]: "Response status: {{status}}",
113
+ [BROWSER_KEYS.responseError]: "Response error: {{error}}",
114
+ [BROWSER_KEYS.responseSuccess]: "Response successful",
115
+ [BROWSER_KEYS.responseRedirect]: "Response redirected to: {{url}}",
116
+ [BROWSER_KEYS.responseTimeout]: "Response timeout after {{timeout}}ms",
117
+ // 错误处理 (Error handling)
118
+ [BROWSER_KEYS.errorResponse]: "Error response from server: {{status}}",
119
+ [BROWSER_KEYS.errorResponseBody]: "Error response body: {{body}}",
120
+ [BROWSER_KEYS.accessDenied]: "Access denied: {{status}} - {{message}}",
121
+ [BROWSER_KEYS.timeoutError]: "Request timed out after {{timeout}}ms",
122
+ [BROWSER_KEYS.networkError]: "Network error: {{error}}",
123
+ [BROWSER_KEYS.unknownError]: "Unknown error: {{error}}"
86
124
  };
@@ -0,0 +1,41 @@
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
+ import { CHUNK_MANAGER_KEYS } from '../../keys/chunkManager.js';
7
+ /**
8
+ * 分段管理相关的英文文本 (English texts related to chunk management)
9
+ */
10
+ export const chunkManagerEn = {
11
+ // 分段管理基础操作 (Basic chunk management operations)
12
+ [CHUNK_MANAGER_KEYS.startingManager]: "Starting chunk manager",
13
+ [CHUNK_MANAGER_KEYS.creatingChunks]: "Creating content chunks",
14
+ [CHUNK_MANAGER_KEYS.splittingContent]: "Splitting content into chunks. Content size: {{contentSize}} bytes",
15
+ [CHUNK_MANAGER_KEYS.creatingChunk]: "Creating chunk {{index}} of {{total}}",
16
+ [CHUNK_MANAGER_KEYS.chunksCreated]: "Created {{count}} chunks from content",
17
+ [CHUNK_MANAGER_KEYS.calculatingChunks]: "Calculating number of chunks needed",
18
+ [CHUNK_MANAGER_KEYS.totalChunks]: "Total chunks: {{total}}, content size: {{contentSize}} bytes, chunk size: {{chunkSize}} bytes",
19
+ [CHUNK_MANAGER_KEYS.storedChunks]: "Stored chunks: {{count}}",
20
+ [CHUNK_MANAGER_KEYS.cleanedUpExpiredChunks]: "Cleaned up {{count}} expired chunks",
21
+ // 分段相关错误 (Chunk related errors)
22
+ [CHUNK_MANAGER_KEYS.invalidChunkId]: "Invalid chunk ID: {{chunkId}}",
23
+ [CHUNK_MANAGER_KEYS.chunkNotFound]: "Chunk not found: {{chunkId}}",
24
+ [CHUNK_MANAGER_KEYS.chunkIdNotFound]: "Chunk ID not found in storage: {{chunkId}}",
25
+ [CHUNK_MANAGER_KEYS.invalidByteRange]: "Invalid byte range: start={{start}}, end={{end}}",
26
+ [CHUNK_MANAGER_KEYS.invalidStartCursor]: "Invalid start cursor value: {{cursor}}",
27
+ [CHUNK_MANAGER_KEYS.splitError]: "Error splitting content: {{error}}",
28
+ [CHUNK_MANAGER_KEYS.sizeInfoNotFound]: "Size information not found for chunk: {{chunkId}}",
29
+ // 分段内容控制 (Chunk content control)
30
+ [CHUNK_MANAGER_KEYS.gettingChunk]: "Getting chunk: {{chunkId}}",
31
+ [CHUNK_MANAGER_KEYS.chunkRetrieved]: "Chunk retrieved: {{chunkId}}, size: {{size}} bytes",
32
+ [CHUNK_MANAGER_KEYS.retrievedChunkBySize]: "Retrieved chunk by size parameters: startCursor={{startCursor}}, size={{size}}",
33
+ [CHUNK_MANAGER_KEYS.contentExceedsLimit]: "Content exceeds size limit: {{contentSize}} bytes (limit: {{limit}} bytes)",
34
+ [CHUNK_MANAGER_KEYS.byteRangeSplit]: "Splitting content by byte range: {{start}}-{{end}} of {{total}} bytes",
35
+ [CHUNK_MANAGER_KEYS.byteLimitApplied]: "Byte limit applied: {{limit}} bytes",
36
+ // 进度和统计 (Progress and statistics)
37
+ [CHUNK_MANAGER_KEYS.processingChunk]: "Processing chunk {{current}} of {{total}}",
38
+ [CHUNK_MANAGER_KEYS.chunkStats]: "Chunk statistics - Total: {{total}}, Average size: {{avgSize}} bytes, Max size: {{maxSize}} bytes",
39
+ [CHUNK_MANAGER_KEYS.remainingChunks]: "Remaining chunks: {{remaining}} of {{total}}",
40
+ [CHUNK_MANAGER_KEYS.chunkProgress]: "Chunk progress: {{percent}}% complete ({{processed}}/{{total}} chunks)"
41
+ };
@@ -28,16 +28,58 @@ export default {
28
28
  [CLIENT_KEYS.fetchingMarkdown]: 'Fetching Markdown from {{url}}',
29
29
  [CLIENT_KEYS.fetchSuccessful]: 'Fetch successful',
30
30
  [CLIENT_KEYS.contentLength]: 'Content length: {{length}} bytes',
31
+ // 分段内容相关 (Chunked content related)
32
+ [CLIENT_KEYS.hasMoreChunks]: 'Content is chunked: {{current}}/{{total}} chunks',
33
+ [CLIENT_KEYS.nextChunkCommand]: 'To fetch the next chunk, run: {{command}}',
34
+ [CLIENT_KEYS.chunkInfoSaved]: 'Chunk information saved to {{file}}',
35
+ [CLIENT_KEYS.chunkInfoSaveError]: 'Failed to save chunk information: {{error}}',
36
+ [CLIENT_KEYS.chunkInfoLoaded]: 'Chunk information loaded from {{file}}',
37
+ [CLIENT_KEYS.chunkInfoLoadError]: 'Failed to load chunk information: {{error}}',
38
+ [CLIENT_KEYS.noChunkInfo]: 'No previous chunk information found',
39
+ [CLIENT_KEYS.fetchingNextChunk]: 'Fetching next chunk ({{chunkIndex}}/{{total}})',
40
+ [CLIENT_KEYS.chunkUsageInfo]: 'For chunked content: Use --all-chunks to fetch all chunks at once',
41
+ [CLIENT_KEYS.invalidChunkIndex]: 'Invalid chunk index: {{index}}',
42
+ [CLIENT_KEYS.missingMethodOrUrl]: 'Missing method or URL parameters',
43
+ [CLIENT_KEYS.fetchingAllChunks]: 'Fetching all chunks, total: {{total}}',
44
+ [CLIENT_KEYS.fetchingChunk]: 'Fetching chunk {{index}}/{{total}}',
45
+ [CLIENT_KEYS.fetchChunkFailed]: 'Failed to fetch chunk {{index}}: {{error}}',
46
+ [CLIENT_KEYS.allChunksFetched]: 'All chunks fetched, total: {{total}}',
47
+ [CLIENT_KEYS.allChunksCommand]: 'To fetch all chunks at once, run: {{command}}',
48
+ [CLIENT_KEYS.allChunksUsageInfo]: 'Use --all-chunks to fetch all chunks in a single command',
49
+ [CLIENT_KEYS.limitingChunks]: 'Limiting chunks to {{limit}} (total: {{total}})',
50
+ [CLIENT_KEYS.maxChunksUsageInfo]: 'Use --max-chunks=N to limit the number of chunks to fetch (default: {{default}})',
51
+ // 新增的分段内容相关键 (New chunked content related keys)
52
+ [CLIENT_KEYS.responseStructure]: '\n--- Response structure ---\n{{structure}}\n--- End of response structure ---\n',
53
+ [CLIENT_KEYS.parsedByteChunkInfo]: '\n--- Parsed byte-level chunk information ---\nchunkId: {{chunkId}}\nfetchedBytes: {{fetchedBytes}}\ntotalBytes: {{totalBytes}}\nremainingBytes: {{remainingBytes}}\nestimatedRemainingRequests: {{estimatedRemainingRequests}}\n--- End of parsed byte-level chunk information ---\n',
54
+ [CLIENT_KEYS.parsedChunkInfo]: '\n--- Parsed chunk information ---\nchunkId: {{chunkId}}\ncurrentChunk: {{currentChunk}}\ntotalChunks: {{totalChunks}}\nhasMoreChunks: {{hasMoreChunks}}\n--- End of parsed chunk information ---\n',
55
+ [CLIENT_KEYS.chunkLimitNotice]: '\nNote: Content has {{total}} chunks, but only fetching first {{fetching}} chunks',
56
+ [CLIENT_KEYS.chunkLimitHint]: 'To fetch more chunks, use --max-chunks=N parameter\n',
57
+ [CLIENT_KEYS.fetchingChunkProgress]: '\nFetching chunk {{current}}/{{total}}...',
58
+ [CLIENT_KEYS.fetchChunkFailedError]: '\nFailed to fetch chunk {{index}}: {{error}}\n',
59
+ [CLIENT_KEYS.chunkContent]: '\n--- Chunk {{index}} ---\n',
60
+ [CLIENT_KEYS.chunkSeparator]: '\n' + '-'.repeat(80),
61
+ [CLIENT_KEYS.partialChunksFetched]: '\nFetched {{fetched}}/{{total}} chunks\n',
62
+ [CLIENT_KEYS.completeChunksFetched]: '\nAll chunks fetched, total: {{total}}\n',
63
+ [CLIENT_KEYS.fetchingChunksErrorMessage]: '\nError fetching chunks: {{error}}\n',
64
+ [CLIENT_KEYS.contentChunkedBytes]: '\nContent is chunked: retrieved {{fetched}} bytes of total {{total}} bytes',
65
+ [CLIENT_KEYS.contentChunkedCount]: '\nContent is chunked: {{current}}/{{total}} chunks',
66
+ [CLIENT_KEYS.fetchAllChunksHint]: 'To fetch all chunks, run:\n{{command}}\n',
67
+ [CLIENT_KEYS.fetchLimitedChunksHint]: 'To fetch first {{limit}} chunks, run:\n{{command}}\n',
68
+ [CLIENT_KEYS.firstChunkCompleted]: '\nFirst chunk completed: {{index}}/{{total}}\n',
69
+ [CLIENT_KEYS.chunkProgress]: '\nChunk {{current}}/{{total}} completed, retrieved {{fetchedBytes}}/{{totalBytes}} bytes ({{percent}}%)\n',
70
+ [CLIENT_KEYS.chunkCompleted]: '\nChunk {{current}}/{{total}} completed\n',
71
+ [CLIENT_KEYS.recalculatedTotalChunks]: 'Recalculated total chunks: {{totalChunks}} (based on totalBytes: {{totalBytes}}, fetchedBytes: {{fetchedBytes}}, remainingBytes: {{remainingBytes}}, contentSizeLimit: {{contentSizeLimit}})',
72
+ [CLIENT_KEYS.fetchingChunksError]: 'Error occurred while fetching chunks: {{error}}',
31
73
  // 调试相关 (Debug related)
32
74
  [CLIENT_KEYS.debugMode]: 'Debug mode: {{enabled}}',
33
75
  [CLIENT_KEYS.debugInfo]: 'Debug info: {{info}}',
34
- // 原有键 (Original keys)
76
+ // 其他键 (Other keys)
35
77
  [CLIENT_KEYS.error]: 'Error: {{error}}',
36
- [CLIENT_KEYS.callTool]: 'Calling tool: {{name}}',
37
- [CLIENT_KEYS.callToolSuccess]: 'Tool call successful: {{name}}',
38
- [CLIENT_KEYS.callToolError]: 'Tool call error: {{name}} - {{error}}',
39
- [CLIENT_KEYS.statusCodeDetected]: 'Status code detected: {{code}}',
40
- [CLIENT_KEYS.usageInfo]: 'Usage info: {{info}}',
78
+ [CLIENT_KEYS.callTool]: 'Calling tool: {{tool}}',
79
+ [CLIENT_KEYS.callToolSuccess]: 'Tool call successful: {{tool}}',
80
+ [CLIENT_KEYS.callToolError]: 'Tool call error: {{tool}} - {{error}}',
81
+ [CLIENT_KEYS.statusCodeDetected]: 'Status code detected: {{statusCode}}',
82
+ [CLIENT_KEYS.usageInfo]: 'Usage: {{usage}}',
41
83
  [CLIENT_KEYS.exampleUsage]: 'Example usage: {{example}}',
42
84
  [CLIENT_KEYS.invalidJson]: 'Invalid JSON: {{error}}',
43
85
  [CLIENT_KEYS.usingCommandLineProxy]: 'Using command line proxy: {{proxy}}',
@@ -47,7 +89,7 @@ export default {
47
89
  [CLIENT_KEYS.noShellProxy]: 'No shell proxy found',
48
90
  [CLIENT_KEYS.systemProxyDisabled]: 'System proxy disabled',
49
91
  [CLIENT_KEYS.usingSystemProxy]: 'Using system proxy: {{proxy}}',
50
- [CLIENT_KEYS.noSystemProxy]: 'No system proxy found',
92
+ [CLIENT_KEYS.noSystemProxy]: 'No system proxy',
51
93
  [CLIENT_KEYS.requestFailed]: 'Request failed: {{error}}',
52
94
  [CLIENT_KEYS.fatalError]: 'Fatal error: {{error}}',
53
95
  [CLIENT_KEYS.startingServer]: 'Starting server...',
@@ -55,10 +97,21 @@ export default {
55
97
  [CLIENT_KEYS.usingMode]: 'Using {{mode}} mode',
56
98
  [CLIENT_KEYS.fetchFailed]: 'Fetch failed: {{error}}',
57
99
  [CLIENT_KEYS.fetchSuccess]: 'Fetch successful',
58
- [CLIENT_KEYS.browserModeNeeded]: 'Browser mode needed for: {{url}}',
100
+ [CLIENT_KEYS.browserModeNeeded]: 'Browser mode needed',
59
101
  [CLIENT_KEYS.retryingWithBrowser]: 'Retrying with browser mode',
60
102
  [CLIENT_KEYS.browserModeFetchFailed]: 'Browser mode fetch failed: {{error}}',
61
103
  [CLIENT_KEYS.browserModeFetchSuccess]: 'Browser mode fetch successful',
62
104
  [CLIENT_KEYS.serverClosed]: 'Server closed',
63
- [CLIENT_KEYS.proxySet]: 'Proxy set: {{proxy}}'
105
+ [CLIENT_KEYS.proxySet]: 'Proxy set: {{proxy}}',
106
+ // 模式相关 (Mode related)
107
+ [CLIENT_KEYS.usingStandardMode]: 'Using standard mode',
108
+ [CLIENT_KEYS.usingBrowserMode]: 'Using browser mode',
109
+ [CLIENT_KEYS.switchingToBrowserMode]: 'Switching to browser mode',
110
+ // 参数相关 (Parameters related)
111
+ [CLIENT_KEYS.sendingParameters]: 'Sending parameters to MCP: {{params}}',
112
+ [CLIENT_KEYS.invalidUrl]: 'Invalid URL: {{url}}',
113
+ [CLIENT_KEYS.missingUrl]: 'Missing URL parameter',
114
+ [CLIENT_KEYS.missingStartCursor]: 'Missing startCursor parameter',
115
+ // 其他 (Others)
116
+ [CLIENT_KEYS.alternateUsageInfo]: 'For alternate formats, use --plaintext or --markdown flags'
64
117
  };
@@ -0,0 +1,17 @@
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
+ import { CONTENT_SIZE_KEYS } from '../../keys/contentSize.js';
7
+ /**
8
+ * 内容大小相关的英文文本 (English texts related to content size)
9
+ */
10
+ export const contentSizeEn = {
11
+ [CONTENT_SIZE_KEYS.checking]: 'Checking content size: {{contentSize}}, limit: {{limit}}, exceeds limit: {{exceedsLimit}}',
12
+ [CONTENT_SIZE_KEYS.truncating]: 'Content size exceeds limit, truncating. Original size: {{originalSize}}, limit: {{limit}}',
13
+ [CONTENT_SIZE_KEYS.truncated]: 'Content truncated. Final size: {{finalSize}}, limit: {{limit}}',
14
+ [CONTENT_SIZE_KEYS.splitting]: 'Content size exceeds limit, splitting. Original size: {{originalSize}}, chunk size: {{chunkSize}}',
15
+ [CONTENT_SIZE_KEYS.splitComplete]: 'Content splitting complete. Total {{chunks}} chunks, average size: {{avgChunkSize}}',
16
+ [CONTENT_SIZE_KEYS.splitIntoChunks]: 'Splitting content into {{chunkCount}} chunks of approximately {{chunkSize}} bytes each'
17
+ };