@zlooks.cn/blog-server 1.0.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 (265) hide show
  1. package/dist/blog/blog-application.d.ts +153 -0
  2. package/dist/blog/blog-application.d.ts.map +1 -0
  3. package/dist/blog/blog-application.js +115 -0
  4. package/dist/blog/blog-application.js.map +1 -0
  5. package/dist/blog/comment-client-metadata.d.ts +19 -0
  6. package/dist/blog/comment-client-metadata.d.ts.map +1 -0
  7. package/dist/blog/comment-client-metadata.js +78 -0
  8. package/dist/blog/comment-client-metadata.js.map +1 -0
  9. package/dist/blog/errors.d.ts +12 -0
  10. package/dist/blog/errors.d.ts.map +1 -0
  11. package/dist/blog/errors.js +21 -0
  12. package/dist/blog/errors.js.map +1 -0
  13. package/dist/blog/micro-user-directory.d.ts +11 -0
  14. package/dist/blog/micro-user-directory.d.ts.map +1 -0
  15. package/dist/blog/micro-user-directory.js +18 -0
  16. package/dist/blog/micro-user-directory.js.map +1 -0
  17. package/dist/blog/post-content-audit.d.ts +34 -0
  18. package/dist/blog/post-content-audit.d.ts.map +1 -0
  19. package/dist/blog/post-content-audit.js +190 -0
  20. package/dist/blog/post-content-audit.js.map +1 -0
  21. package/dist/blog/post-view-cache.d.ts +15 -0
  22. package/dist/blog/post-view-cache.d.ts.map +1 -0
  23. package/dist/blog/post-view-cache.js +23 -0
  24. package/dist/blog/post-view-cache.js.map +1 -0
  25. package/dist/blog/public-blog-micro.d.ts +291 -0
  26. package/dist/blog/public-blog-micro.d.ts.map +1 -0
  27. package/dist/blog/public-blog-micro.js +71 -0
  28. package/dist/blog/public-blog-micro.js.map +1 -0
  29. package/dist/blog/public-blog-service.d.ts +104 -0
  30. package/dist/blog/public-blog-service.d.ts.map +1 -0
  31. package/dist/blog/public-blog-service.js +341 -0
  32. package/dist/blog/public-blog-service.js.map +1 -0
  33. package/dist/browser-api/dispatch-stream.d.ts +5 -0
  34. package/dist/browser-api/dispatch-stream.d.ts.map +1 -0
  35. package/dist/browser-api/dispatch-stream.js +4 -0
  36. package/dist/browser-api/dispatch-stream.js.map +1 -0
  37. package/dist/browser-api/dispatcher.d.ts +15 -0
  38. package/dist/browser-api/dispatcher.d.ts.map +1 -0
  39. package/dist/browser-api/dispatcher.js +145 -0
  40. package/dist/browser-api/dispatcher.js.map +1 -0
  41. package/dist/browser-api/provider-publisher.d.ts +24 -0
  42. package/dist/browser-api/provider-publisher.d.ts.map +1 -0
  43. package/dist/browser-api/provider-publisher.js +107 -0
  44. package/dist/browser-api/provider-publisher.js.map +1 -0
  45. package/dist/command/index.d.ts +3 -0
  46. package/dist/command/index.d.ts.map +1 -0
  47. package/dist/command/index.js +24 -0
  48. package/dist/command/index.js.map +1 -0
  49. package/dist/config/schema.d.ts +25 -0
  50. package/dist/config/schema.d.ts.map +1 -0
  51. package/dist/config/schema.js +19 -0
  52. package/dist/config/schema.js.map +1 -0
  53. package/dist/contracts/identity.d.ts +2 -0
  54. package/dist/contracts/identity.d.ts.map +1 -0
  55. package/dist/contracts/identity.js +2 -0
  56. package/dist/contracts/identity.js.map +1 -0
  57. package/dist/contracts/mcp.d.ts +69 -0
  58. package/dist/contracts/mcp.d.ts.map +1 -0
  59. package/dist/contracts/mcp.js +41 -0
  60. package/dist/contracts/mcp.js.map +1 -0
  61. package/dist/contracts/public-api.d.ts +3 -0
  62. package/dist/contracts/public-api.d.ts.map +1 -0
  63. package/dist/contracts/public-api.js +2 -0
  64. package/dist/contracts/public-api.js.map +1 -0
  65. package/dist/mcp/blog-prompts.d.ts +135 -0
  66. package/dist/mcp/blog-prompts.d.ts.map +1 -0
  67. package/dist/mcp/blog-prompts.js +107 -0
  68. package/dist/mcp/blog-prompts.js.map +1 -0
  69. package/dist/mcp/blog-provider.d.ts +4 -0
  70. package/dist/mcp/blog-provider.d.ts.map +1 -0
  71. package/dist/mcp/blog-provider.js +27 -0
  72. package/dist/mcp/blog-provider.js.map +1 -0
  73. package/dist/mcp/blog-theme-authoring-prompt.d.ts +19 -0
  74. package/dist/mcp/blog-theme-authoring-prompt.d.ts.map +1 -0
  75. package/dist/mcp/blog-theme-authoring-prompt.js +171 -0
  76. package/dist/mcp/blog-theme-authoring-prompt.js.map +1 -0
  77. package/dist/mcp/category-tools.d.ts +45 -0
  78. package/dist/mcp/category-tools.d.ts.map +1 -0
  79. package/dist/mcp/category-tools.js +14 -0
  80. package/dist/mcp/category-tools.js.map +1 -0
  81. package/dist/mcp/comment-tools.d.ts +44 -0
  82. package/dist/mcp/comment-tools.d.ts.map +1 -0
  83. package/dist/mcp/comment-tools.js +15 -0
  84. package/dist/mcp/comment-tools.js.map +1 -0
  85. package/dist/mcp/friend-link-tools.d.ts +63 -0
  86. package/dist/mcp/friend-link-tools.d.ts.map +1 -0
  87. package/dist/mcp/friend-link-tools.js +16 -0
  88. package/dist/mcp/friend-link-tools.js.map +1 -0
  89. package/dist/mcp/page-tools.d.ts +67 -0
  90. package/dist/mcp/page-tools.d.ts.map +1 -0
  91. package/dist/mcp/page-tools.js +36 -0
  92. package/dist/mcp/page-tools.js.map +1 -0
  93. package/dist/mcp/post-tools.d.ts +114 -0
  94. package/dist/mcp/post-tools.d.ts.map +1 -0
  95. package/dist/mcp/post-tools.js +122 -0
  96. package/dist/mcp/post-tools.js.map +1 -0
  97. package/dist/mcp/tag-tools.d.ts +37 -0
  98. package/dist/mcp/tag-tools.d.ts.map +1 -0
  99. package/dist/mcp/tag-tools.js +14 -0
  100. package/dist/mcp/tag-tools.js.map +1 -0
  101. package/dist/mcp/theme-tools.d.ts +16 -0
  102. package/dist/mcp/theme-tools.d.ts.map +1 -0
  103. package/dist/mcp/theme-tools.js +71 -0
  104. package/dist/mcp/theme-tools.js.map +1 -0
  105. package/dist/mcp/tool-descriptions.d.ts +5 -0
  106. package/dist/mcp/tool-descriptions.d.ts.map +1 -0
  107. package/dist/mcp/tool-descriptions.js +51 -0
  108. package/dist/mcp/tool-descriptions.js.map +1 -0
  109. package/dist/mcp/tool-support.d.ts +242 -0
  110. package/dist/mcp/tool-support.d.ts.map +1 -0
  111. package/dist/mcp/tool-support.js +127 -0
  112. package/dist/mcp/tool-support.js.map +1 -0
  113. package/dist/messages/browser/dispatch.msg.d.ts +3 -0
  114. package/dist/messages/browser/dispatch.msg.d.ts.map +1 -0
  115. package/dist/messages/browser/dispatch.msg.js +9 -0
  116. package/dist/messages/browser/dispatch.msg.js.map +1 -0
  117. package/dist/messages/public/categories/list.msg.d.ts +3 -0
  118. package/dist/messages/public/categories/list.msg.d.ts.map +1 -0
  119. package/dist/messages/public/categories/list.msg.js +8 -0
  120. package/dist/messages/public/categories/list.msg.js.map +1 -0
  121. package/dist/messages/public/comments/list.msg.d.ts +3 -0
  122. package/dist/messages/public/comments/list.msg.d.ts.map +1 -0
  123. package/dist/messages/public/comments/list.msg.js +8 -0
  124. package/dist/messages/public/comments/list.msg.js.map +1 -0
  125. package/dist/messages/public/comments/recent.msg.d.ts +3 -0
  126. package/dist/messages/public/comments/recent.msg.d.ts.map +1 -0
  127. package/dist/messages/public/comments/recent.msg.js +8 -0
  128. package/dist/messages/public/comments/recent.msg.js.map +1 -0
  129. package/dist/messages/public/friend-links/list.msg.d.ts +3 -0
  130. package/dist/messages/public/friend-links/list.msg.d.ts.map +1 -0
  131. package/dist/messages/public/friend-links/list.msg.js +8 -0
  132. package/dist/messages/public/friend-links/list.msg.js.map +1 -0
  133. package/dist/messages/public/pages/list.msg.d.ts +3 -0
  134. package/dist/messages/public/pages/list.msg.d.ts.map +1 -0
  135. package/dist/messages/public/pages/list.msg.js +8 -0
  136. package/dist/messages/public/pages/list.msg.js.map +1 -0
  137. package/dist/messages/public/pages/read.msg.d.ts +3 -0
  138. package/dist/messages/public/pages/read.msg.d.ts.map +1 -0
  139. package/dist/messages/public/pages/read.msg.js +8 -0
  140. package/dist/messages/public/pages/read.msg.js.map +1 -0
  141. package/dist/messages/public/posts/archive.msg.d.ts +3 -0
  142. package/dist/messages/public/posts/archive.msg.d.ts.map +1 -0
  143. package/dist/messages/public/posts/archive.msg.js +8 -0
  144. package/dist/messages/public/posts/archive.msg.js.map +1 -0
  145. package/dist/messages/public/posts/connections.msg.d.ts +3 -0
  146. package/dist/messages/public/posts/connections.msg.d.ts.map +1 -0
  147. package/dist/messages/public/posts/connections.msg.js +8 -0
  148. package/dist/messages/public/posts/connections.msg.js.map +1 -0
  149. package/dist/messages/public/posts/list.msg.d.ts +3 -0
  150. package/dist/messages/public/posts/list.msg.d.ts.map +1 -0
  151. package/dist/messages/public/posts/list.msg.js +8 -0
  152. package/dist/messages/public/posts/list.msg.js.map +1 -0
  153. package/dist/messages/public/posts/open.msg.d.ts +3 -0
  154. package/dist/messages/public/posts/open.msg.d.ts.map +1 -0
  155. package/dist/messages/public/posts/open.msg.js +8 -0
  156. package/dist/messages/public/posts/open.msg.js.map +1 -0
  157. package/dist/messages/public/posts/read.msg.d.ts +3 -0
  158. package/dist/messages/public/posts/read.msg.d.ts.map +1 -0
  159. package/dist/messages/public/posts/read.msg.js +8 -0
  160. package/dist/messages/public/posts/read.msg.js.map +1 -0
  161. package/dist/messages/public/tags/list.msg.d.ts +3 -0
  162. package/dist/messages/public/tags/list.msg.d.ts.map +1 -0
  163. package/dist/messages/public/tags/list.msg.js +8 -0
  164. package/dist/messages/public/tags/list.msg.js.map +1 -0
  165. package/dist/migrations/index.d.ts +3 -0
  166. package/dist/migrations/index.d.ts.map +1 -0
  167. package/dist/migrations/index.js +2 -0
  168. package/dist/migrations/index.js.map +1 -0
  169. package/dist/persistence/category-store.d.ts +23 -0
  170. package/dist/persistence/category-store.d.ts.map +1 -0
  171. package/dist/persistence/category-store.js +86 -0
  172. package/dist/persistence/category-store.js.map +1 -0
  173. package/dist/persistence/comment-store.d.ts +41 -0
  174. package/dist/persistence/comment-store.d.ts.map +1 -0
  175. package/dist/persistence/comment-store.js +146 -0
  176. package/dist/persistence/comment-store.js.map +1 -0
  177. package/dist/persistence/entities.d.ts +103 -0
  178. package/dist/persistence/entities.d.ts.map +1 -0
  179. package/dist/persistence/entities.js +188 -0
  180. package/dist/persistence/entities.js.map +1 -0
  181. package/dist/persistence/friend-link-store.d.ts +26 -0
  182. package/dist/persistence/friend-link-store.d.ts.map +1 -0
  183. package/dist/persistence/friend-link-store.js +80 -0
  184. package/dist/persistence/friend-link-store.js.map +1 -0
  185. package/dist/persistence/page-store.d.ts +35 -0
  186. package/dist/persistence/page-store.d.ts.map +1 -0
  187. package/dist/persistence/page-store.js +125 -0
  188. package/dist/persistence/page-store.js.map +1 -0
  189. package/dist/persistence/post-engagement-store.d.ts +23 -0
  190. package/dist/persistence/post-engagement-store.d.ts.map +1 -0
  191. package/dist/persistence/post-engagement-store.js +85 -0
  192. package/dist/persistence/post-engagement-store.js.map +1 -0
  193. package/dist/persistence/post-store.d.ts +87 -0
  194. package/dist/persistence/post-store.d.ts.map +1 -0
  195. package/dist/persistence/post-store.js +465 -0
  196. package/dist/persistence/post-store.js.map +1 -0
  197. package/dist/persistence/tag-store.d.ts +21 -0
  198. package/dist/persistence/tag-store.d.ts.map +1 -0
  199. package/dist/persistence/tag-store.js +82 -0
  200. package/dist/persistence/tag-store.js.map +1 -0
  201. package/dist/services/application.service.d.ts +4 -0
  202. package/dist/services/application.service.d.ts.map +1 -0
  203. package/dist/services/application.service.js +22 -0
  204. package/dist/services/application.service.js.map +1 -0
  205. package/dist/services/blog-runtime.service.d.ts +10 -0
  206. package/dist/services/blog-runtime.service.d.ts.map +1 -0
  207. package/dist/services/blog-runtime.service.js +32 -0
  208. package/dist/services/blog-runtime.service.js.map +1 -0
  209. package/dist/services/blog.boot.d.ts +6 -0
  210. package/dist/services/blog.boot.d.ts.map +1 -0
  211. package/dist/services/blog.boot.js +13 -0
  212. package/dist/services/blog.boot.js.map +1 -0
  213. package/dist/services/browser-api-provider.service.d.ts +4 -0
  214. package/dist/services/browser-api-provider.service.d.ts.map +1 -0
  215. package/dist/services/browser-api-provider.service.js +25 -0
  216. package/dist/services/browser-api-provider.service.js.map +1 -0
  217. package/dist/services/config.service.d.ts +3 -0
  218. package/dist/services/config.service.d.ts.map +1 -0
  219. package/dist/services/config.service.js +22 -0
  220. package/dist/services/config.service.js.map +1 -0
  221. package/dist/services/database.service.d.ts +3 -0
  222. package/dist/services/database.service.d.ts.map +1 -0
  223. package/dist/services/database.service.js +16 -0
  224. package/dist/services/database.service.js.map +1 -0
  225. package/dist/services/logger.service.d.ts +4 -0
  226. package/dist/services/logger.service.d.ts.map +1 -0
  227. package/dist/services/logger.service.js +8 -0
  228. package/dist/services/logger.service.js.map +1 -0
  229. package/dist/services/mcp-provider.service.d.ts +3 -0
  230. package/dist/services/mcp-provider.service.d.ts.map +1 -0
  231. package/dist/services/mcp-provider.service.js +17 -0
  232. package/dist/services/mcp-provider.service.js.map +1 -0
  233. package/dist/services/redis.service.d.ts +4 -0
  234. package/dist/services/redis.service.d.ts.map +1 -0
  235. package/dist/services/redis.service.js +18 -0
  236. package/dist/services/redis.service.js.map +1 -0
  237. package/dist/services/theme-control.service.d.ts +4 -0
  238. package/dist/services/theme-control.service.d.ts.map +1 -0
  239. package/dist/services/theme-control.service.js +53 -0
  240. package/dist/services/theme-control.service.js.map +1 -0
  241. package/dist/themes/theme-catalog.d.ts +40 -0
  242. package/dist/themes/theme-catalog.d.ts.map +1 -0
  243. package/dist/themes/theme-catalog.js +164 -0
  244. package/dist/themes/theme-catalog.js.map +1 -0
  245. package/dist/themes/theme-control.d.ts +16 -0
  246. package/dist/themes/theme-control.d.ts.map +1 -0
  247. package/dist/themes/theme-control.js +57 -0
  248. package/dist/themes/theme-control.js.map +1 -0
  249. package/dist/themes/theme-discovery-runtime.d.ts +41 -0
  250. package/dist/themes/theme-discovery-runtime.d.ts.map +1 -0
  251. package/dist/themes/theme-discovery-runtime.js +109 -0
  252. package/dist/themes/theme-discovery-runtime.js.map +1 -0
  253. package/dist/themes/theme-generation-store.d.ts +14 -0
  254. package/dist/themes/theme-generation-store.d.ts.map +1 -0
  255. package/dist/themes/theme-generation-store.js +49 -0
  256. package/dist/themes/theme-generation-store.js.map +1 -0
  257. package/dist/themes/theme-selection-publisher.d.ts +28 -0
  258. package/dist/themes/theme-selection-publisher.d.ts.map +1 -0
  259. package/dist/themes/theme-selection-publisher.js +92 -0
  260. package/dist/themes/theme-selection-publisher.js.map +1 -0
  261. package/dist/themes/theme-selection-store.d.ts +22 -0
  262. package/dist/themes/theme-selection-store.d.ts.map +1 -0
  263. package/dist/themes/theme-selection-store.js +84 -0
  264. package/dist/themes/theme-selection-store.js.map +1 -0
  265. package/package.json +74 -0
@@ -0,0 +1,145 @@
1
+ import { browserApiFailure, browserApiSuccess } from '@zlooks.cn/browser-api';
2
+ import { BLOG_BROWSER_API_ERROR_CODES, parseBlogBrowserApiRequest, parseBlogBrowserApiResponse, } from '../contracts/public-api.js';
3
+ import { BlogConflictError, BlogCursorError, BlogNotFoundError } from '../blog/errors.js';
4
+ import { z } from 'zod';
5
+ const slugPattern = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
6
+ const postSlug = z.string().min(1).max(200).regex(slugPattern);
7
+ const taxonomySlug = z.string().min(1).max(120).regex(slugPattern);
8
+ const postListQuerySchema = z.strictObject({
9
+ limit: z.string().regex(/^(?:[1-9]|[1-9][0-9]|100)$/).transform(Number).default(20),
10
+ cursor: z.uuid().optional(),
11
+ page: z.string().regex(/^(?:[1-9]|[1-9][0-9]{1,3}|10000)$/).transform(Number).optional(),
12
+ category: taxonomySlug.optional(), tag: taxonomySlug.optional(),
13
+ }).refine((query) => !(query.cursor && query.page), { message: 'cursor and page are mutually exclusive' });
14
+ const commentListQuerySchema = z.strictObject({
15
+ limit: z.string().regex(/^(?:[1-9]|[1-9][0-9]|100)$/).transform(Number).default(20),
16
+ cursor: z.uuid().optional(),
17
+ order: z.enum(['desc', 'asc']).default('desc'),
18
+ });
19
+ const searchQuerySchema = z.strictObject({
20
+ q: z.string().trim().min(2).max(100),
21
+ limit: z.string().regex(/^(?:[1-9]|1[0-9]|20)$/).transform(Number).default(10),
22
+ });
23
+ const emptyQuerySchema = z.strictObject({});
24
+ export class BlogBrowserApiDispatcher {
25
+ options;
26
+ constructor(options) {
27
+ this.options = options;
28
+ }
29
+ async dispatch(input, invocation) {
30
+ const { signal } = invocation;
31
+ let request;
32
+ try {
33
+ request = parseBlogBrowserApiRequest(input);
34
+ }
35
+ catch {
36
+ return failure(400, BLOG_BROWSER_API_ERROR_CODES.requestRejected, '请求格式无效,请检查后重试');
37
+ }
38
+ if (request.method !== 'GET' && !sameOrigin(request.origin, this.options.readPublicOrigin())) {
39
+ return failure(403, BLOG_BROWSER_API_ERROR_CODES.requestRejected, '请求来源无效,请刷新页面后重试');
40
+ }
41
+ try {
42
+ return await this.route(request, invocation);
43
+ }
44
+ catch (error) {
45
+ if (signal?.aborted)
46
+ throw signal.reason ?? error;
47
+ if (error instanceof BlogNotFoundError) {
48
+ return failure(404, BLOG_BROWSER_API_ERROR_CODES.postNotFound, '文章不存在或尚未发布');
49
+ }
50
+ if (error instanceof BlogCursorError) {
51
+ return failure(400, BLOG_BROWSER_API_ERROR_CODES.requestRejected, '分页游标已失效,请重新加载');
52
+ }
53
+ if (error instanceof z.ZodError || error instanceof URIError) {
54
+ return failure(400, BLOG_BROWSER_API_ERROR_CODES.requestRejected, '查询参数无效,请检查后重试');
55
+ }
56
+ if (error instanceof BlogConflictError) {
57
+ if (isLikeMutation(request)) {
58
+ return failure(409, BLOG_BROWSER_API_ERROR_CODES.engagementRejected, '当前文章无法点赞');
59
+ }
60
+ return failure(409, BLOG_BROWSER_API_ERROR_CODES.commentRejected, '当前文章无法接收评论');
61
+ }
62
+ this.options.onError?.(error);
63
+ return failure(500, BLOG_BROWSER_API_ERROR_CODES.requestRejected, '服务暂时不可用,请稍后重试');
64
+ }
65
+ }
66
+ async route(request, invocation) {
67
+ const { signal } = invocation;
68
+ if (request.method === 'GET' && request.path === '/api/blog/categories') {
69
+ emptyQuerySchema.parse(request.query ?? {});
70
+ return success(await this.options.blog.listCategories(signal));
71
+ }
72
+ if (request.method === 'GET' && request.path === '/api/blog/tags') {
73
+ emptyQuerySchema.parse(request.query ?? {});
74
+ return success(await this.options.blog.listTags(signal));
75
+ }
76
+ if (request.method === 'GET' && request.path === '/api/blog/friend-links') {
77
+ emptyQuerySchema.parse(request.query ?? {});
78
+ return success(await this.options.blog.listFriendLinks(signal));
79
+ }
80
+ if (request.method === 'GET' && request.path === '/api/blog/search') {
81
+ const query = searchQuerySchema.parse(request.query ?? {});
82
+ return success(await this.options.blog.searchPosts({ query: query.q, limit: query.limit }, signal));
83
+ }
84
+ if (request.method === 'GET' && request.path === '/api/blog/posts') {
85
+ const query = postListQuerySchema.parse(request.query ?? {});
86
+ return success(await this.options.blog.listPosts(query, signal));
87
+ }
88
+ const comments = /^\/api\/blog\/posts\/([^/]+)\/comments$/.exec(request.path);
89
+ if (comments?.[1])
90
+ return this.comments(request, decodeSlug(comments[1]), invocation);
91
+ const likes = /^\/api\/blog\/likes\/([^/]+)$/.exec(request.path);
92
+ if (likes?.[1] && (request.method === 'PUT' || request.method === 'DELETE')) {
93
+ const result = await this.options.blog.setPostLiked(decodeSlug(likes[1]), request.method === 'PUT', invocation.context, signal);
94
+ return result
95
+ ? success(result)
96
+ : failure(401, BLOG_BROWSER_API_ERROR_CODES.authenticationRequired, '请登录后点赞');
97
+ }
98
+ const post = /^\/api\/blog\/posts\/([^/]+)$/.exec(request.path);
99
+ if (request.method === 'GET' && post?.[1]) {
100
+ emptyQuerySchema.parse(request.query ?? {});
101
+ const item = await this.options.blog.readPost(decodeSlug(post[1]), signal);
102
+ return item ? success(item) : failure(404, BLOG_BROWSER_API_ERROR_CODES.postNotFound, '文章不存在或尚未发布');
103
+ }
104
+ return failure(404, BLOG_BROWSER_API_ERROR_CODES.routeNotFound, '请求的接口不存在');
105
+ }
106
+ async comments(request, slug, invocation) {
107
+ const { context, signal } = invocation;
108
+ if (request.method === 'GET') {
109
+ const query = commentListQuerySchema.parse(request.query ?? {});
110
+ const comments = await this.options.blog.listComments(slug, query, context, signal);
111
+ return comments
112
+ ? success(comments)
113
+ : failure(404, BLOG_BROWSER_API_ERROR_CODES.postNotFound, '文章不存在或尚未发布');
114
+ }
115
+ if (request.method !== 'POST') {
116
+ return failure(404, BLOG_BROWSER_API_ERROR_CODES.routeNotFound, '请求的接口不存在');
117
+ }
118
+ const comment = await this.options.blog.createComment(slug, request.body.content, context, signal);
119
+ return comment
120
+ ? success(comment, 201)
121
+ : failure(401, BLOG_BROWSER_API_ERROR_CODES.authenticationRequired, '请登录后发表评论');
122
+ }
123
+ }
124
+ function isLikeMutation(request) {
125
+ return (request.method === 'PUT' || request.method === 'DELETE')
126
+ && request.path.startsWith('/api/blog/likes/');
127
+ }
128
+ function success(data, status = 200) {
129
+ return parseBlogBrowserApiResponse({ status, body: browserApiSuccess(data) });
130
+ }
131
+ function failure(status, code, error) {
132
+ return parseBlogBrowserApiResponse({ status, body: browserApiFailure(code, error) });
133
+ }
134
+ function sameOrigin(actual, expected) {
135
+ if (!actual)
136
+ return false;
137
+ try {
138
+ return new URL(actual).origin === new URL(expected).origin;
139
+ }
140
+ catch {
141
+ return false;
142
+ }
143
+ }
144
+ function decodeSlug(value) { return postSlug.parse(decodeURIComponent(value)); }
145
+ //# sourceMappingURL=dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../../src/browser-api/dispatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { type BrowserApiProviderAnnouncement } from '@zlooks.cn/browser-api';
2
+ interface Publication {
3
+ update(payload: BrowserApiProviderAnnouncement): Promise<unknown>;
4
+ unpublish(): Promise<unknown>;
5
+ }
6
+ export interface BrowserApiProviderPublisherOptions {
7
+ readonly application: {
8
+ publish(topic: string, payload: BrowserApiProviderAnnouncement): Promise<Publication>;
9
+ };
10
+ readonly instanceId: string;
11
+ readonly leaseMs: number;
12
+ readonly clock?: () => Date;
13
+ readonly onError?: (error: unknown) => void;
14
+ }
15
+ /** Narrow Registry lifecycle adapter; Hile has no Browser JSON discovery runtime. */
16
+ export declare class BrowserApiProviderPublisher {
17
+ #private;
18
+ private readonly options;
19
+ constructor(options: BrowserApiProviderPublisherOptions);
20
+ start(): Promise<void>;
21
+ close(): Promise<void>;
22
+ }
23
+ export {};
24
+ //# sourceMappingURL=provider-publisher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-publisher.d.ts","sourceRoot":"","sources":["../../src/browser-api/provider-publisher.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,8BAA8B,EACpC,MAAM,wBAAwB,CAAC;AAQhC,UAAU,WAAW;IACnB,MAAM,CAAC,OAAO,EAAE,8BAA8B,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClE,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,kCAAkC;IACjD,QAAQ,CAAC,WAAW,EAAE;QACpB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,8BAA8B,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;KACvF,CAAC;IACF,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAC7C;AAED,qFAAqF;AACrF,qBAAa,2BAA2B;;IAUnB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAA3C,YAAoC,OAAO,EAAE,kCAAkC,EAK9E;IAEM,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAU5B;IAWM,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAS5B;CAoDF"}
@@ -0,0 +1,107 @@
1
+ import { browserApiProviderAnnouncementSchema, browserApiProviderTopic, } from '@zlooks.cn/browser-api';
2
+ import { BLOG_BROWSER_API_ERROR_CODES, BLOG_BROWSER_API_OPERATION, BLOG_BROWSER_API_PUBLIC_ROUTES, } from '../contracts/public-api.js';
3
+ import { BLOG_PLUGIN_ID, BLOG_SERVICE_NAMESPACE } from '../contracts/identity.js';
4
+ const PROVIDER_ID = BLOG_PLUGIN_ID;
5
+ /** Narrow Registry lifecycle adapter; Hile has no Browser JSON discovery runtime. */
6
+ export class BrowserApiProviderPublisher {
7
+ options;
8
+ #clock;
9
+ #publication;
10
+ #timer;
11
+ #starting;
12
+ #closed = false;
13
+ #sequence = -1;
14
+ #updating;
15
+ #closing;
16
+ constructor(options) {
17
+ this.options = options;
18
+ if (!Number.isSafeInteger(options.leaseMs) || options.leaseMs < 500 || options.leaseMs > 30_000) {
19
+ throw new TypeError('Browser API Provider lease must be between 500 and 30000 milliseconds');
20
+ }
21
+ this.#clock = options.clock ?? (() => new Date());
22
+ }
23
+ start() {
24
+ if (this.#closed)
25
+ return Promise.reject(new Error('Blog Browser API Provider publisher is closed'));
26
+ if (this.#publication)
27
+ return Promise.resolve();
28
+ if (this.#starting)
29
+ return this.#starting;
30
+ const operation = this.#start();
31
+ const tracked = operation.finally(() => {
32
+ if (this.#starting === tracked)
33
+ this.#starting = undefined;
34
+ });
35
+ this.#starting = tracked;
36
+ return tracked;
37
+ }
38
+ async #start() {
39
+ this.#publication = await this.options.application.publish(browserApiProviderTopic(PROVIDER_ID, this.options.instanceId), this.#announcement());
40
+ this.#timer = setInterval(() => this.#scheduleRefresh(), Math.max(250, Math.floor(this.options.leaseMs / 2)));
41
+ this.#timer.unref();
42
+ }
43
+ close() {
44
+ this.#closed = true;
45
+ if (this.#closing)
46
+ return this.#closing;
47
+ if (!this.#publication && !this.#timer && !this.#starting && !this.#updating)
48
+ return Promise.resolve();
49
+ const operation = this.#close();
50
+ this.#closing = operation;
51
+ return operation.finally(() => {
52
+ if (this.#closing === operation)
53
+ this.#closing = undefined;
54
+ });
55
+ }
56
+ async #close() {
57
+ await this.#starting?.catch(() => undefined);
58
+ if (this.#timer)
59
+ clearInterval(this.#timer);
60
+ this.#timer = undefined;
61
+ await this.#updating?.catch(() => undefined);
62
+ await this.#publication?.unpublish();
63
+ this.#publication = undefined;
64
+ }
65
+ #scheduleRefresh() {
66
+ if (this.#updating || !this.#publication)
67
+ return;
68
+ const operation = this.#refresh();
69
+ this.#updating = operation;
70
+ void operation.finally(() => {
71
+ if (this.#updating === operation)
72
+ this.#updating = undefined;
73
+ }).catch((error) => this.options.onError?.(error));
74
+ }
75
+ async #refresh() {
76
+ await this.#publication?.update(this.#announcement());
77
+ }
78
+ #announcement() {
79
+ const issuedAt = this.#clock();
80
+ this.#sequence = Math.max(this.#sequence + 1, issuedAt.getTime());
81
+ return browserApiProviderAnnouncementSchema.parse({
82
+ protocol: 'zlooks.browser-api.provider',
83
+ providerId: PROVIDER_ID,
84
+ instanceId: this.options.instanceId,
85
+ namespace: BLOG_SERVICE_NAMESPACE,
86
+ operation: BLOG_BROWSER_API_OPERATION,
87
+ routes: BLOG_BROWSER_API_PUBLIC_ROUTES,
88
+ writableCookieNames: [],
89
+ errors: {
90
+ invalidRequest: {
91
+ code: BLOG_BROWSER_API_ERROR_CODES.requestRejected,
92
+ message: '请求格式无效,请检查后重试',
93
+ },
94
+ unavailable: {
95
+ code: BLOG_BROWSER_API_ERROR_CODES.requestRejected,
96
+ message: '服务暂时不可用,请稍后重试',
97
+ },
98
+ },
99
+ lease: {
100
+ issuedAt: issuedAt.toISOString(),
101
+ expiresAt: new Date(issuedAt.getTime() + this.options.leaseMs).toISOString(),
102
+ sequence: this.#sequence,
103
+ },
104
+ });
105
+ }
106
+ }
107
+ //# sourceMappingURL=provider-publisher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-publisher.js","sourceRoot":"","sources":["../../src/browser-api/provider-publisher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/command/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+ import { fileURLToPath } from 'node:url';
3
+ import { createRegistryDatabaseDataSource, registerDatabaseCommands, } from '@zlooks.cn/database-command';
4
+ import { runServiceCommand } from '@zlooks.cn/service-command';
5
+ import { blogMigrations } from '../migrations/index.js';
6
+ import { blogEntities } from '../persistence/entities.js';
7
+ await runServiceCommand({
8
+ packageRoot: fileURLToPath(new URL('../../', import.meta.url)),
9
+ requiresReactServer: false,
10
+ configure(program) {
11
+ registerDatabaseCommands(program, {
12
+ createDataSource: (envFile) => createRegistryDatabaseDataSource(envFile, {
13
+ commandNamespace: 'cn.zlooks.blog.db.command',
14
+ entities: [...blogEntities],
15
+ }),
16
+ migrations: blogMigrations,
17
+ });
18
+ },
19
+ }).catch(reportStartupFailure);
20
+ function reportStartupFailure(error) {
21
+ process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
22
+ process.exitCode = 1;
23
+ }
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/command/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EACL,gCAAgC,EAChC,wBAAwB,GACzB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,MAAM,iBAAiB,CAAC;IACtB,WAAW,EAAE,aAAa,CAAC,IAAI,GAAG,CAAC,QAAQ,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9D,mBAAmB,EAAE,KAAK;IAC1B,SAAS,CAAC,OAAO;QACf,wBAAwB,CAAC,OAAO,EAAE;YAChC,gBAAgB,EAAE,CAAC,OAAO,EAAE,EAAE,CAC5B,gCAAgC,CAAC,OAAO,EAAE;gBACxC,gBAAgB,EAAE,2BAA2B;gBAC7C,QAAQ,EAAE,CAAC,GAAG,YAAY,CAAC;aAC5B,CAAC;YACJ,UAAU,EAAE,cAAc;SAC3B,CAAC,CAAC;IACL,CAAC;CACF,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;AAE/B,SAAS,oBAAoB,CAAC,KAAc;IAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { type PostgresConfig, type RedisConfig } from '@zlooks.cn/infrastructure';
2
+ export interface BlogServerConfigSources {
3
+ readonly postgres: unknown;
4
+ readonly redis: unknown;
5
+ readonly publicHost: unknown;
6
+ }
7
+ export interface BlogServerConfig {
8
+ readonly infrastructure: {
9
+ readonly postgres: PostgresConfig;
10
+ readonly redis: RedisConfig;
11
+ };
12
+ readonly public: {
13
+ readonly origin: string;
14
+ };
15
+ readonly themes: {
16
+ readonly discovery: {
17
+ readonly pollIntervalMs: 500;
18
+ readonly maxCatalogStaleMs: 30_000;
19
+ readonly maxClockSkewMs: 5_000;
20
+ };
21
+ readonly leaseMs: 10_000;
22
+ };
23
+ }
24
+ export declare function parseBlogServerConfig(input: BlogServerConfigSources): BlogServerConfig;
25
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EACkC,KAAK,cAAc,EAAE,KAAK,WAAW,EAC7E,MAAM,2BAA2B,CAAC;AAInC,MAAM,WAAW,uBAAuB;IAAG,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;CAAE;AAC9H,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,cAAc,EAAE;QAAE,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;KAAE,CAAC;IAC5F,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,SAAS,EAAE;YAAE,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAC;YAAC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,cAAc,EAAE,KAAK,CAAA;SAAE,CAAC;QACzH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,uBAAuB,GAAG,gBAAgB,CActF"}
@@ -0,0 +1,19 @@
1
+ import { parsePostgresConfig, parseRedisConfig, } from '@zlooks.cn/infrastructure';
2
+ import { parsePublicHostConfig } from '@zlooks.cn/public-host-contract';
3
+ import { joinKeyPrefix } from '@zlooks.cn/utils';
4
+ export function parseBlogServerConfig(input) {
5
+ const publicHost = parsePublicHostConfig(input.publicHost);
6
+ const redis = parseRedisConfig(input.redis);
7
+ return Object.freeze({
8
+ infrastructure: Object.freeze({
9
+ postgres: parsePostgresConfig(input.postgres),
10
+ redis: Object.freeze({ ...redis, keyPrefix: joinKeyPrefix(redis.keyPrefix, 'blog') }),
11
+ }),
12
+ public: Object.freeze({ origin: publicHost.origin }),
13
+ themes: Object.freeze({
14
+ discovery: Object.freeze({ pollIntervalMs: 500, maxCatalogStaleMs: 30_000, maxClockSkewMs: 5_000 }),
15
+ leaseMs: 10_000,
16
+ }),
17
+ });
18
+ }
19
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EAAE,gBAAgB,GACtC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAYjD,MAAM,UAAU,qBAAqB,CAAC,KAA8B;IAClE,MAAM,UAAU,GAAG,qBAAqB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5C,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC;YAC5B,QAAQ,EAAE,mBAAmB,CAAC,KAAK,CAAC,QAAQ,CAAC;YAC7C,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,aAAa,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC;SACtF,CAAC;QACF,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC;QACpD,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;YACpB,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,GAAG,EAAE,iBAAiB,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;YACnG,OAAO,EAAE,MAAM;SAChB,CAAC;KACH,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { BLOG_PLUGIN_ID, BLOG_SERVICE_NAMESPACE } from '@zlooks.cn/blog-shared';
2
+ //# sourceMappingURL=identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/contracts/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { BLOG_PLUGIN_ID, BLOG_SERVICE_NAMESPACE } from '@zlooks.cn/blog-shared';
2
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/contracts/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,69 @@
1
+ export declare const BLOG_MCP_PROVIDER_ID = "blog";
2
+ export declare const BLOG_MCP_READ_SCOPE = "blog:read";
3
+ export declare const BLOG_MCP_WRITE_SCOPE = "blog:write";
4
+ export declare const BLOG_MCP_MODERATE_SCOPE = "blog:moderate";
5
+ export declare const BLOG_MCP_TOOLS: Readonly<{
6
+ listCategories: "list-category";
7
+ readCategory: "read-category";
8
+ createCategory: "create-category";
9
+ updateCategory: "update-category";
10
+ deleteCategory: "delete-category";
11
+ listTags: "list-tag";
12
+ readTag: "read-tag";
13
+ createTag: "create-tag";
14
+ updateTag: "update-tag";
15
+ deleteTag: "delete-tag";
16
+ listPosts: "list-post";
17
+ listPostArchive: "list-post-archive";
18
+ searchPosts: "search-post";
19
+ readPost: "read-post";
20
+ auditPostContent: "audit-post-content";
21
+ createPost: "create-post";
22
+ updatePost: "update-post";
23
+ deletePost: "delete-post";
24
+ publishPost: "publish-post";
25
+ archivePost: "archive-post";
26
+ listPages: "list-page";
27
+ readPage: "read-page";
28
+ createPage: "create-page";
29
+ updatePage: "update-page";
30
+ deletePage: "delete-page";
31
+ publishPage: "publish-page";
32
+ archivePage: "archive-page";
33
+ listComments: "list-comment";
34
+ readComment: "read-comment";
35
+ approveComment: "approve-comment";
36
+ rejectComment: "reject-comment";
37
+ replyComment: "reply-comment";
38
+ deleteComment: "delete-comment";
39
+ listFriendLinks: "list-friend-link";
40
+ readFriendLink: "read-friend-link";
41
+ createFriendLink: "create-friend-link";
42
+ updateFriendLink: "update-friend-link";
43
+ enableFriendLink: "enable-friend-link";
44
+ disableFriendLink: "disable-friend-link";
45
+ deleteFriendLink: "delete-friend-link";
46
+ listThemes: "list-theme";
47
+ readThemeSelection: "read-theme-selection";
48
+ selectTheme: "select-theme";
49
+ readThemeStatus: "read-theme-status";
50
+ }>;
51
+ export declare const BLOG_MCP_PROMPTS: Readonly<{
52
+ reviewAndPublishPost: "review-and-publish-post";
53
+ moderatePendingComments: "moderate-pending-comments";
54
+ switchBlogTheme: "switch-blog-theme";
55
+ createBlogTheme: "create-blog-theme";
56
+ createBlogThemeStructure: "create-blog-theme-structure";
57
+ createBlogThemeRuntime: "create-blog-theme-runtime";
58
+ createBlogThemeShell: "create-blog-theme-shell";
59
+ createBlogThemeHomePage: "create-blog-theme-home-page";
60
+ createBlogThemePostPage: "create-blog-theme-post-page";
61
+ createBlogThemeArchivePage: "create-blog-theme-archive-page";
62
+ createBlogThemeContentPage: "create-blog-theme-content-page";
63
+ createBlogThemeCategoryPage: "create-blog-theme-category-page";
64
+ createBlogThemeTagPage: "create-blog-theme-tag-page";
65
+ createBlogThemeFriendsPage: "create-blog-theme-friends-page";
66
+ createBlogThemeInteractions: "create-blog-theme-interactions";
67
+ createBlogThemeVerification: "create-blog-theme-verification";
68
+ }>;
69
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/contracts/mcp.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,oBAAoB,SAAiB,CAAC;AACnD,eAAO,MAAM,mBAAmB,cAAc,CAAC;AAC/C,eAAO,MAAM,oBAAoB,eAAe,CAAC;AACjD,eAAO,MAAM,uBAAuB,kBAAkB,CAAC;AAEvD,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgBzB,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;EAiB3B,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { BLOG_PLUGIN_ID } from './identity.js';
2
+ export const BLOG_MCP_PROVIDER_ID = BLOG_PLUGIN_ID;
3
+ export const BLOG_MCP_READ_SCOPE = 'blog:read';
4
+ export const BLOG_MCP_WRITE_SCOPE = 'blog:write';
5
+ export const BLOG_MCP_MODERATE_SCOPE = 'blog:moderate';
6
+ export const BLOG_MCP_TOOLS = Object.freeze({
7
+ listCategories: 'list-category', readCategory: 'read-category',
8
+ createCategory: 'create-category', updateCategory: 'update-category', deleteCategory: 'delete-category',
9
+ listTags: 'list-tag', readTag: 'read-tag', createTag: 'create-tag',
10
+ updateTag: 'update-tag', deleteTag: 'delete-tag',
11
+ listPosts: 'list-post', listPostArchive: 'list-post-archive', searchPosts: 'search-post', readPost: 'read-post', auditPostContent: 'audit-post-content', createPost: 'create-post',
12
+ updatePost: 'update-post', deletePost: 'delete-post', publishPost: 'publish-post', archivePost: 'archive-post',
13
+ listPages: 'list-page', readPage: 'read-page', createPage: 'create-page',
14
+ updatePage: 'update-page', deletePage: 'delete-page', publishPage: 'publish-page', archivePage: 'archive-page',
15
+ listComments: 'list-comment', readComment: 'read-comment', approveComment: 'approve-comment',
16
+ rejectComment: 'reject-comment', replyComment: 'reply-comment', deleteComment: 'delete-comment',
17
+ listFriendLinks: 'list-friend-link', readFriendLink: 'read-friend-link',
18
+ createFriendLink: 'create-friend-link', updateFriendLink: 'update-friend-link',
19
+ enableFriendLink: 'enable-friend-link', disableFriendLink: 'disable-friend-link', deleteFriendLink: 'delete-friend-link',
20
+ listThemes: 'list-theme', readThemeSelection: 'read-theme-selection',
21
+ selectTheme: 'select-theme', readThemeStatus: 'read-theme-status',
22
+ });
23
+ export const BLOG_MCP_PROMPTS = Object.freeze({
24
+ reviewAndPublishPost: 'review-and-publish-post',
25
+ moderatePendingComments: 'moderate-pending-comments',
26
+ switchBlogTheme: 'switch-blog-theme',
27
+ createBlogTheme: 'create-blog-theme',
28
+ createBlogThemeStructure: 'create-blog-theme-structure',
29
+ createBlogThemeRuntime: 'create-blog-theme-runtime',
30
+ createBlogThemeShell: 'create-blog-theme-shell',
31
+ createBlogThemeHomePage: 'create-blog-theme-home-page',
32
+ createBlogThemePostPage: 'create-blog-theme-post-page',
33
+ createBlogThemeArchivePage: 'create-blog-theme-archive-page',
34
+ createBlogThemeContentPage: 'create-blog-theme-content-page',
35
+ createBlogThemeCategoryPage: 'create-blog-theme-category-page',
36
+ createBlogThemeTagPage: 'create-blog-theme-tag-page',
37
+ createBlogThemeFriendsPage: 'create-blog-theme-friends-page',
38
+ createBlogThemeInteractions: 'create-blog-theme-interactions',
39
+ createBlogThemeVerification: 'create-blog-theme-verification',
40
+ });
41
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/contracts/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,MAAM,CAAC,MAAM,oBAAoB,GAAG,cAAc,CAAC;AACnD,MAAM,CAAC,MAAM,mBAAmB,GAAG,WAAW,CAAC;AAC/C,MAAM,CAAC,MAAM,oBAAoB,GAAG,YAAY,CAAC;AACjD,MAAM,CAAC,MAAM,uBAAuB,GAAG,eAAe,CAAC;AAEvD,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;IAC1C,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,eAAe;IAC9D,cAAc,EAAE,iBAAiB,EAAE,cAAc,EAAE,iBAAiB,EAAE,cAAc,EAAE,iBAAiB;IACvG,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY;IAClE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY;IAChD,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,mBAAmB,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,UAAU,EAAE,aAAa;IAClL,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc;IAC9G,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa;IACxE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc;IAC9G,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,iBAAiB;IAC5F,aAAa,EAAE,gBAAgB,EAAE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,gBAAgB;IAC/F,eAAe,EAAE,kBAAkB,EAAE,cAAc,EAAE,kBAAkB;IACvE,gBAAgB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,oBAAoB;IAC9E,gBAAgB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,oBAAoB;IACxH,UAAU,EAAE,YAAY,EAAE,kBAAkB,EAAE,sBAAsB;IACpE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,mBAAmB;CAClE,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC;IAC5C,oBAAoB,EAAE,yBAAyB;IAC/C,uBAAuB,EAAE,2BAA2B;IACpD,eAAe,EAAE,mBAAmB;IACpC,eAAe,EAAE,mBAAmB;IACpC,wBAAwB,EAAE,6BAA6B;IACvD,sBAAsB,EAAE,2BAA2B;IACnD,oBAAoB,EAAE,yBAAyB;IAC/C,uBAAuB,EAAE,6BAA6B;IACtD,uBAAuB,EAAE,6BAA6B;IACtD,0BAA0B,EAAE,gCAAgC;IAC5D,0BAA0B,EAAE,gCAAgC;IAC5D,2BAA2B,EAAE,iCAAiC;IAC9D,sBAAsB,EAAE,4BAA4B;IACpD,0BAA0B,EAAE,gCAAgC;IAC5D,2BAA2B,EAAE,gCAAgC;IAC7D,2BAA2B,EAAE,gCAAgC;CAC9D,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { BLOG_BROWSER_API_ERROR_CODES, BLOG_BROWSER_API_OPERATION, BLOG_BROWSER_API_PUBLIC_ROUTES, blogBrowserApiQuerySchema, blogBrowserApiRequestSchema, blogBrowserApiResponseSchema, blogCategoryListSchema, blogCategorySummarySchema, blogCommentListSchema, blogRecentCommentListInputSchema, blogRecentCommentListSchema, blogRecentCommentSchema, blogCommentSchema, blogCommentUserSchema, blogCreateCommentBodySchema, blogFriendLinkListSchema, blogFriendLinkSchema, blogPageDetailSchema, blogPageListSchema, blogPageSummarySchema, blogPostDetailSchema, blogPostEngagementSchema, blogPostLikeResultSchema, blogPostConnectionsSchema, blogPostListSchema, blogPostArchiveSchema, blogPostSearchResultSchema, blogPostSlugSchema, blogPostSummarySchema, blogTagListSchema, blogTagSummarySchema, blogTaxonomySlugSchema, parseBlogBrowserApiRequest, parseBlogBrowserApiResponse, parseBlogCategoryList, parseBlogCategorySummary, parseBlogComment, parseBlogCommentList, parseBlogRecentCommentList, parseBlogFriendLink, parseBlogFriendLinkList, parseBlogPageDetail, parseBlogPageList, parseBlogPageSummary, parseBlogPostDetail, parseBlogPostEngagement, parseBlogPostLikeResult, parseBlogPostConnections, parseBlogPostList, parseBlogPostArchive, parseBlogPostSearchResult, parseBlogPostSummary, parseBlogTagList, parseBlogTagSummary, } from '@zlooks.cn/blog-schema';
2
+ export type { BlogBrowserApiRequest, BlogBrowserApiResponse, BlogCategorySummary, BlogComment, BlogCommentList, BlogRecentComment, BlogRecentCommentListInput, BlogFriendLink, BlogPageDetail, BlogPagePosition, BlogPageSummary, BlogPostDetail, BlogPostEngagement, BlogPostLikeResult, BlogPostConnections, BlogPostList, BlogPostArchive, BlogPostArchiveInput, BlogPostSearchResult, BlogPostSummary, BlogTagSummary, } from '@zlooks.cn/blog-schema';
3
+ //# sourceMappingURL=public-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-api.d.ts","sourceRoot":"","sources":["../../src/contracts/public-api.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,4BAA4B,EAC5B,0BAA0B,EAC1B,8BAA8B,EAC9B,yBAAyB,EACzB,2BAA2B,EAC3B,4BAA4B,EAC5B,sBAAsB,EACtB,yBAAyB,EACzB,qBAAqB,EACrB,gCAAgC,EAChC,2BAA2B,EAC3B,uBAAuB,EACvB,iBAAiB,EACjB,qBAAqB,EACrB,2BAA2B,EAC3B,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,wBAAwB,EACxB,wBAAwB,EACxB,yBAAyB,EACzB,kBAAkB,EAClB,qBAAqB,EACrB,0BAA0B,EAC1B,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACtB,0BAA0B,EAC1B,2BAA2B,EAC3B,qBAAqB,EACrB,wBAAwB,EACxB,gBAAgB,EAChB,oBAAoB,EACpB,0BAA0B,EAC1B,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,iBAAiB,EACjB,oBAAoB,EACpB,yBAAyB,EACzB,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAEhC,YAAY,EACV,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,0BAA0B,EAC1B,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACZ,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,cAAc,GACf,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { BLOG_BROWSER_API_ERROR_CODES, BLOG_BROWSER_API_OPERATION, BLOG_BROWSER_API_PUBLIC_ROUTES, blogBrowserApiQuerySchema, blogBrowserApiRequestSchema, blogBrowserApiResponseSchema, blogCategoryListSchema, blogCategorySummarySchema, blogCommentListSchema, blogRecentCommentListInputSchema, blogRecentCommentListSchema, blogRecentCommentSchema, blogCommentSchema, blogCommentUserSchema, blogCreateCommentBodySchema, blogFriendLinkListSchema, blogFriendLinkSchema, blogPageDetailSchema, blogPageListSchema, blogPageSummarySchema, blogPostDetailSchema, blogPostEngagementSchema, blogPostLikeResultSchema, blogPostConnectionsSchema, blogPostListSchema, blogPostArchiveSchema, blogPostSearchResultSchema, blogPostSlugSchema, blogPostSummarySchema, blogTagListSchema, blogTagSummarySchema, blogTaxonomySlugSchema, parseBlogBrowserApiRequest, parseBlogBrowserApiResponse, parseBlogCategoryList, parseBlogCategorySummary, parseBlogComment, parseBlogCommentList, parseBlogRecentCommentList, parseBlogFriendLink, parseBlogFriendLinkList, parseBlogPageDetail, parseBlogPageList, parseBlogPageSummary, parseBlogPostDetail, parseBlogPostEngagement, parseBlogPostLikeResult, parseBlogPostConnections, parseBlogPostList, parseBlogPostArchive, parseBlogPostSearchResult, parseBlogPostSummary, parseBlogTagList, parseBlogTagSummary, } from '@zlooks.cn/blog-schema';
2
+ //# sourceMappingURL=public-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-api.js","sourceRoot":"","sources":["../../src/contracts/public-api.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,4BAA4B,EAC5B,0BAA0B,EAC1B,8BAA8B,EAC9B,yBAAyB,EACzB,2BAA2B,EAC3B,4BAA4B,EAC5B,sBAAsB,EACtB,yBAAyB,EACzB,qBAAqB,EACrB,gCAAgC,EAChC,2BAA2B,EAC3B,uBAAuB,EACvB,iBAAiB,EACjB,qBAAqB,EACrB,2BAA2B,EAC3B,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,wBAAwB,EACxB,wBAAwB,EACxB,yBAAyB,EACzB,kBAAkB,EAClB,qBAAqB,EACrB,0BAA0B,EAC1B,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACtB,0BAA0B,EAC1B,2BAA2B,EAC3B,qBAAqB,EACrB,wBAAwB,EACxB,gBAAgB,EAChB,oBAAoB,EACpB,0BAA0B,EAC1B,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,iBAAiB,EACjB,oBAAoB,EACpB,yBAAyB,EACzB,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC"}