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
@@ -0,0 +1,224 @@
1
+ /**
2
+ * Feed operations service for XHS MCP Server
3
+ */
4
+ import { FeedError, FeedParsingError, FeedNotFoundError, NotLoggedInError, XHSError } from '../shared/errors.js';
5
+ import { BaseService } from '../shared/base.service.js';
6
+ import { makeSearchUrl, makeFeedDetailUrl, extractInitialState, isLoggedIn } from '../../utils/xhs.utils.js';
7
+ import { logger } from '../shared/logger.js';
8
+ import { sleep } from '../shared/utils.js';
9
+ export class FeedService extends BaseService {
10
+ constructor(config) {
11
+ super(config);
12
+ }
13
+ async getFeedList(browserPath) {
14
+ try {
15
+ const page = await this.getBrowserManager().createPage(true, browserPath, true);
16
+ try {
17
+ await this.getBrowserManager().navigateWithRetry(page, this.getConfig().xhs.homeUrl);
18
+ await sleep(1000);
19
+ // Check if logged in
20
+ if (!(await isLoggedIn(page))) {
21
+ throw new NotLoggedInError('Must be logged in to access feed list', {
22
+ operation: 'get_feed_list',
23
+ });
24
+ }
25
+ // Extract initial state
26
+ const state = await extractInitialState(page);
27
+ if (!state) {
28
+ throw new FeedParsingError('Could not extract any initial state from page. The page may not be fully loaded or the state structure has changed.', {
29
+ url: this.getConfig().xhs.homeUrl,
30
+ suggestion: 'Try logging in first using xhs_auth_login tool',
31
+ });
32
+ }
33
+ const feedData = state.feed;
34
+ if (!feedData) {
35
+ throw new FeedParsingError('Could not find feed data in page state. You may need to log in first.', {
36
+ url: this.getConfig().xhs.homeUrl,
37
+ availableKeys: Object.keys(state),
38
+ suggestion: 'Try logging in first using xhs_auth_login tool',
39
+ });
40
+ }
41
+ const feedsData = feedData.feeds;
42
+ if (!feedsData) {
43
+ throw new FeedParsingError('Could not find feeds array in feed state.', {
44
+ url: this.getConfig().xhs.homeUrl,
45
+ feedKeys: Object.keys(feedData),
46
+ suggestion: 'Try logging in first using xhs_auth_login tool',
47
+ });
48
+ }
49
+ const feedsValue = feedsData._value || [];
50
+ return {
51
+ success: true,
52
+ feeds: feedsValue,
53
+ count: feedsValue.length,
54
+ source: 'home_page',
55
+ url: this.getConfig().xhs.homeUrl,
56
+ };
57
+ }
58
+ finally {
59
+ await page.close();
60
+ }
61
+ }
62
+ catch (error) {
63
+ if (error instanceof NotLoggedInError || error instanceof FeedParsingError) {
64
+ throw error;
65
+ }
66
+ logger.error(`Failed to get feed list: ${error}`);
67
+ throw new XHSError(`Failed to get feed list: ${error}`, 'GetFeedListError', {}, error);
68
+ }
69
+ }
70
+ async searchFeeds(keyword, browserPath) {
71
+ if (!keyword || !keyword.trim()) {
72
+ throw new FeedError('Search keyword cannot be empty');
73
+ }
74
+ const trimmedKeyword = keyword.trim();
75
+ try {
76
+ const page = await this.getBrowserManager().createPage(true, browserPath, true);
77
+ try {
78
+ const searchUrl = makeSearchUrl(trimmedKeyword);
79
+ await this.getBrowserManager().navigateWithRetry(page, searchUrl);
80
+ await sleep(1000);
81
+ // Extract search results
82
+ const state = await extractInitialState(page);
83
+ const searchData = state?.search;
84
+ if (!state || !searchData || !searchData.feeds) {
85
+ throw new FeedParsingError(`Could not extract search results for keyword: ${trimmedKeyword}`, {
86
+ keyword: trimmedKeyword,
87
+ url: searchUrl,
88
+ });
89
+ }
90
+ const feedsValue = searchData.feeds._value || [];
91
+ return {
92
+ success: true,
93
+ keyword: trimmedKeyword,
94
+ feeds: feedsValue,
95
+ count: feedsValue.length,
96
+ searchUrl,
97
+ };
98
+ }
99
+ finally {
100
+ await page.close();
101
+ }
102
+ }
103
+ catch (error) {
104
+ if (error instanceof FeedError) {
105
+ throw error;
106
+ }
107
+ logger.error(`Feed search failed for keyword '${trimmedKeyword}': ${error}`);
108
+ throw new XHSError(`Feed search failed: ${error}`, 'SearchFeedsError', { keyword: trimmedKeyword }, error);
109
+ }
110
+ }
111
+ async getFeedDetail(feedId, xsecToken, browserPath) {
112
+ if (!feedId || !xsecToken) {
113
+ throw new FeedError('Both feed_id and xsec_token are required');
114
+ }
115
+ try {
116
+ const page = await this.getBrowserManager().createPage(true, browserPath, true);
117
+ try {
118
+ const detailUrl = makeFeedDetailUrl(feedId, xsecToken);
119
+ await this.getBrowserManager().navigateWithRetry(page, detailUrl);
120
+ await sleep(1000);
121
+ const state = await extractInitialState(page);
122
+ const noteData = state?.note;
123
+ if (!state || !noteData || !noteData.noteDetailMap) {
124
+ throw new FeedParsingError(`Could not extract note details for feed: ${feedId}`, {
125
+ feedId,
126
+ url: detailUrl,
127
+ });
128
+ }
129
+ const noteDetailMap = noteData.noteDetailMap;
130
+ if (!(feedId in noteDetailMap)) {
131
+ throw new FeedNotFoundError(`Feed ${feedId} not found in note details`, {
132
+ feedId,
133
+ availableFeeds: Object.keys(noteDetailMap),
134
+ });
135
+ }
136
+ const detail = noteDetailMap[feedId];
137
+ return {
138
+ success: true,
139
+ feedId,
140
+ detail,
141
+ url: detailUrl,
142
+ };
143
+ }
144
+ finally {
145
+ await page.close();
146
+ }
147
+ }
148
+ catch (error) {
149
+ if (error instanceof FeedError || error instanceof FeedNotFoundError || error instanceof FeedParsingError) {
150
+ throw error;
151
+ }
152
+ logger.error(`Failed to get feed detail for ${feedId}: ${error}`);
153
+ throw new XHSError(`Failed to get feed detail: ${error}`, 'GetFeedDetailError', { feedId }, error);
154
+ }
155
+ }
156
+ async commentOnFeed(feedId, xsecToken, note, browserPath) {
157
+ if (!feedId || !xsecToken || !note) {
158
+ throw new FeedError('feed_id, xsec_token, and note are all required');
159
+ }
160
+ if (note.trim().length === 0) {
161
+ throw new FeedError('Comment note cannot be empty');
162
+ }
163
+ try {
164
+ const page = await this.getBrowserManager().createPage(false, browserPath, true);
165
+ try {
166
+ const detailUrl = makeFeedDetailUrl(feedId, xsecToken);
167
+ await this.getBrowserManager().navigateWithRetry(page, detailUrl);
168
+ await sleep(1000);
169
+ // Check if logged in
170
+ if (!(await isLoggedIn(page))) {
171
+ throw new NotLoggedInError('Must be logged in to comment on feeds', {
172
+ operation: 'comment_on_feed',
173
+ feedId,
174
+ });
175
+ }
176
+ // Click on comment input
177
+ const commentInputSelector = 'div.input-box div.content-edit span';
178
+ if (!(await this.getBrowserManager().waitForSelectorSafe(page, commentInputSelector))) {
179
+ throw new FeedError('Comment input not found on page', {
180
+ feedId,
181
+ selector: commentInputSelector,
182
+ });
183
+ }
184
+ const commentInput = await page.$(commentInputSelector);
185
+ if (commentInput) {
186
+ await commentInput.click();
187
+ }
188
+ // Fill comment note
189
+ const editorSelector = 'div.input-box div.content-edit p.content-input';
190
+ const editor = await page.$(editorSelector);
191
+ if (editor) {
192
+ await editor.click();
193
+ await editor.type(note, { delay: 30 });
194
+ }
195
+ await sleep(1000);
196
+ // Submit comment
197
+ const submitSelector = 'div.bottom button.submit';
198
+ const submitButton = await page.$(submitSelector);
199
+ if (submitButton) {
200
+ await submitButton.click();
201
+ }
202
+ await sleep(2000); // Wait for submission
203
+ return {
204
+ success: true,
205
+ message: 'Comment submitted successfully',
206
+ feedId,
207
+ note,
208
+ url: detailUrl,
209
+ };
210
+ }
211
+ finally {
212
+ await page.close();
213
+ }
214
+ }
215
+ catch (error) {
216
+ if (error instanceof FeedError || error instanceof NotLoggedInError) {
217
+ throw error;
218
+ }
219
+ logger.error(`Failed to comment on feed ${feedId}: ${error}`);
220
+ throw new XHSError(`Failed to comment on feed: ${error}`, 'CommentOnFeedError', { feedId }, error);
221
+ }
222
+ }
223
+ }
224
+ //# sourceMappingURL=feed.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feed.service.js","sourceRoot":"","sources":["../../../src/lib/feeds/feed.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Feed-related types for XHS MCP Server
3
+ */
4
+ export interface FeedServiceConfig {
5
+ config: any;
6
+ }
7
+ export interface FeedListOptions {
8
+ browserPath?: string;
9
+ }
10
+ export interface SearchOptions {
11
+ keyword: string;
12
+ browserPath?: string;
13
+ }
14
+ export interface FeedDetailOptions {
15
+ feedId: string;
16
+ xsecToken: string;
17
+ browserPath?: string;
18
+ }
19
+ export interface CommentOptions {
20
+ feedId: string;
21
+ xsecToken: string;
22
+ note: string;
23
+ browserPath?: string;
24
+ }
25
+ export type FeedSource = 'home_page' | 'search' | 'detail';
26
+ //# sourceMappingURL=feed.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feed.types.d.ts","sourceRoot":"","sources":["../../../src/lib/feeds/feed.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,GAAG,CAAC;CACb;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Feed-related types for XHS MCP Server
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=feed.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feed.types.js","sourceRoot":"","sources":["../../../src/lib/feeds/feed.types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Feed operations domain for XHS MCP Server
3
+ */
4
+ export * from './feed.service.js';
5
+ export * from './feed.types.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/feeds/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Feed operations domain for XHS MCP Server
3
+ */
4
+ export * from './feed.service.js';
5
+ export * from './feed.types.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/feeds/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Core library for XHS MCP Server
3
+ */
4
+ export * from './shared/index.js';
5
+ export * from './auth/index.js';
6
+ export * from './browser/index.js';
7
+ export * from './feeds/index.js';
8
+ export * from './publishing/index.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,cAAc,mBAAmB,CAAC;AAGlC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Core library for XHS MCP Server
3
+ */
4
+ // Shared utilities and types
5
+ export * from './shared/index.js';
6
+ // Domain services
7
+ export * from './auth/index.js';
8
+ export * from './browser/index.js';
9
+ export * from './feeds/index.js';
10
+ export * from './publishing/index.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,6BAA6B;AAC7B,cAAc,mBAAmB,CAAC;AAElC,kBAAkB;AAClB,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Publishing domain for XHS MCP Server
3
+ */
4
+ export * from './publish.service.js';
5
+ export * from './publish.types.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/publishing/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Publishing domain for XHS MCP Server
3
+ */
4
+ export * from './publish.service.js';
5
+ export * from './publish.types.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/publishing/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Publishing service for XHS MCP Server
3
+ */
4
+ import { Config, PublishResult } from '../shared/types.js';
5
+ import { BaseService } from '../shared/base.service.js';
6
+ export declare class PublishService extends BaseService {
7
+ constructor(config: Config);
8
+ private findElementBySelectors;
9
+ private getElementText;
10
+ private checkTextPatterns;
11
+ private checkElementForPatterns;
12
+ private waitForCondition;
13
+ publishNote(title: string, content: string, imagePaths: string[], tags?: string, browserPath?: string): Promise<PublishResult>;
14
+ private validateAndResolveImagePaths;
15
+ private clickUploadTab;
16
+ private uploadImages;
17
+ private fillTitle;
18
+ private findContentElement;
19
+ private findTextboxByPlaceholder;
20
+ private findTextboxParent;
21
+ private fillContent;
22
+ private inputTags;
23
+ private inputTag;
24
+ private addTags;
25
+ private submitPublish;
26
+ private isElementVisible;
27
+ private waitForPublishCompletion;
28
+ private waitForVideoPublishCompletion;
29
+ publishContent(type: 'image' | 'video', title: string, content: string, mediaPaths: string[], tags?: string, browserPath?: string): Promise<PublishResult>;
30
+ publishVideo(title: string, content: string, videoPath: string, tags?: string, browserPath?: string): Promise<PublishResult>;
31
+ private validateContentInputs;
32
+ private validateVideoInputs;
33
+ private executeVideoPublishWorkflow;
34
+ private validateAndResolveVideoPath;
35
+ private clickVideoUploadTab;
36
+ private uploadVideo;
37
+ private waitForVideoProcessing;
38
+ }
39
+ //# sourceMappingURL=publish.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.service.d.ts","sourceRoot":"","sources":["../../../src/lib/publishing/publish.service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAuFxD,qBAAa,cAAe,SAAQ,WAAW;gBACjC,MAAM,EAAE,MAAM;YAKZ,sBAAsB;YAWtB,cAAc;YASd,iBAAiB;YAKjB,uBAAuB;YAiBvB,gBAAgB;IAkBxB,WAAW,CACf,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAAE,EACpB,IAAI,GAAE,MAAW,EACjB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,aAAa,CAAC;IA+GzB,OAAO,CAAC,4BAA4B;YAgCtB,cAAc;YAuEd,YAAY;YAwBZ,SAAS;YA8DT,kBAAkB;YA0BlB,wBAAwB;YAmBxB,iBAAiB;YAQjB,WAAW;YAuFX,SAAS;YAQT,QAAQ;YA2BR,OAAO;YAWP,aAAa;YAmBb,gBAAgB;YAQhB,wBAAwB;YAyFxB,6BAA6B;IAiFrC,cAAc,CAClB,IAAI,EAAE,OAAO,GAAG,OAAO,EACvB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAAE,EACpB,IAAI,GAAE,MAAW,EACjB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,aAAa,CAAC;IAanB,YAAY,CAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,MAAW,EACjB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,aAAa,CAAC;IAmCzB,OAAO,CAAC,qBAAqB;IA2B7B,OAAO,CAAC,mBAAmB;YAcb,2BAA2B;IA8CzC,OAAO,CAAC,2BAA2B;YA6BrB,mBAAmB;YAoEnB,WAAW;YA4BX,sBAAsB;CA0CrC"}