xhs-mcp 0.6.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 (133) hide show
  1. package/LICENSE +21 -0
  2. package/README.en.md +122 -0
  3. package/README.md +180 -0
  4. package/dist/cli/xhs-cli.d.ts +6 -0
  5. package/dist/cli/xhs-cli.d.ts.map +1 -0
  6. package/dist/cli/xhs-cli.js +300 -0
  7. package/dist/cli/xhs-cli.js.map +1 -0
  8. package/dist/index.d.ts +6 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +58 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/lib/auth/auth.service.d.ts +12 -0
  13. package/dist/lib/auth/auth.service.d.ts.map +1 -0
  14. package/dist/lib/auth/auth.service.js +138 -0
  15. package/dist/lib/auth/auth.service.js.map +1 -0
  16. package/dist/lib/auth/auth.types.d.ts +17 -0
  17. package/dist/lib/auth/auth.types.d.ts.map +1 -0
  18. package/dist/lib/auth/auth.types.js +5 -0
  19. package/dist/lib/auth/auth.types.js.map +1 -0
  20. package/dist/lib/auth/index.d.ts +6 -0
  21. package/dist/lib/auth/index.d.ts.map +1 -0
  22. package/dist/lib/auth/index.js +6 -0
  23. package/dist/lib/auth/index.js.map +1 -0
  24. package/dist/lib/browser/browser.manager.d.ts +22 -0
  25. package/dist/lib/browser/browser.manager.d.ts.map +1 -0
  26. package/dist/lib/browser/browser.manager.js +196 -0
  27. package/dist/lib/browser/browser.manager.js.map +1 -0
  28. package/dist/lib/browser/browser.types.d.ts +23 -0
  29. package/dist/lib/browser/browser.types.d.ts.map +1 -0
  30. package/dist/lib/browser/browser.types.js +5 -0
  31. package/dist/lib/browser/browser.types.js.map +1 -0
  32. package/dist/lib/browser/index.d.ts +6 -0
  33. package/dist/lib/browser/index.d.ts.map +1 -0
  34. package/dist/lib/browser/index.js +6 -0
  35. package/dist/lib/browser/index.js.map +1 -0
  36. package/dist/lib/feeds/feed.service.d.ts +13 -0
  37. package/dist/lib/feeds/feed.service.d.ts.map +1 -0
  38. package/dist/lib/feeds/feed.service.js +224 -0
  39. package/dist/lib/feeds/feed.service.js.map +1 -0
  40. package/dist/lib/feeds/feed.types.d.ts +26 -0
  41. package/dist/lib/feeds/feed.types.d.ts.map +1 -0
  42. package/dist/lib/feeds/feed.types.js +5 -0
  43. package/dist/lib/feeds/feed.types.js.map +1 -0
  44. package/dist/lib/feeds/index.d.ts +6 -0
  45. package/dist/lib/feeds/index.d.ts.map +1 -0
  46. package/dist/lib/feeds/index.js +6 -0
  47. package/dist/lib/feeds/index.js.map +1 -0
  48. package/dist/lib/index.d.ts +9 -0
  49. package/dist/lib/index.d.ts.map +1 -0
  50. package/dist/lib/index.js +11 -0
  51. package/dist/lib/index.js.map +1 -0
  52. package/dist/lib/publishing/index.d.ts +6 -0
  53. package/dist/lib/publishing/index.d.ts.map +1 -0
  54. package/dist/lib/publishing/index.js +6 -0
  55. package/dist/lib/publishing/index.js.map +1 -0
  56. package/dist/lib/publishing/publish.service.d.ts +39 -0
  57. package/dist/lib/publishing/publish.service.d.ts.map +1 -0
  58. package/dist/lib/publishing/publish.service.js +942 -0
  59. package/dist/lib/publishing/publish.service.js.map +1 -0
  60. package/dist/lib/publishing/publish.types.d.ts +37 -0
  61. package/dist/lib/publishing/publish.types.d.ts.map +1 -0
  62. package/dist/lib/publishing/publish.types.js +5 -0
  63. package/dist/lib/publishing/publish.types.js.map +1 -0
  64. package/dist/lib/shared/base.service.d.ts +22 -0
  65. package/dist/lib/shared/base.service.d.ts.map +1 -0
  66. package/dist/lib/shared/base.service.js +28 -0
  67. package/dist/lib/shared/base.service.js.map +1 -0
  68. package/dist/lib/shared/config.d.ts +17 -0
  69. package/dist/lib/shared/config.d.ts.map +1 -0
  70. package/dist/lib/shared/config.js +133 -0
  71. package/dist/lib/shared/config.js.map +1 -0
  72. package/dist/lib/shared/cookies.d.ts +10 -0
  73. package/dist/lib/shared/cookies.d.ts.map +1 -0
  74. package/dist/lib/shared/cookies.js +79 -0
  75. package/dist/lib/shared/cookies.js.map +1 -0
  76. package/dist/lib/shared/errors.d.ts +51 -0
  77. package/dist/lib/shared/errors.d.ts.map +1 -0
  78. package/dist/lib/shared/errors.js +93 -0
  79. package/dist/lib/shared/errors.js.map +1 -0
  80. package/dist/lib/shared/index.d.ts +11 -0
  81. package/dist/lib/shared/index.d.ts.map +1 -0
  82. package/dist/lib/shared/index.js +18 -0
  83. package/dist/lib/shared/index.js.map +1 -0
  84. package/dist/lib/shared/logger.d.ts +16 -0
  85. package/dist/lib/shared/logger.d.ts.map +1 -0
  86. package/dist/lib/shared/logger.js +41 -0
  87. package/dist/lib/shared/logger.js.map +1 -0
  88. package/dist/lib/shared/types.d.ts +175 -0
  89. package/dist/lib/shared/types.d.ts.map +1 -0
  90. package/dist/lib/shared/types.js +6 -0
  91. package/dist/lib/shared/types.js.map +1 -0
  92. package/dist/lib/shared/utils.d.ts +78 -0
  93. package/dist/lib/shared/utils.d.ts.map +1 -0
  94. package/dist/lib/shared/utils.js +137 -0
  95. package/dist/lib/shared/utils.js.map +1 -0
  96. package/dist/server/handlers/index.d.ts +6 -0
  97. package/dist/server/handlers/index.d.ts.map +1 -0
  98. package/dist/server/handlers/index.js +6 -0
  99. package/dist/server/handlers/index.js.map +1 -0
  100. package/dist/server/handlers/resource.handlers.d.ts +18 -0
  101. package/dist/server/handlers/resource.handlers.d.ts.map +1 -0
  102. package/dist/server/handlers/resource.handlers.js +113 -0
  103. package/dist/server/handlers/resource.handlers.js.map +1 -0
  104. package/dist/server/handlers/tool.handlers.d.ts +64 -0
  105. package/dist/server/handlers/tool.handlers.d.ts.map +1 -0
  106. package/dist/server/handlers/tool.handlers.js +123 -0
  107. package/dist/server/handlers/tool.handlers.js.map +1 -0
  108. package/dist/server/http.server.d.ts +21 -0
  109. package/dist/server/http.server.d.ts.map +1 -0
  110. package/dist/server/http.server.js +310 -0
  111. package/dist/server/http.server.js.map +1 -0
  112. package/dist/server/index.d.ts +7 -0
  113. package/dist/server/index.d.ts.map +1 -0
  114. package/dist/server/index.js +7 -0
  115. package/dist/server/index.js.map +1 -0
  116. package/dist/server/mcp.server.d.ts +15 -0
  117. package/dist/server/mcp.server.d.ts.map +1 -0
  118. package/dist/server/mcp.server.js +61 -0
  119. package/dist/server/mcp.server.js.map +1 -0
  120. package/dist/server/schemas/tool.schemas.d.ts +20 -0
  121. package/dist/server/schemas/tool.schemas.d.ts.map +1 -0
  122. package/dist/server/schemas/tool.schemas.js +178 -0
  123. package/dist/server/schemas/tool.schemas.js.map +1 -0
  124. package/dist/utils/index.d.ts +5 -0
  125. package/dist/utils/index.d.ts.map +1 -0
  126. package/dist/utils/index.js +5 -0
  127. package/dist/utils/index.js.map +1 -0
  128. package/dist/utils/xhs.utils.d.ts +14 -0
  129. package/dist/utils/xhs.utils.d.ts.map +1 -0
  130. package/dist/utils/xhs.utils.js +84 -0
  131. package/dist/utils/xhs.utils.js.map +1 -0
  132. package/docs/HTTP_TRANSPORTS.md +269 -0
  133. package/package.json +59 -0
package/dist/index.js ADDED
@@ -0,0 +1,58 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Main entry point for XHS MCP Server
4
+ */
5
+ import { Command } from 'commander';
6
+ import { XHSMCPServer } from './server/mcp.server.js';
7
+ import { XHSHTTPMCPServer } from './server/http.server.js';
8
+ import { getConfig } from './lib/shared/config.js';
9
+ async function main() {
10
+ const config = getConfig();
11
+ const program = new Command();
12
+ program
13
+ .name('xhs-mcp')
14
+ .description(`XHS MCP Server v${config.server.version}`)
15
+ .version(config.server.version)
16
+ .option('-m, --mode <mode>', 'Server mode: stdio or http', 'stdio')
17
+ .option('-p, --port <port>', 'HTTP server port (only for http mode)', '3000')
18
+ .parse();
19
+ const options = program.opts();
20
+ try {
21
+ if (options.mode === 'http') {
22
+ const port = parseInt(options.port, 10);
23
+ const httpServer = new XHSHTTPMCPServer(port);
24
+ await httpServer.start();
25
+ }
26
+ else {
27
+ // In stdio mode, we must not output anything to stdout/stderr except MCP protocol messages
28
+ // This prevents interference with MCP communication
29
+ const server = new XHSMCPServer();
30
+ await server.start();
31
+ }
32
+ }
33
+ catch (error) {
34
+ // Only log to stderr if logging is explicitly enabled
35
+ if (process.env.XHS_ENABLE_LOGGING === 'true') {
36
+ process.stderr.write(`Server failed to start: ${error}\n`);
37
+ }
38
+ process.exit(1);
39
+ }
40
+ }
41
+ // Handle graceful shutdown
42
+ process.on('SIGINT', () => {
43
+ // Don't log to stderr in stdio mode to avoid interfering with MCP protocol
44
+ process.exit(0);
45
+ });
46
+ process.on('SIGTERM', () => {
47
+ // Don't log to stderr in stdio mode to avoid interfering with MCP protocol
48
+ process.exit(0);
49
+ });
50
+ // Start the server
51
+ main().catch((error) => {
52
+ // Only log to stderr if logging is explicitly enabled
53
+ if (process.env.XHS_ENABLE_LOGGING === 'true') {
54
+ process.stderr.write(`Fatal error: ${error}\n`);
55
+ }
56
+ process.exit(1);
57
+ });
58
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,SAAS,CAAC;SACf,WAAW,CAAC,mBAAmB,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;SACvD,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;SAC9B,MAAM,CAAC,mBAAmB,EAAE,4BAA4B,EAAE,OAAO,CAAC;SAClE,MAAM,CAAC,mBAAmB,EAAE,uCAAuC,EAAE,MAAM,CAAC;SAC5E,KAAK,EAAE,CAAC;IAEX,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAE/B,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACxC,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,2FAA2F;YAC3F,oDAAoD;YACpD,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAClC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,sDAAsD;QACtD,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,MAAM,EAAE,CAAC;YAC9C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,KAAK,IAAI,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,2BAA2B;AAC3B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,2EAA2E;IAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;IACzB,2EAA2E;IAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,mBAAmB;AACnB,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,sDAAsD;IACtD,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,MAAM,EAAE,CAAC;QAC9C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,KAAK,IAAI,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Authentication service for XHS MCP Server
3
+ */
4
+ import { Config, LoginResult, StatusResult } from '../shared/types.js';
5
+ import { BaseService } from '../shared/base.service.js';
6
+ export declare class AuthService extends BaseService {
7
+ constructor(config: Config);
8
+ login(browserPath?: string, timeout?: number): Promise<LoginResult>;
9
+ logout(): Promise<LoginResult>;
10
+ checkStatus(browserPath?: string): Promise<StatusResult>;
11
+ }
12
+ //# sourceMappingURL=auth.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.service.d.ts","sourceRoot":"","sources":["../../../src/lib/auth/auth.service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAMxD,qBAAa,WAAY,SAAQ,WAAW;gBAC9B,MAAM,EAAE,MAAM;IAIpB,KAAK,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,MAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IA+ExE,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC;IA+B9B,WAAW,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;CAwB/D"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Authentication service for XHS MCP Server
3
+ */
4
+ import { LoginTimeoutError, LoginFailedError, XHSError } from '../shared/errors.js';
5
+ import { BaseService } from '../shared/base.service.js';
6
+ import { deleteCookiesFile } from '../shared/cookies.js';
7
+ import { isLoggedIn } from '../../utils/xhs.utils.js';
8
+ import { logger } from '../shared/logger.js';
9
+ import { sleep } from '../shared/utils.js';
10
+ export class AuthService extends BaseService {
11
+ constructor(config) {
12
+ super(config);
13
+ }
14
+ async login(browserPath, timeout = 300) {
15
+ try {
16
+ const page = await this.getBrowserManager().createPage(false, browserPath, true);
17
+ try {
18
+ // Navigate to explore page
19
+ await this.getBrowserManager().navigateWithRetry(page, this.getConfig().xhs.exploreUrl);
20
+ // Check if already logged in
21
+ if (await isLoggedIn(page)) {
22
+ return {
23
+ success: true,
24
+ message: 'Already logged in',
25
+ status: 'logged_in',
26
+ action: 'none',
27
+ };
28
+ }
29
+ // Wait for login completion
30
+ const checkInterval = 5; // Check every 5 seconds
31
+ const maxChecks = timeout / checkInterval;
32
+ for (let checkCount = 0; checkCount < maxChecks; checkCount++) {
33
+ try {
34
+ // Check if login completed with short timeout
35
+ await page.waitForSelector(this.getConfig().xhs.loginOkSelector, {
36
+ timeout: checkInterval * 1000,
37
+ });
38
+ // Login completed successfully
39
+ break;
40
+ }
41
+ catch (error) {
42
+ // Login not yet complete, continue checking
43
+ const elapsed = (checkCount + 1) * checkInterval;
44
+ const remaining = timeout - elapsed;
45
+ if (checkCount === maxChecks - 1) {
46
+ // Final timeout reached
47
+ throw new LoginTimeoutError(`Login timed out after ${timeout} seconds. Please complete QR code scanning or manual login in the browser window.`, {
48
+ timeout,
49
+ url: this.getConfig().xhs.exploreUrl,
50
+ elapsedTime: elapsed,
51
+ suggestion: 'Increase timeout parameter or complete login faster',
52
+ });
53
+ }
54
+ }
55
+ }
56
+ // Save cookies after successful login
57
+ await this.getBrowserManager().saveCookiesFromPage(page);
58
+ // Verify login success
59
+ await sleep(1000); // Brief wait for page to update
60
+ if (await isLoggedIn(page)) {
61
+ return {
62
+ success: true,
63
+ message: 'Login successful',
64
+ status: 'logged_in',
65
+ action: 'logged_in',
66
+ };
67
+ }
68
+ else {
69
+ throw new LoginFailedError('Login process completed but authentication verification failed');
70
+ }
71
+ }
72
+ finally {
73
+ await page.close();
74
+ }
75
+ }
76
+ catch (error) {
77
+ if (error instanceof LoginTimeoutError || error instanceof LoginFailedError) {
78
+ throw error;
79
+ }
80
+ logger.error(`Login failed with unexpected error: ${error}`);
81
+ throw new XHSError(`Login failed: ${error}`, 'LoginError', { timeout }, error);
82
+ }
83
+ }
84
+ async logout() {
85
+ try {
86
+ const success = deleteCookiesFile();
87
+ if (success) {
88
+ return {
89
+ success: true,
90
+ message: 'Logged out successfully (cookies deleted)',
91
+ status: 'logged_out',
92
+ action: 'logged_out',
93
+ };
94
+ }
95
+ else {
96
+ return {
97
+ success: false,
98
+ message: 'Failed to delete cookies file',
99
+ status: 'logged_out',
100
+ action: 'none',
101
+ };
102
+ }
103
+ }
104
+ catch (error) {
105
+ logger.error(`Logout failed: ${error}`);
106
+ return {
107
+ success: false,
108
+ message: `Logout failed: ${error}`,
109
+ status: 'logged_out',
110
+ action: 'none',
111
+ };
112
+ }
113
+ }
114
+ async checkStatus(browserPath) {
115
+ try {
116
+ const page = await this.getBrowserManager().createPage(true, browserPath, true);
117
+ try {
118
+ await this.getBrowserManager().navigateWithRetry(page, this.getConfig().xhs.exploreUrl);
119
+ await sleep(1000); // Wait for page to load
120
+ const loggedIn = await isLoggedIn(page);
121
+ return {
122
+ success: true,
123
+ loggedIn,
124
+ status: loggedIn ? 'logged_in' : 'logged_out',
125
+ urlChecked: this.getConfig().xhs.exploreUrl,
126
+ };
127
+ }
128
+ finally {
129
+ await page.close();
130
+ }
131
+ }
132
+ catch (error) {
133
+ logger.error(`Status check failed: ${error}`);
134
+ throw new XHSError(`Status check failed: ${error}`, 'StatusCheckError', {}, error);
135
+ }
136
+ }
137
+ }
138
+ //# sourceMappingURL=auth.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.service.js","sourceRoot":"","sources":["../../../src/lib/auth/auth.service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAoB,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACtG,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAkB,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,MAAM,OAAO,WAAY,SAAQ,WAAW;IAC1C,YAAY,MAAc;QACxB,KAAK,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,WAAoB,EAAE,UAAkB,GAAG;QACrD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;YAEjF,IAAI,CAAC;gBACH,2BAA2B;gBAC3B,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBAExF,6BAA6B;gBAC7B,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC3B,OAAO;wBACL,OAAO,EAAE,IAAI;wBACb,OAAO,EAAE,mBAAmB;wBAC5B,MAAM,EAAE,WAAW;wBACnB,MAAM,EAAE,MAAM;qBACf,CAAC;gBACJ,CAAC;gBAGD,4BAA4B;gBAC5B,MAAM,aAAa,GAAG,CAAC,CAAC,CAAC,wBAAwB;gBACjD,MAAM,SAAS,GAAG,OAAO,GAAG,aAAa,CAAC;gBAG1C,KAAK,IAAI,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,SAAS,EAAE,UAAU,EAAE,EAAE,CAAC;oBAC9D,IAAI,CAAC;wBACH,8CAA8C;wBAC9C,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,eAAe,EAAE;4BAC/D,OAAO,EAAE,aAAa,GAAG,IAAI;yBAC9B,CAAC,CAAC;wBACH,+BAA+B;wBAC/B,MAAM;oBACR,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,4CAA4C;wBAC5C,MAAM,OAAO,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC;wBACjD,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;wBAEpC,IAAI,UAAU,KAAK,SAAS,GAAG,CAAC,EAAE,CAAC;4BACjC,wBAAwB;4BACxB,MAAM,IAAI,iBAAiB,CACzB,yBAAyB,OAAO,mFAAmF,EACnH;gCACE,OAAO;gCACP,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,UAAU;gCACpC,WAAW,EAAE,OAAO;gCACpB,UAAU,EAAE,qDAAqD;6BAClE,CACF,CAAC;wBACJ,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,sCAAsC;gBACtC,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;gBAEzD,uBAAuB;gBACvB,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,gCAAgC;gBACnD,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC3B,OAAO;wBACL,OAAO,EAAE,IAAI;wBACb,OAAO,EAAE,kBAAkB;wBAC3B,MAAM,EAAE,WAAW;wBACnB,MAAM,EAAE,WAAW;qBACpB,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,gBAAgB,CAAC,gEAAgE,CAAC,CAAC;gBAC/F,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACrB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,iBAAiB,IAAI,KAAK,YAAY,gBAAgB,EAAE,CAAC;gBAC5E,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,uCAAuC,KAAK,EAAE,CAAC,CAAC;YAC7D,MAAM,IAAI,QAAQ,CAAC,iBAAiB,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,EAAE,KAAc,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;YAEpC,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,2CAA2C;oBACpD,MAAM,EAAE,YAAY;oBACpB,MAAM,EAAE,YAAY;iBACrB,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,+BAA+B;oBACxC,MAAM,EAAE,YAAY;oBACpB,MAAM,EAAE,MAAM;iBACf,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,kBAAkB,KAAK,EAAE,CAAC,CAAC;YACxC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,kBAAkB,KAAK,EAAE;gBAClC,MAAM,EAAE,YAAY;gBACpB,MAAM,EAAE,MAAM;aACf,CAAC;QACJ,CAAC;IACH,CAAC;IAGD,KAAK,CAAC,WAAW,CAAC,WAAoB;QACpC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;YAEhF,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBACxF,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB;gBAC3C,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;gBAExC,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,QAAQ;oBACR,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY;oBAC7C,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,UAAU;iBAC5C,CAAC;YACJ,CAAC;oBAAS,CAAC;gBACT,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACrB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,wBAAwB,KAAK,EAAE,CAAC,CAAC;YAC9C,MAAM,IAAI,QAAQ,CAAC,wBAAwB,KAAK,EAAE,EAAE,kBAAkB,EAAE,EAAE,EAAE,KAAc,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC;CAEF"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Authentication-related types for XHS MCP Server
3
+ */
4
+ export interface AuthServiceConfig {
5
+ config: any;
6
+ }
7
+ export interface LoginOptions {
8
+ browserPath?: string;
9
+ timeout?: number;
10
+ }
11
+ export interface StatusCheckOptions {
12
+ browserPath?: string;
13
+ quick?: boolean;
14
+ }
15
+ export type AuthStatus = 'logged_in' | 'logged_out' | 'unknown';
16
+ export type AuthAction = 'none' | 'logged_in' | 'logged_out' | 'failed';
17
+ //# sourceMappingURL=auth.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.types.d.ts","sourceRoot":"","sources":["../../../src/lib/auth/auth.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,GAAG,CAAC;CACb;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,YAAY,GAAG,SAAS,CAAC;AAChE,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,WAAW,GAAG,YAAY,GAAG,QAAQ,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Authentication-related types for XHS MCP Server
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=auth.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.types.js","sourceRoot":"","sources":["../../../src/lib/auth/auth.types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Authentication domain for XHS MCP Server
3
+ */
4
+ export * from './auth.service.js';
5
+ export * from './auth.types.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/auth/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Authentication domain for XHS MCP Server
3
+ */
4
+ export * from './auth.service.js';
5
+ export * from './auth.types.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/auth/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Browser Manager for XHS Operations
3
+ */
4
+ import { Page } from 'puppeteer';
5
+ import { Config } from '../shared/types.js';
6
+ export declare class BrowserManager {
7
+ private config;
8
+ private browser;
9
+ constructor(config?: Config);
10
+ createPage(headless?: boolean, executablePath?: string, loadCookiesFlag?: boolean): Promise<Page>;
11
+ private launchBrowser;
12
+ private loadCookiesIntoPage;
13
+ saveCookiesFromPage(page: Page): Promise<void>;
14
+ navigateWithRetry(page: Page, url: string, waitUntil?: 'load' | 'domcontentloaded' | 'networkidle0' | 'networkidle2', maxRetries?: number): Promise<void>;
15
+ waitForSelectorSafe(page: Page, selector: string, timeout?: number, visible?: boolean): Promise<boolean>;
16
+ waitForElementVisible(page: Page, selector: string, timeout?: number): Promise<boolean>;
17
+ waitForElementHidden(page: Page, selector: string, timeout?: number): Promise<boolean>;
18
+ cleanup(): Promise<void>;
19
+ private handlePuppeteerError;
20
+ }
21
+ export declare function getBrowserManager(): BrowserManager;
22
+ //# sourceMappingURL=browser.manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.manager.d.ts","sourceRoot":"","sources":["../../../src/lib/browser/browser.manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAkB,EAAW,IAAI,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,MAAM,EAAU,MAAM,oBAAoB,CAAC;AAOpD,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAwB;gBAE3B,MAAM,CAAC,EAAE,MAAM;IAIrB,UAAU,CACd,QAAQ,CAAC,EAAE,OAAO,EAClB,cAAc,CAAC,EAAE,MAAM,EACvB,eAAe,GAAE,OAAc,GAC9B,OAAO,CAAC,IAAI,CAAC;YA0BF,aAAa;YAmCb,mBAAmB;IA4B3B,mBAAmB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB9C,iBAAiB,CACrB,IAAI,EAAE,IAAI,EACV,GAAG,EAAE,MAAM,EACX,SAAS,GAAE,MAAM,GAAG,kBAAkB,GAAG,cAAc,GAAG,cAAuB,EACjF,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC;IA4BV,mBAAmB,CACvB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,GAAE,OAAc,GACtB,OAAO,CAAC,OAAO,CAAC;IAeb,qBAAqB,CACzB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC;IAIb,oBAAoB,CACxB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC;IAIb,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAY9B,OAAO,CAAC,oBAAoB;CAoC7B;AAKD,wBAAgB,iBAAiB,IAAI,cAAc,CAKlD"}
@@ -0,0 +1,196 @@
1
+ /**
2
+ * Browser Manager for XHS Operations
3
+ */
4
+ import puppeteer from 'puppeteer';
5
+ import { BrowserLaunchError, BrowserNavigationError, XHSError } from '../shared/errors.js';
6
+ import { getConfig } from '../shared/config.js';
7
+ import { loadCookies, saveCookies } from '../shared/cookies.js';
8
+ import { logger } from '../shared/logger.js';
9
+ import { sleep } from '../shared/utils.js';
10
+ export class BrowserManager {
11
+ config;
12
+ browser = null;
13
+ constructor(config) {
14
+ this.config = config || getConfig();
15
+ }
16
+ async createPage(headless, executablePath, loadCookiesFlag = true) {
17
+ try {
18
+ // Launch browser if not already launched
19
+ if (!this.browser) {
20
+ this.browser = await this.launchBrowser(headless, executablePath);
21
+ }
22
+ // Create new page
23
+ const page = await this.browser.newPage();
24
+ // Configure page timeouts
25
+ page.setDefaultTimeout(this.config.browser.defaultTimeout);
26
+ page.setDefaultNavigationTimeout(this.config.browser.navigationTimeout);
27
+ // Load cookies if requested
28
+ if (loadCookiesFlag) {
29
+ await this.loadCookiesIntoPage(page);
30
+ }
31
+ return page;
32
+ }
33
+ catch (error) {
34
+ logger.error(`Browser page creation error: ${error}`);
35
+ throw this.handlePuppeteerError(error, 'create_page');
36
+ }
37
+ }
38
+ async launchBrowser(headless, executablePath) {
39
+ const isHeadless = headless !== undefined ? headless : this.config.browser.headlessDefault;
40
+ try {
41
+ const launchOptions = {
42
+ headless: isHeadless,
43
+ slowMo: this.config.browser.slowmo,
44
+ args: [
45
+ '--no-sandbox',
46
+ '--disable-setuid-sandbox',
47
+ '--disable-dev-shm-usage',
48
+ '--disable-accelerated-2d-canvas',
49
+ '--no-first-run',
50
+ '--no-zygote',
51
+ '--disable-gpu'
52
+ ]
53
+ };
54
+ if (executablePath) {
55
+ launchOptions.executablePath = executablePath;
56
+ }
57
+ const browser = await puppeteer.launch(launchOptions);
58
+ return browser;
59
+ }
60
+ catch (error) {
61
+ logger.error(`Failed to launch browser: ${error}`);
62
+ throw new BrowserLaunchError(`Failed to launch browser: ${error}`, { headless: isHeadless, executablePath }, error);
63
+ }
64
+ }
65
+ async loadCookiesIntoPage(page) {
66
+ try {
67
+ const cookies = loadCookies();
68
+ if (!cookies) {
69
+ return false;
70
+ }
71
+ // Convert our cookie format to Puppeteer format
72
+ const puppeteerCookies = cookies.map(cookie => ({
73
+ name: cookie.name,
74
+ value: cookie.value,
75
+ domain: cookie.domain,
76
+ path: cookie.path,
77
+ expires: cookie.expires,
78
+ httpOnly: cookie.httpOnly,
79
+ secure: cookie.secure,
80
+ sameSite: cookie.sameSite
81
+ }));
82
+ await page.setCookie(...puppeteerCookies);
83
+ return true;
84
+ }
85
+ catch (error) {
86
+ logger.warn(`Failed to load cookies: ${error}`);
87
+ return false;
88
+ }
89
+ }
90
+ async saveCookiesFromPage(page) {
91
+ try {
92
+ const cookies = await page.cookies();
93
+ // Convert Puppeteer cookie format to our format
94
+ const ourCookies = cookies.map(cookie => ({
95
+ name: cookie.name,
96
+ value: cookie.value,
97
+ domain: cookie.domain,
98
+ path: cookie.path,
99
+ expires: cookie.expires,
100
+ httpOnly: cookie.httpOnly,
101
+ secure: cookie.secure,
102
+ sameSite: cookie.sameSite
103
+ }));
104
+ saveCookies(ourCookies);
105
+ }
106
+ catch (error) {
107
+ logger.error(`Failed to save cookies: ${error}`);
108
+ throw this.handlePuppeteerError(error, 'save_cookies');
109
+ }
110
+ }
111
+ async navigateWithRetry(page, url, waitUntil = 'load', maxRetries) {
112
+ const retries = maxRetries || this.config.xhs.maxRetries;
113
+ for (let attempt = 0; attempt <= retries; attempt++) {
114
+ try {
115
+ await page.goto(url, {
116
+ waitUntil,
117
+ timeout: this.config.browser.navigationTimeout
118
+ });
119
+ return;
120
+ }
121
+ catch (error) {
122
+ if (error instanceof Error && error.name === 'TimeoutError') {
123
+ if (attempt === retries) {
124
+ throw new BrowserNavigationError(`Failed to navigate to ${url} after ${retries + 1} attempts`, { url, attempts: attempt + 1 }, error);
125
+ }
126
+ await sleep(this.config.xhs.retryDelay * 1000);
127
+ }
128
+ else {
129
+ throw error;
130
+ }
131
+ }
132
+ }
133
+ }
134
+ async waitForSelectorSafe(page, selector, timeout, visible = true) {
135
+ try {
136
+ await page.waitForSelector(selector, {
137
+ timeout: timeout || this.config.browser.defaultTimeout,
138
+ visible
139
+ });
140
+ return true;
141
+ }
142
+ catch (error) {
143
+ if (error instanceof Error && error.name === 'TimeoutError') {
144
+ return false;
145
+ }
146
+ throw error;
147
+ }
148
+ }
149
+ async waitForElementVisible(page, selector, timeout) {
150
+ return this.waitForSelectorSafe(page, selector, timeout, true);
151
+ }
152
+ async waitForElementHidden(page, selector, timeout) {
153
+ return this.waitForSelectorSafe(page, selector, timeout, false);
154
+ }
155
+ async cleanup() {
156
+ if (this.browser) {
157
+ try {
158
+ await this.browser.close();
159
+ }
160
+ catch (error) {
161
+ logger.warn(`Error closing browser: ${error}`);
162
+ }
163
+ finally {
164
+ this.browser = null;
165
+ }
166
+ }
167
+ }
168
+ handlePuppeteerError(error, operation) {
169
+ const context = { operation };
170
+ if (error.name === 'TimeoutError') {
171
+ if (operation.toLowerCase().includes('login')) {
172
+ return new XHSError(`Login operation timed out during ${operation}`, 'LoginTimeoutError', context, error);
173
+ }
174
+ else {
175
+ return new XHSError(`Browser operation timed out: ${operation}`, 'BrowserError', context, error);
176
+ }
177
+ }
178
+ else {
179
+ if (error.message.toLowerCase().includes('navigation')) {
180
+ return new BrowserNavigationError(`Navigation failed during ${operation}: ${error.message}`, context, error);
181
+ }
182
+ else {
183
+ return new XHSError(`Browser error during ${operation}: ${error.message}`, 'BrowserError', context, error);
184
+ }
185
+ }
186
+ }
187
+ }
188
+ // Global browser manager instance
189
+ let globalBrowserManager = null;
190
+ export function getBrowserManager() {
191
+ if (!globalBrowserManager) {
192
+ globalBrowserManager = new BrowserManager();
193
+ }
194
+ return globalBrowserManager;
195
+ }
196
+ //# sourceMappingURL=browser.manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.manager.js","sourceRoot":"","sources":["../../../src/lib/browser/browser.manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Browser-related types for XHS MCP Server
3
+ */
4
+ import { Browser } from 'puppeteer';
5
+ import { Config } from '../shared/types';
6
+ export interface BrowserManagerConfig {
7
+ config: Config;
8
+ browser: Browser | null;
9
+ }
10
+ export interface BrowserLaunchOptions {
11
+ headless?: boolean;
12
+ executablePath?: string;
13
+ slowMo?: number;
14
+ args?: string[];
15
+ }
16
+ export interface PageOptions {
17
+ loadCookies?: boolean;
18
+ headless?: boolean;
19
+ executablePath?: string;
20
+ timeout?: number;
21
+ navigationTimeout?: number;
22
+ }
23
+ //# sourceMappingURL=browser.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.types.d.ts","sourceRoot":"","sources":["../../../src/lib/browser/browser.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAQ,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAU,MAAM,iBAAiB,CAAC;AAEjD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Browser-related types for XHS MCP Server
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=browser.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.types.js","sourceRoot":"","sources":["../../../src/lib/browser/browser.types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Browser management for XHS MCP Server
3
+ */
4
+ export * from './browser.manager.js';
5
+ export * from './browser.types.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/browser/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Browser management for XHS MCP Server
3
+ */
4
+ export * from './browser.manager.js';
5
+ export * from './browser.types.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/browser/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Feed operations service for XHS MCP Server
3
+ */
4
+ import { Config, FeedListResult, SearchResult, FeedDetailResult, CommentResult } from '../shared/types.js';
5
+ import { BaseService } from '../shared/base.service.js';
6
+ export declare class FeedService extends BaseService {
7
+ constructor(config: Config);
8
+ getFeedList(browserPath?: string): Promise<FeedListResult>;
9
+ searchFeeds(keyword: string, browserPath?: string): Promise<SearchResult>;
10
+ getFeedDetail(feedId: string, xsecToken: string, browserPath?: string): Promise<FeedDetailResult>;
11
+ commentOnFeed(feedId: string, xsecToken: string, note: string, browserPath?: string): Promise<CommentResult>;
12
+ }
13
+ //# sourceMappingURL=feed.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feed.service.d.ts","sourceRoot":"","sources":["../../../src/lib/feeds/feed.service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAY,MAAM,oBAAoB,CAAC;AAErH,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAKxD,qBAAa,WAAY,SAAQ,WAAW;gBAC9B,MAAM,EAAE,MAAM;IAIpB,WAAW,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAgE1D,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IA+CzE,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAmDjG,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;CA4EnH"}