@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.
- package/dist/blog/blog-application.d.ts +153 -0
- package/dist/blog/blog-application.d.ts.map +1 -0
- package/dist/blog/blog-application.js +115 -0
- package/dist/blog/blog-application.js.map +1 -0
- package/dist/blog/comment-client-metadata.d.ts +19 -0
- package/dist/blog/comment-client-metadata.d.ts.map +1 -0
- package/dist/blog/comment-client-metadata.js +78 -0
- package/dist/blog/comment-client-metadata.js.map +1 -0
- package/dist/blog/errors.d.ts +12 -0
- package/dist/blog/errors.d.ts.map +1 -0
- package/dist/blog/errors.js +21 -0
- package/dist/blog/errors.js.map +1 -0
- package/dist/blog/micro-user-directory.d.ts +11 -0
- package/dist/blog/micro-user-directory.d.ts.map +1 -0
- package/dist/blog/micro-user-directory.js +18 -0
- package/dist/blog/micro-user-directory.js.map +1 -0
- package/dist/blog/post-content-audit.d.ts +34 -0
- package/dist/blog/post-content-audit.d.ts.map +1 -0
- package/dist/blog/post-content-audit.js +190 -0
- package/dist/blog/post-content-audit.js.map +1 -0
- package/dist/blog/post-view-cache.d.ts +15 -0
- package/dist/blog/post-view-cache.d.ts.map +1 -0
- package/dist/blog/post-view-cache.js +23 -0
- package/dist/blog/post-view-cache.js.map +1 -0
- package/dist/blog/public-blog-micro.d.ts +291 -0
- package/dist/blog/public-blog-micro.d.ts.map +1 -0
- package/dist/blog/public-blog-micro.js +71 -0
- package/dist/blog/public-blog-micro.js.map +1 -0
- package/dist/blog/public-blog-service.d.ts +104 -0
- package/dist/blog/public-blog-service.d.ts.map +1 -0
- package/dist/blog/public-blog-service.js +341 -0
- package/dist/blog/public-blog-service.js.map +1 -0
- package/dist/browser-api/dispatch-stream.d.ts +5 -0
- package/dist/browser-api/dispatch-stream.d.ts.map +1 -0
- package/dist/browser-api/dispatch-stream.js +4 -0
- package/dist/browser-api/dispatch-stream.js.map +1 -0
- package/dist/browser-api/dispatcher.d.ts +15 -0
- package/dist/browser-api/dispatcher.d.ts.map +1 -0
- package/dist/browser-api/dispatcher.js +145 -0
- package/dist/browser-api/dispatcher.js.map +1 -0
- package/dist/browser-api/provider-publisher.d.ts +24 -0
- package/dist/browser-api/provider-publisher.d.ts.map +1 -0
- package/dist/browser-api/provider-publisher.js +107 -0
- package/dist/browser-api/provider-publisher.js.map +1 -0
- package/dist/command/index.d.ts +3 -0
- package/dist/command/index.d.ts.map +1 -0
- package/dist/command/index.js +24 -0
- package/dist/command/index.js.map +1 -0
- package/dist/config/schema.d.ts +25 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +19 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/contracts/identity.d.ts +2 -0
- package/dist/contracts/identity.d.ts.map +1 -0
- package/dist/contracts/identity.js +2 -0
- package/dist/contracts/identity.js.map +1 -0
- package/dist/contracts/mcp.d.ts +69 -0
- package/dist/contracts/mcp.d.ts.map +1 -0
- package/dist/contracts/mcp.js +41 -0
- package/dist/contracts/mcp.js.map +1 -0
- package/dist/contracts/public-api.d.ts +3 -0
- package/dist/contracts/public-api.d.ts.map +1 -0
- package/dist/contracts/public-api.js +2 -0
- package/dist/contracts/public-api.js.map +1 -0
- package/dist/mcp/blog-prompts.d.ts +135 -0
- package/dist/mcp/blog-prompts.d.ts.map +1 -0
- package/dist/mcp/blog-prompts.js +107 -0
- package/dist/mcp/blog-prompts.js.map +1 -0
- package/dist/mcp/blog-provider.d.ts +4 -0
- package/dist/mcp/blog-provider.d.ts.map +1 -0
- package/dist/mcp/blog-provider.js +27 -0
- package/dist/mcp/blog-provider.js.map +1 -0
- package/dist/mcp/blog-theme-authoring-prompt.d.ts +19 -0
- package/dist/mcp/blog-theme-authoring-prompt.d.ts.map +1 -0
- package/dist/mcp/blog-theme-authoring-prompt.js +171 -0
- package/dist/mcp/blog-theme-authoring-prompt.js.map +1 -0
- package/dist/mcp/category-tools.d.ts +45 -0
- package/dist/mcp/category-tools.d.ts.map +1 -0
- package/dist/mcp/category-tools.js +14 -0
- package/dist/mcp/category-tools.js.map +1 -0
- package/dist/mcp/comment-tools.d.ts +44 -0
- package/dist/mcp/comment-tools.d.ts.map +1 -0
- package/dist/mcp/comment-tools.js +15 -0
- package/dist/mcp/comment-tools.js.map +1 -0
- package/dist/mcp/friend-link-tools.d.ts +63 -0
- package/dist/mcp/friend-link-tools.d.ts.map +1 -0
- package/dist/mcp/friend-link-tools.js +16 -0
- package/dist/mcp/friend-link-tools.js.map +1 -0
- package/dist/mcp/page-tools.d.ts +67 -0
- package/dist/mcp/page-tools.d.ts.map +1 -0
- package/dist/mcp/page-tools.js +36 -0
- package/dist/mcp/page-tools.js.map +1 -0
- package/dist/mcp/post-tools.d.ts +114 -0
- package/dist/mcp/post-tools.d.ts.map +1 -0
- package/dist/mcp/post-tools.js +122 -0
- package/dist/mcp/post-tools.js.map +1 -0
- package/dist/mcp/tag-tools.d.ts +37 -0
- package/dist/mcp/tag-tools.d.ts.map +1 -0
- package/dist/mcp/tag-tools.js +14 -0
- package/dist/mcp/tag-tools.js.map +1 -0
- package/dist/mcp/theme-tools.d.ts +16 -0
- package/dist/mcp/theme-tools.d.ts.map +1 -0
- package/dist/mcp/theme-tools.js +71 -0
- package/dist/mcp/theme-tools.js.map +1 -0
- package/dist/mcp/tool-descriptions.d.ts +5 -0
- package/dist/mcp/tool-descriptions.d.ts.map +1 -0
- package/dist/mcp/tool-descriptions.js +51 -0
- package/dist/mcp/tool-descriptions.js.map +1 -0
- package/dist/mcp/tool-support.d.ts +242 -0
- package/dist/mcp/tool-support.d.ts.map +1 -0
- package/dist/mcp/tool-support.js +127 -0
- package/dist/mcp/tool-support.js.map +1 -0
- package/dist/messages/browser/dispatch.msg.d.ts +3 -0
- package/dist/messages/browser/dispatch.msg.d.ts.map +1 -0
- package/dist/messages/browser/dispatch.msg.js +9 -0
- package/dist/messages/browser/dispatch.msg.js.map +1 -0
- package/dist/messages/public/categories/list.msg.d.ts +3 -0
- package/dist/messages/public/categories/list.msg.d.ts.map +1 -0
- package/dist/messages/public/categories/list.msg.js +8 -0
- package/dist/messages/public/categories/list.msg.js.map +1 -0
- package/dist/messages/public/comments/list.msg.d.ts +3 -0
- package/dist/messages/public/comments/list.msg.d.ts.map +1 -0
- package/dist/messages/public/comments/list.msg.js +8 -0
- package/dist/messages/public/comments/list.msg.js.map +1 -0
- package/dist/messages/public/comments/recent.msg.d.ts +3 -0
- package/dist/messages/public/comments/recent.msg.d.ts.map +1 -0
- package/dist/messages/public/comments/recent.msg.js +8 -0
- package/dist/messages/public/comments/recent.msg.js.map +1 -0
- package/dist/messages/public/friend-links/list.msg.d.ts +3 -0
- package/dist/messages/public/friend-links/list.msg.d.ts.map +1 -0
- package/dist/messages/public/friend-links/list.msg.js +8 -0
- package/dist/messages/public/friend-links/list.msg.js.map +1 -0
- package/dist/messages/public/pages/list.msg.d.ts +3 -0
- package/dist/messages/public/pages/list.msg.d.ts.map +1 -0
- package/dist/messages/public/pages/list.msg.js +8 -0
- package/dist/messages/public/pages/list.msg.js.map +1 -0
- package/dist/messages/public/pages/read.msg.d.ts +3 -0
- package/dist/messages/public/pages/read.msg.d.ts.map +1 -0
- package/dist/messages/public/pages/read.msg.js +8 -0
- package/dist/messages/public/pages/read.msg.js.map +1 -0
- package/dist/messages/public/posts/archive.msg.d.ts +3 -0
- package/dist/messages/public/posts/archive.msg.d.ts.map +1 -0
- package/dist/messages/public/posts/archive.msg.js +8 -0
- package/dist/messages/public/posts/archive.msg.js.map +1 -0
- package/dist/messages/public/posts/connections.msg.d.ts +3 -0
- package/dist/messages/public/posts/connections.msg.d.ts.map +1 -0
- package/dist/messages/public/posts/connections.msg.js +8 -0
- package/dist/messages/public/posts/connections.msg.js.map +1 -0
- package/dist/messages/public/posts/list.msg.d.ts +3 -0
- package/dist/messages/public/posts/list.msg.d.ts.map +1 -0
- package/dist/messages/public/posts/list.msg.js +8 -0
- package/dist/messages/public/posts/list.msg.js.map +1 -0
- package/dist/messages/public/posts/open.msg.d.ts +3 -0
- package/dist/messages/public/posts/open.msg.d.ts.map +1 -0
- package/dist/messages/public/posts/open.msg.js +8 -0
- package/dist/messages/public/posts/open.msg.js.map +1 -0
- package/dist/messages/public/posts/read.msg.d.ts +3 -0
- package/dist/messages/public/posts/read.msg.d.ts.map +1 -0
- package/dist/messages/public/posts/read.msg.js +8 -0
- package/dist/messages/public/posts/read.msg.js.map +1 -0
- package/dist/messages/public/tags/list.msg.d.ts +3 -0
- package/dist/messages/public/tags/list.msg.d.ts.map +1 -0
- package/dist/messages/public/tags/list.msg.js +8 -0
- package/dist/messages/public/tags/list.msg.js.map +1 -0
- package/dist/migrations/index.d.ts +3 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +2 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/persistence/category-store.d.ts +23 -0
- package/dist/persistence/category-store.d.ts.map +1 -0
- package/dist/persistence/category-store.js +86 -0
- package/dist/persistence/category-store.js.map +1 -0
- package/dist/persistence/comment-store.d.ts +41 -0
- package/dist/persistence/comment-store.d.ts.map +1 -0
- package/dist/persistence/comment-store.js +146 -0
- package/dist/persistence/comment-store.js.map +1 -0
- package/dist/persistence/entities.d.ts +103 -0
- package/dist/persistence/entities.d.ts.map +1 -0
- package/dist/persistence/entities.js +188 -0
- package/dist/persistence/entities.js.map +1 -0
- package/dist/persistence/friend-link-store.d.ts +26 -0
- package/dist/persistence/friend-link-store.d.ts.map +1 -0
- package/dist/persistence/friend-link-store.js +80 -0
- package/dist/persistence/friend-link-store.js.map +1 -0
- package/dist/persistence/page-store.d.ts +35 -0
- package/dist/persistence/page-store.d.ts.map +1 -0
- package/dist/persistence/page-store.js +125 -0
- package/dist/persistence/page-store.js.map +1 -0
- package/dist/persistence/post-engagement-store.d.ts +23 -0
- package/dist/persistence/post-engagement-store.d.ts.map +1 -0
- package/dist/persistence/post-engagement-store.js +85 -0
- package/dist/persistence/post-engagement-store.js.map +1 -0
- package/dist/persistence/post-store.d.ts +87 -0
- package/dist/persistence/post-store.d.ts.map +1 -0
- package/dist/persistence/post-store.js +465 -0
- package/dist/persistence/post-store.js.map +1 -0
- package/dist/persistence/tag-store.d.ts +21 -0
- package/dist/persistence/tag-store.d.ts.map +1 -0
- package/dist/persistence/tag-store.js +82 -0
- package/dist/persistence/tag-store.js.map +1 -0
- package/dist/services/application.service.d.ts +4 -0
- package/dist/services/application.service.d.ts.map +1 -0
- package/dist/services/application.service.js +22 -0
- package/dist/services/application.service.js.map +1 -0
- package/dist/services/blog-runtime.service.d.ts +10 -0
- package/dist/services/blog-runtime.service.d.ts.map +1 -0
- package/dist/services/blog-runtime.service.js +32 -0
- package/dist/services/blog-runtime.service.js.map +1 -0
- package/dist/services/blog.boot.d.ts +6 -0
- package/dist/services/blog.boot.d.ts.map +1 -0
- package/dist/services/blog.boot.js +13 -0
- package/dist/services/blog.boot.js.map +1 -0
- package/dist/services/browser-api-provider.service.d.ts +4 -0
- package/dist/services/browser-api-provider.service.d.ts.map +1 -0
- package/dist/services/browser-api-provider.service.js +25 -0
- package/dist/services/browser-api-provider.service.js.map +1 -0
- package/dist/services/config.service.d.ts +3 -0
- package/dist/services/config.service.d.ts.map +1 -0
- package/dist/services/config.service.js +22 -0
- package/dist/services/config.service.js.map +1 -0
- package/dist/services/database.service.d.ts +3 -0
- package/dist/services/database.service.d.ts.map +1 -0
- package/dist/services/database.service.js +16 -0
- package/dist/services/database.service.js.map +1 -0
- package/dist/services/logger.service.d.ts +4 -0
- package/dist/services/logger.service.d.ts.map +1 -0
- package/dist/services/logger.service.js +8 -0
- package/dist/services/logger.service.js.map +1 -0
- package/dist/services/mcp-provider.service.d.ts +3 -0
- package/dist/services/mcp-provider.service.d.ts.map +1 -0
- package/dist/services/mcp-provider.service.js +17 -0
- package/dist/services/mcp-provider.service.js.map +1 -0
- package/dist/services/redis.service.d.ts +4 -0
- package/dist/services/redis.service.d.ts.map +1 -0
- package/dist/services/redis.service.js +18 -0
- package/dist/services/redis.service.js.map +1 -0
- package/dist/services/theme-control.service.d.ts +4 -0
- package/dist/services/theme-control.service.d.ts.map +1 -0
- package/dist/services/theme-control.service.js +53 -0
- package/dist/services/theme-control.service.js.map +1 -0
- package/dist/themes/theme-catalog.d.ts +40 -0
- package/dist/themes/theme-catalog.d.ts.map +1 -0
- package/dist/themes/theme-catalog.js +164 -0
- package/dist/themes/theme-catalog.js.map +1 -0
- package/dist/themes/theme-control.d.ts +16 -0
- package/dist/themes/theme-control.d.ts.map +1 -0
- package/dist/themes/theme-control.js +57 -0
- package/dist/themes/theme-control.js.map +1 -0
- package/dist/themes/theme-discovery-runtime.d.ts +41 -0
- package/dist/themes/theme-discovery-runtime.d.ts.map +1 -0
- package/dist/themes/theme-discovery-runtime.js +109 -0
- package/dist/themes/theme-discovery-runtime.js.map +1 -0
- package/dist/themes/theme-generation-store.d.ts +14 -0
- package/dist/themes/theme-generation-store.d.ts.map +1 -0
- package/dist/themes/theme-generation-store.js +49 -0
- package/dist/themes/theme-generation-store.js.map +1 -0
- package/dist/themes/theme-selection-publisher.d.ts +28 -0
- package/dist/themes/theme-selection-publisher.d.ts.map +1 -0
- package/dist/themes/theme-selection-publisher.js +92 -0
- package/dist/themes/theme-selection-publisher.js.map +1 -0
- package/dist/themes/theme-selection-store.d.ts +22 -0
- package/dist/themes/theme-selection-store.d.ts.map +1 -0
- package/dist/themes/theme-selection-store.js +84 -0
- package/dist/themes/theme-selection-store.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|