@oneentry/mcp-platform-server 0.1.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 (100) hide show
  1. package/README.md +189 -0
  2. package/data/catalog.json +1 -0
  3. package/data/knowledge.json +1 -0
  4. package/dist/api/audit.d.ts +32 -0
  5. package/dist/api/audit.d.ts.map +1 -0
  6. package/dist/api/audit.js +35 -0
  7. package/dist/api/audit.js.map +1 -0
  8. package/dist/api/auth.d.ts +53 -0
  9. package/dist/api/auth.d.ts.map +1 -0
  10. package/dist/api/auth.js +126 -0
  11. package/dist/api/auth.js.map +1 -0
  12. package/dist/api/catalog.d.ts +39 -0
  13. package/dist/api/catalog.d.ts.map +1 -0
  14. package/dist/api/catalog.js +108 -0
  15. package/dist/api/catalog.js.map +1 -0
  16. package/dist/api/client.d.ts +60 -0
  17. package/dist/api/client.d.ts.map +1 -0
  18. package/dist/api/client.js +196 -0
  19. package/dist/api/client.js.map +1 -0
  20. package/dist/api/policy.d.ts +52 -0
  21. package/dist/api/policy.d.ts.map +1 -0
  22. package/dist/api/policy.js +0 -0
  23. package/dist/api/policy.js.map +1 -0
  24. package/dist/api/shape.d.ts +19 -0
  25. package/dist/api/shape.d.ts.map +1 -0
  26. package/dist/api/shape.js +151 -0
  27. package/dist/api/shape.js.map +1 -0
  28. package/dist/api/types.d.ts +85 -0
  29. package/dist/api/types.d.ts.map +1 -0
  30. package/dist/api/types.js +2 -0
  31. package/dist/api/types.js.map +1 -0
  32. package/dist/bin/cli.d.ts +3 -0
  33. package/dist/bin/cli.d.ts.map +1 -0
  34. package/dist/bin/cli.js +48 -0
  35. package/dist/bin/cli.js.map +1 -0
  36. package/dist/config/config.d.ts +108 -0
  37. package/dist/config/config.d.ts.map +1 -0
  38. package/dist/config/config.js +167 -0
  39. package/dist/config/config.js.map +1 -0
  40. package/dist/index.d.ts +23 -0
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/index.js +18 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/knowledge/chunk.d.ts +35 -0
  45. package/dist/knowledge/chunk.d.ts.map +1 -0
  46. package/dist/knowledge/chunk.js +87 -0
  47. package/dist/knowledge/chunk.js.map +1 -0
  48. package/dist/knowledge/loader.d.ts +27 -0
  49. package/dist/knowledge/loader.d.ts.map +1 -0
  50. package/dist/knowledge/loader.js +125 -0
  51. package/dist/knowledge/loader.js.map +1 -0
  52. package/dist/knowledge/search.d.ts +34 -0
  53. package/dist/knowledge/search.d.ts.map +1 -0
  54. package/dist/knowledge/search.js +95 -0
  55. package/dist/knowledge/search.js.map +1 -0
  56. package/dist/knowledge/types.d.ts +47 -0
  57. package/dist/knowledge/types.d.ts.map +1 -0
  58. package/dist/knowledge/types.js +2 -0
  59. package/dist/knowledge/types.js.map +1 -0
  60. package/dist/server.d.ts +16 -0
  61. package/dist/server.d.ts.map +1 -0
  62. package/dist/server.js +48 -0
  63. package/dist/server.js.map +1 -0
  64. package/dist/session.d.ts +43 -0
  65. package/dist/session.d.ts.map +1 -0
  66. package/dist/session.js +75 -0
  67. package/dist/session.js.map +1 -0
  68. package/dist/tools/api-call.d.ts +5 -0
  69. package/dist/tools/api-call.d.ts.map +1 -0
  70. package/dist/tools/api-call.js +169 -0
  71. package/dist/tools/api-call.js.map +1 -0
  72. package/dist/tools/api-discovery.d.ts +5 -0
  73. package/dist/tools/api-discovery.d.ts.map +1 -0
  74. package/dist/tools/api-discovery.js +80 -0
  75. package/dist/tools/api-discovery.js.map +1 -0
  76. package/dist/tools/docs.d.ts +5 -0
  77. package/dist/tools/docs.d.ts.map +1 -0
  78. package/dist/tools/docs.js +113 -0
  79. package/dist/tools/docs.js.map +1 -0
  80. package/dist/tools/guide.d.ts +11 -0
  81. package/dist/tools/guide.d.ts.map +1 -0
  82. package/dist/tools/guide.js +67 -0
  83. package/dist/tools/guide.js.map +1 -0
  84. package/dist/tools/result.d.ts +19 -0
  85. package/dist/tools/result.d.ts.map +1 -0
  86. package/dist/tools/result.js +19 -0
  87. package/dist/tools/result.js.map +1 -0
  88. package/dist/tools/whoami.d.ts +5 -0
  89. package/dist/tools/whoami.d.ts.map +1 -0
  90. package/dist/tools/whoami.js +42 -0
  91. package/dist/tools/whoami.js.map +1 -0
  92. package/dist/transports/http.d.ts +10 -0
  93. package/dist/transports/http.d.ts.map +1 -0
  94. package/dist/transports/http.js +126 -0
  95. package/dist/transports/http.js.map +1 -0
  96. package/dist/transports/stdio.d.ts +8 -0
  97. package/dist/transports/stdio.d.ts.map +1 -0
  98. package/dist/transports/stdio.js +15 -0
  99. package/dist/transports/stdio.js.map +1 -0
  100. package/package.json +60 -0
@@ -0,0 +1,196 @@
1
+ /** Ошибка на стороне вызывающего — до отправки запроса. */
2
+ export class RequestBuildError extends Error {
3
+ }
4
+ /**
5
+ * Возвращает тело в том виде, в каком его надо сериализовать в запрос.
6
+ * Часть MCP-клиентов передаёт объектный аргумент уже сериализованным в строку;
7
+ * без этой нормализации `JSON.stringify` завернул бы его второй раз, и на сервер
8
+ * ушла бы JSON-строка вместо объекта — любая запись падала бы с невнятным 400.
9
+ * Разворачивается только строка, которая целиком является объектом или массивом:
10
+ * скалярная строка — законное тело, и трогать её нельзя.
11
+ */
12
+ export const normalizeBody = (body) => {
13
+ if (typeof body !== 'string') {
14
+ return body;
15
+ }
16
+ const trimmed = body.trim();
17
+ if (!trimmed.startsWith('{') && !trimmed.startsWith('[')) {
18
+ return body;
19
+ }
20
+ try {
21
+ const parsed = JSON.parse(trimmed);
22
+ return typeof parsed === 'object' && parsed !== null ? parsed : body;
23
+ }
24
+ catch {
25
+ return body;
26
+ }
27
+ };
28
+ /**
29
+ * Подставляет path-параметры и собирает query-строку.
30
+ * Отсутствующий обязательный path-параметр — ошибка здесь, а не 404 от сервера:
31
+ * иначе агент получает загадочный ответ вместо указания, чего не хватает.
32
+ */
33
+ export const buildUrl = (baseUrl, operation, args) => {
34
+ let path = operation.path;
35
+ const provided = args.path ?? {};
36
+ for (const param of operation.params) {
37
+ if (param.location !== 'path') {
38
+ continue;
39
+ }
40
+ const value = provided[param.name];
41
+ if (value === undefined || value === '') {
42
+ throw new RequestBuildError(`Missing path parameter "${param.name}" for ${operation.opId} (${operation.path}). ` +
43
+ `Pass it as path.${param.name}.`);
44
+ }
45
+ path = path.replace(`{${param.name}}`, encodeURIComponent(String(value)));
46
+ }
47
+ const leftover = /\{([^}]+)\}/.exec(path);
48
+ if (leftover) {
49
+ throw new RequestBuildError(`Path parameter "${leftover[1] ?? ''}" of ${operation.path} was not provided and is not ` +
50
+ 'declared in the catalog — the swagger snapshot may be stale.');
51
+ }
52
+ const search = new URLSearchParams();
53
+ for (const [key, value] of Object.entries(args.query ?? {})) {
54
+ if (value !== undefined && value !== null) {
55
+ search.set(key, String(value));
56
+ }
57
+ }
58
+ const suffix = search.size > 0 ? `?${search.toString()}` : '';
59
+ return `${baseUrl}${path}${suffix}`;
60
+ };
61
+ /** Подбирает подсказку по коду ответа и метаданным операции. */
62
+ const hintFor = (status, operation) => {
63
+ if (status === 400 || status === 422) {
64
+ const loose = operation.body?.schema['x-loose'] === true;
65
+ return (`Validation rejected the payload. ${loose ? 'This body has loosely typed fields — copy the shape from the example in cms_api_describe. ' : ''}` +
66
+ `Read ${operation.docLinks.slice(0, 2).join(', ')} with cms_docs_read before retrying.`);
67
+ }
68
+ if (status === 403) {
69
+ return operation.permission
70
+ ? `The admin lacks "${operation.permission}". Ask for the grant; retrying will not help.`
71
+ : 'Forbidden. Check the admin\'s permissions and the module visibility rules (back/docs/user-permissions).';
72
+ }
73
+ if (status === 404) {
74
+ return 'Not found. The id may belong to another stand — prefer marker-based operations where they exist.';
75
+ }
76
+ if (status >= 500) {
77
+ return 'Server-side failure. Check the dnk-back logs; do not retry blindly.';
78
+ }
79
+ return undefined;
80
+ };
81
+ const readBody = async (response) => {
82
+ const text = await response.text();
83
+ if (text === '') {
84
+ return null;
85
+ }
86
+ try {
87
+ return JSON.parse(text);
88
+ }
89
+ catch {
90
+ return text.slice(0, 2000);
91
+ }
92
+ };
93
+ const extractMessage = (body, fallback) => {
94
+ if (typeof body === 'string') {
95
+ return body.slice(0, 500);
96
+ }
97
+ if (typeof body === 'object' && body !== null) {
98
+ const message = body['message'];
99
+ if (typeof message === 'string') {
100
+ return message;
101
+ }
102
+ if (Array.isArray(message)) {
103
+ return message.map((m) => String(m)).join('; ').slice(0, 500);
104
+ }
105
+ }
106
+ return fallback;
107
+ };
108
+ /**
109
+ * HTTP-клиент Admin API.
110
+ * Единственный ретрай — на 401 после обновления токена: любой другой повтор
111
+ * на изменяющей операции рискует создать дубль, поэтому его здесь нет.
112
+ */
113
+ export class AdminApiClient {
114
+ baseUrl;
115
+ tokens;
116
+ timeoutMs;
117
+ constructor(params) {
118
+ this.baseUrl = params.baseUrl;
119
+ this.tokens = params.tokens;
120
+ this.timeoutMs = params.timeoutMs;
121
+ }
122
+ async call(operation, args) {
123
+ const url = buildUrl(this.baseUrl, operation, args);
124
+ const send = async (token) => {
125
+ const headers = { authorization: `Bearer ${token}` };
126
+ let payload;
127
+ if (args.body !== undefined && operation.method !== 'get') {
128
+ headers['content-type'] = 'application/json';
129
+ payload = JSON.stringify(args.body);
130
+ }
131
+ return fetch(url, {
132
+ method: operation.method.toUpperCase(),
133
+ headers,
134
+ ...(payload !== undefined ? { body: payload } : {}),
135
+ signal: AbortSignal.timeout(this.timeoutMs),
136
+ });
137
+ };
138
+ let response;
139
+ try {
140
+ response = await send(await this.tokens.accessToken());
141
+ if (response.status === 401) {
142
+ response = await send(await this.tokens.refresh());
143
+ }
144
+ }
145
+ catch (error) {
146
+ return {
147
+ ok: false,
148
+ error: {
149
+ status: 0,
150
+ message: `Request to ${url} failed: ${error instanceof Error ? error.message : String(error)}`,
151
+ hint: 'Is the stand reachable? In local mode dnk-back must be running with API_TYPE=/api/admin.',
152
+ },
153
+ };
154
+ }
155
+ const body = await readBody(response);
156
+ if (!response.ok) {
157
+ const hint = hintFor(response.status, operation);
158
+ return {
159
+ ok: false,
160
+ error: {
161
+ status: response.status,
162
+ message: extractMessage(body, `${operation.method.toUpperCase()} ${url} → ${String(response.status)}`),
163
+ ...(hint ? { hint } : {}),
164
+ },
165
+ };
166
+ }
167
+ return { ok: true, status: response.status, body };
168
+ }
169
+ /** Читает набор прав админа. Пустой массив означает «не удалось выяснить». */
170
+ async fetchPermissions(adminId) {
171
+ try {
172
+ const token = await this.tokens.accessToken();
173
+ const response = await fetch(`${this.baseUrl}/admins/${String(adminId)}`, {
174
+ headers: { authorization: `Bearer ${token}` },
175
+ signal: AbortSignal.timeout(this.timeoutMs),
176
+ });
177
+ if (!response.ok) {
178
+ return [];
179
+ }
180
+ const body = await readBody(response);
181
+ const permissions = typeof body === 'object' && body !== null
182
+ ? body['permissions']
183
+ : undefined;
184
+ if (typeof permissions !== 'object' || permissions === null) {
185
+ return [];
186
+ }
187
+ return Object.entries(permissions)
188
+ .filter(([, value]) => value === true)
189
+ .map(([key]) => key);
190
+ }
191
+ catch {
192
+ return [];
193
+ }
194
+ }
195
+ }
196
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import type { AllowLevel } from '../config/config.js';
2
+ import type { AdminIdentity } from './auth.js';
3
+ import type { Operation } from './types.js';
4
+ /** Результат проверки политики перед выполнением операции. */
5
+ export type PolicyDecision = {
6
+ kind: 'allow';
7
+ } | {
8
+ kind: 'deny';
9
+ reason: string;
10
+ } | {
11
+ kind: 'needsConfirm';
12
+ reason: string;
13
+ };
14
+ /**
15
+ * Одноразовые токены подтверждения для необратимых операций.
16
+ * Токен привязан к хэшу (opId + аргументы), поэтому подтверждение одного удаления
17
+ * нельзя переиспользовать для другого — иначе двухшаговость была бы декоративной.
18
+ */
19
+ export declare class ConfirmStore {
20
+ private readonly issued;
21
+ private static hash;
22
+ issue(opId: string, args: unknown, now?: number): string;
23
+ /**
24
+ * Проверяет токен, не гася его.
25
+ * Нужна, чтобы отказ по другой причине (нет права, не тот уровень allow)
26
+ * не сжигал подтверждение, которое человек уже дал.
27
+ */
28
+ verify(token: string, opId: string, args: unknown, now?: number): boolean;
29
+ /** Проверяет и немедленно гасит токен. Повторное использование невозможно. */
30
+ consume(token: string, opId: string, args: unknown, now?: number): boolean;
31
+ private sweep;
32
+ }
33
+ /**
34
+ * Проверяет только уровень `--allow`.
35
+ * Вынесено отдельно, чтобы вызывающий мог отказать до аутентификации:
36
+ * обещание «no request was sent» не должно нарушаться самим логином.
37
+ */
38
+ export declare const checkLevel: (operation: Operation, allow: AllowLevel) => Extract<PolicyDecision, {
39
+ kind: "deny";
40
+ }> | undefined;
41
+ /**
42
+ * Решает, можно ли выполнить операцию.
43
+ * Порядок проверок значим: уровень доступа — до прав, права — до подтверждения,
44
+ * чтобы read-only сервер вообще не выдавал токенов подтверждения.
45
+ */
46
+ export declare const decide: (params: {
47
+ operation: Operation;
48
+ allow: AllowLevel;
49
+ identity?: AdminIdentity;
50
+ confirmValid: boolean;
51
+ }) => PolicyDecision;
52
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/api/policy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAI5C,8DAA8D;AAC9D,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAO7C;;;;GAIG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0D;IAEjF,OAAO,CAAC,MAAM,CAAC,IAAI;IAMnB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,SAAa,GAAG,MAAM;IAU5D;;;;OAIG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,SAAa,GAAG,OAAO;IAS7E,8EAA8E;IAC9E,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,SAAa,GAAG,OAAO;IAU9E,OAAO,CAAC,KAAK;CAOd;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,GACrB,WAAW,SAAS,EACpB,OAAO,UAAU,KAChB,OAAO,CAAC,cAAc,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,SAY9C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,MAAM,GAAI,QAAQ;IAC7B,SAAS,EAAE,SAAS,CAAC;IACrB,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,YAAY,EAAE,OAAO,CAAC;CACvB,KAAG,cAoCH,CAAC"}
Binary file
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/api/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAKtD,MAAM,WAAW,GAA+B,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;AAQtF,2EAA2E;AAC3E,MAAM,aAAa,GAAG,CAAC,SAAoB,EAAc,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC;AAE3E,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAErC;;;;GAIG;AACH,MAAM,OAAO,YAAY;IACN,MAAM,GAAG,IAAI,GAAG,EAA+C,CAAC;IAEzE,MAAM,CAAC,IAAI,CAAC,IAAY,EAAE,IAAa;QAC7C,OAAO,UAAU,CAAC,QAAQ,CAAC;aACxB,MAAM,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;aACjD,MAAM,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,IAAY,EAAE,IAAa,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACjD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChB,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE;YACrB,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;YACnC,SAAS,EAAE,GAAG,GAAG,cAAc;SAChC,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,KAAa,EAAE,IAAY,EAAE,IAAa,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACjE,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrC,OAAO,CACL,KAAK,KAAK,SAAS;YACnB,KAAK,CAAC,SAAS,GAAG,GAAG;YACrB,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAC7C,CAAC;IACJ,CAAC;IAED,8EAA8E;IAC9E,OAAO,CAAC,KAAa,EAAE,IAAY,EAAE,IAAa,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QAClE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1B,OAAO,KAAK,CAAC,SAAS,GAAG,GAAG,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/E,CAAC;IAEO,KAAK,CAAC,GAAW;QACvB,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACzC,IAAI,KAAK,CAAC,SAAS,IAAI,GAAG,EAAE,CAAC;gBAC3B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,SAAoB,EACpB,KAAiB,EACsC,EAAE;IACzD,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IACxC,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9C,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,MAAM,EACJ,GAAG,SAAS,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,SAAS,CAAC,IAAI,UAAU,SAAS,CAAC,IAAI,eAAe;YAC1F,qCAAqC,KAAK,yBAAyB;YACnE,+CAA+C,MAAM,GAAG;KAC3D,CAAC;AACJ,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,MAKtB,EAAkB,EAAE;IACnB,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;IAE5D,MAAM,WAAW,GAAG,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACjD,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACH,IAAI,SAAS,CAAC,UAAU,IAAI,QAAQ,IAAI,QAAQ,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;YACzD,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,MAAM,EACJ,UAAU,QAAQ,CAAC,EAAE,eAAe,SAAS,CAAC,UAAU,2BAA2B;oBACnF,GAAG,SAAS,CAAC,IAAI,gEAAgE;aACpF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,SAAS,CAAC,IAAI,KAAK,aAAa,IAAI,SAAS,CAAC,aAAa,EAAE,CAAC;QAChE,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO;gBACL,IAAI,EAAE,cAAc;gBACpB,MAAM,EAAE,SAAS,CAAC,aAAa;oBAC7B,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,uFAAuF;oBAC1G,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,SAAS,CAAC,IAAI,mBAAmB;aAC3E,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ /** Результат подготовки ответа к отдаче модели. */
2
+ export interface ShapedResponse {
3
+ body: unknown;
4
+ truncated: boolean;
5
+ }
6
+ /**
7
+ * Приводит ответ Admin API к размеру, пригодному для контекста модели.
8
+ * Массивы урезаются по элементам (а не обрывом JSON), поэтому результат
9
+ * остаётся валидным и самоописанным: агент видит `_truncated` и сужает запрос.
10
+ */
11
+ export declare const shapeResponse: (raw: unknown, maxBytes: number) => ShapedResponse;
12
+ /**
13
+ * Сжимает текущее состояние цели до размера, который не топит ответ dry-run.
14
+ * Целиком отдаётся только небольшая цель: для создания в коллекции «цель» — это весь
15
+ * список существующих объектов, а он бывает в сотни килобайт и вытесняет собой
16
+ * единственно нужные части плана — политику и собранный запрос.
17
+ */
18
+ export declare const summarizeTarget: (target: unknown) => unknown;
19
+ //# sourceMappingURL=shape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shape.d.ts","sourceRoot":"","sources":["../../src/api/shape.ts"],"names":[],"mappings":"AA+BA,mDAAmD;AACnD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,KAAK,OAAO,EAAE,UAAU,MAAM,KAAG,cA0D9D,CAAC;AAiBF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAAI,QAAQ,OAAO,KAAG,OAmCjD,CAAC"}
@@ -0,0 +1,151 @@
1
+ /** Поля, значения которых бесполезны модели и раздувают ответ. */
2
+ const BLOB_KEYS = new Set(['base64', 'buffer', 'content', 'fileContent', 'data64', 'blob']);
3
+ const BLOB_VALUE_LIMIT = 512;
4
+ const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
5
+ /** Похоже ли строковое значение на base64-блоб, который незачем показывать. */
6
+ const looksLikeBlob = (key, value) => typeof value === 'string' &&
7
+ value.length > BLOB_VALUE_LIMIT &&
8
+ (BLOB_KEYS.has(key) || /^data:|^[A-Za-z0-9+/=]{512,}$/.test(value));
9
+ /** Рекурсивно заменяет блобы заглушкой с указанием исходного размера. */
10
+ const stripBlobs = (value, key = '') => {
11
+ if (looksLikeBlob(key, value)) {
12
+ return `[stripped ${String(value.length)} chars]`;
13
+ }
14
+ if (Array.isArray(value)) {
15
+ return value.map((item) => stripBlobs(item));
16
+ }
17
+ if (isRecord(value)) {
18
+ const out = {};
19
+ for (const [k, v] of Object.entries(value)) {
20
+ out[k] = stripBlobs(v, k);
21
+ }
22
+ return out;
23
+ }
24
+ return value;
25
+ };
26
+ /**
27
+ * Приводит ответ Admin API к размеру, пригодному для контекста модели.
28
+ * Массивы урезаются по элементам (а не обрывом JSON), поэтому результат
29
+ * остаётся валидным и самоописанным: агент видит `_truncated` и сужает запрос.
30
+ */
31
+ export const shapeResponse = (raw, maxBytes) => {
32
+ const cleaned = stripBlobs(raw);
33
+ const size = (value) => Buffer.byteLength(JSON.stringify(value) ?? '', 'utf8');
34
+ if (size(cleaned) <= maxBytes) {
35
+ return { body: cleaned, truncated: false };
36
+ }
37
+ /** Массив верхнего уровня: оставляем префикс элементов. */
38
+ if (Array.isArray(cleaned)) {
39
+ const kept = takePrefix(cleaned, maxBytes);
40
+ return {
41
+ body: {
42
+ items: kept,
43
+ _truncated: {
44
+ shown: kept.length,
45
+ total: cleaned.length,
46
+ hint: 'Narrow the result with the operation\'s own limit/offset/filter parameters.',
47
+ },
48
+ },
49
+ truncated: true,
50
+ };
51
+ }
52
+ /** Пагинированный объект: урезаем самый большой массив внутри него. */
53
+ if (isRecord(cleaned)) {
54
+ const arrayKey = Object.entries(cleaned)
55
+ .filter(([, value]) => Array.isArray(value))
56
+ .sort((a, b) => size(b[1]) - size(a[1]))[0]?.[0];
57
+ if (arrayKey) {
58
+ const items = cleaned[arrayKey];
59
+ const overhead = size({ ...cleaned, [arrayKey]: [] });
60
+ const kept = takePrefix(items, Math.max(maxBytes - overhead, 256));
61
+ return {
62
+ body: {
63
+ ...cleaned,
64
+ [arrayKey]: kept,
65
+ _truncated: {
66
+ key: arrayKey,
67
+ shown: kept.length,
68
+ total: items.length,
69
+ hint: 'Narrow the result with the operation\'s own limit/offset/filter parameters.',
70
+ },
71
+ },
72
+ truncated: true,
73
+ };
74
+ }
75
+ }
76
+ return {
77
+ body: {
78
+ _truncated: {
79
+ hint: `Response exceeded ${String(maxBytes)} bytes and is not a list; request a narrower projection.`,
80
+ preview: JSON.stringify(cleaned).slice(0, maxBytes),
81
+ },
82
+ },
83
+ truncated: true,
84
+ };
85
+ };
86
+ /** Бюджет на показ текущего состояния цели в плане dry-run и в запросе подтверждения. */
87
+ const TARGET_LIMIT = 4_000;
88
+ /** Сколько идентификаторов списка показывать в сводке. */
89
+ const TARGET_ID_SAMPLE = 20;
90
+ /** Собирает опознавательные значения элементов списка: id, если он есть, иначе сам элемент. */
91
+ const identify = (items) => items.slice(0, TARGET_ID_SAMPLE).map((item) => {
92
+ if (!isRecord(item)) {
93
+ return item;
94
+ }
95
+ const id = item['id'] ?? item['identifier'] ?? item['marker'];
96
+ return id ?? Object.keys(item).slice(0, 3);
97
+ });
98
+ /**
99
+ * Сжимает текущее состояние цели до размера, который не топит ответ dry-run.
100
+ * Целиком отдаётся только небольшая цель: для создания в коллекции «цель» — это весь
101
+ * список существующих объектов, а он бывает в сотни килобайт и вытесняет собой
102
+ * единственно нужные части плана — политику и собранный запрос.
103
+ */
104
+ export const summarizeTarget = (target) => {
105
+ if (target === undefined || target === null) {
106
+ return null;
107
+ }
108
+ const size = (value) => Buffer.byteLength(JSON.stringify(value) ?? '', 'utf8');
109
+ if (size(target) <= TARGET_LIMIT) {
110
+ return target;
111
+ }
112
+ const hint = 'Summarised: read the target in full with a separate GET if you need it.';
113
+ if (Array.isArray(target)) {
114
+ return { _summary: { kind: 'list', count: target.length, ids: identify(target), hint } };
115
+ }
116
+ if (isRecord(target)) {
117
+ const compacted = {};
118
+ for (const [key, value] of Object.entries(target)) {
119
+ compacted[key] = Array.isArray(value)
120
+ ? { _summary: { kind: 'list', count: value.length, ids: identify(value) } }
121
+ : value;
122
+ }
123
+ if (size(compacted) <= TARGET_LIMIT) {
124
+ return { ...compacted, _summary: { hint } };
125
+ }
126
+ return {
127
+ _summary: {
128
+ kind: 'object',
129
+ keys: Object.keys(target),
130
+ ...(target['id'] !== undefined ? { id: target['id'] } : {}),
131
+ hint,
132
+ },
133
+ };
134
+ }
135
+ return { _summary: { kind: 'value', preview: String(target).slice(0, 200), hint } };
136
+ };
137
+ /** Берёт максимальный префикс массива, укладывающийся в бюджет байтов. */
138
+ const takePrefix = (items, maxBytes) => {
139
+ const kept = [];
140
+ let used = 2;
141
+ for (const item of items) {
142
+ const chunk = Buffer.byteLength(JSON.stringify(item) ?? 'null', 'utf8') + 1;
143
+ if (used + chunk > maxBytes) {
144
+ break;
145
+ }
146
+ kept.push(item);
147
+ used += chunk;
148
+ }
149
+ return kept;
150
+ };
151
+ //# sourceMappingURL=shape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shape.js","sourceRoot":"","sources":["../../src/api/shape.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ /** HTTP-методы, встречающиеся в Admin API. */
2
+ export type HttpMethod = 'get' | 'post' | 'put' | 'patch' | 'delete';
3
+ /**
4
+ * Класс риска операции. Определяется на сборке каталога, а не в рантайме,
5
+ * чтобы политику доступа нельзя было обойти хитрым аргументом.
6
+ */
7
+ export type RiskLevel = 'read' | 'write' | 'destructive';
8
+ /** Параметр операции (path / query / header). */
9
+ export interface OperationParam {
10
+ name: string;
11
+ location: 'path' | 'query' | 'header';
12
+ required: boolean;
13
+ description?: string;
14
+ /** Нормализованная JSON-схема параметра. */
15
+ schema: JsonSchema;
16
+ example?: unknown;
17
+ }
18
+ /**
19
+ * Нормализованная JSON-схема. Swagger проекта содержит 311 TypeScript-подобных
20
+ * значений `type` (`Record<string, any>`, `CommonLocalizeInfos`, `image`…),
21
+ * поэтому «схема» здесь — результат приведения, а не исходник.
22
+ */
23
+ export interface JsonSchema {
24
+ type?: string;
25
+ format?: string;
26
+ description?: string;
27
+ example?: unknown;
28
+ enum?: unknown[];
29
+ items?: JsonSchema;
30
+ properties?: Record<string, JsonSchema>;
31
+ required?: string[];
32
+ /** Тип не удалось привести к JSON Schema: доверять следует `example`. */
33
+ 'x-loose'?: boolean;
34
+ /** Исходный TypeScript-подобный тип из swagger — сохранён как подсказка. */
35
+ 'x-source-type'?: string;
36
+ /** Схема была урезана по размеру. */
37
+ 'x-truncated'?: boolean;
38
+ }
39
+ /** Одна операция Admin API в каталоге. */
40
+ export interface Operation {
41
+ /** `operationId` из swagger, например `AdminPagesController_findAllRoot`. */
42
+ opId: string;
43
+ method: HttpMethod;
44
+ /** Путь без префикса API, например `/pages/{id}`. */
45
+ path: string;
46
+ /** Полный путь как в swagger, например `/api/admin/pages/{id}`. */
47
+ fullPath: string;
48
+ tag: string;
49
+ summary: string;
50
+ /** Требуемое право из `AdminPermissionsEnum`, если объявлено в контроллере. */
51
+ permission?: string;
52
+ risk: RiskLevel;
53
+ /** Операция навсегда остаётся за подтверждением, независимо от уровня allow. */
54
+ alwaysConfirm: boolean;
55
+ params: OperationParam[];
56
+ body?: {
57
+ contentType: string;
58
+ schema: JsonSchema;
59
+ required: boolean;
60
+ };
61
+ responseSummary?: string;
62
+ /** Идентификаторы разделов документации (`<docId>#<anchor>`), объясняющих операцию. */
63
+ docLinks: string[];
64
+ /** Склеенный текст для поиска по каталогу. */
65
+ searchText: string;
66
+ }
67
+ /** Собранный каталог: то, что build-catalog.ts пишет в data/catalog.json. */
68
+ export interface Catalog {
69
+ version: 1;
70
+ builtAt: string;
71
+ /** Префикс путей из swagger (`/api/admin`) — проверяется при сборке. */
72
+ apiPrefix: string;
73
+ /** Хэш исходного swagger.json — виден в cms_whoami, ловит рассинхрон. */
74
+ swaggerHash: string;
75
+ /** Полный список значений `AdminPermissionsEnum`. */
76
+ permissions: string[];
77
+ /**
78
+ * Замечания сборки — прежде всего признаки устаревшего swagger.json.
79
+ * Показываются в `cms_whoami`: рассинхрон каталога и реального API должен быть
80
+ * виден агенту, а не выясняться по 404.
81
+ */
82
+ warnings: string[];
83
+ operations: Operation[];
84
+ }
85
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;AAErE;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,aAAa,CAAC;AAEzD,iDAAiD;AACjD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IACtC,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,yEAAyE;IACzE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,4EAA4E;IAC5E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qCAAqC;IACrC,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,0CAA0C;AAC1C,MAAM,WAAW,SAAS;IACxB,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,CAAC;IACnB,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB,gFAAgF;IAChF,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,IAAI,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,UAAU,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC;IACtE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uFAAuF;IACvF,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,8CAA8C;IAC9C,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,6EAA6E;AAC7E,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,SAAS,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,WAAW,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB;;;;OAIG;IACH,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":""}
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env node
2
+ import { loadConfig } from '../config/config.js';
3
+ import { runHttp } from '../transports/http.js';
4
+ import { runStdio } from '../transports/stdio.js';
5
+ const USAGE = `oneentry-mcp-platform — MCP server for the OneEntry CMS Admin API
6
+
7
+ oneentry-mcp-platform local mode (stdio), reads http://localhost:3003/api/admin
8
+ oneentry-mcp-platform --http --audit a.jsonl remote mode (streamable HTTP)
9
+
10
+ Options
11
+ --base-url <url> Admin API base URL (must contain /api/admin)
12
+ --allow <level> read (default) | write | destructive
13
+ --login <login> admin login; the password comes from ONEENTRY_CMS_PASSWORD
14
+ --back <path> backend-app checkout: read knowledge live instead of the bundled snapshot
15
+ --front <path> frontend-app checkout
16
+ --audit <path> JSONL audit log (required in remote mode)
17
+ --http serve Streamable HTTP instead of stdio
18
+ --port <n> HTTP port, default 8931
19
+ --host <addr> HTTP bind address, default 127.0.0.1
20
+ --allowed-origins a,b comma-separated Origin allowlist for remote mode
21
+ --request-timeout <ms> per-request timeout, default 30000
22
+ --max-response-bytes <n> response cap handed to the model, default 24576
23
+
24
+ Environment
25
+ ONEENTRY_CMS_LOGIN, ONEENTRY_CMS_PASSWORD, ONEENTRY_CMS_TOKEN, ONEENTRY_CMS_BASE_URL, ONEENTRY_MCP_ALLOW,
26
+ ONEENTRY_MCP_BACK_PATH, ONEENTRY_MCP_FRONT_PATH, ONEENTRY_MCP_AUDIT_PATH, ONEENTRY_MCP_PORT, ONEENTRY_MCP_HOST
27
+ `;
28
+ const main = async () => {
29
+ const argv = process.argv.slice(2);
30
+ if (argv.includes('--help') || argv.includes('-h')) {
31
+ process.stdout.write(USAGE);
32
+ return;
33
+ }
34
+ const config = loadConfig(argv);
35
+ if (config.mode === 'remote') {
36
+ await runHttp(config);
37
+ return;
38
+ }
39
+ await runStdio(config);
40
+ };
41
+ main().catch((error) => {
42
+ /**
43
+ * В stdio-режиме stdout занят протоколом, поэтому любая диагностика идёт в stderr.
44
+ */
45
+ process.stderr.write(`oneentry-mcp-platform: ${error instanceof Error ? error.message : String(error)}\n`);
46
+ process.exitCode = 1;
47
+ });
48
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;CAsBb,CAAC;AAEF,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE;IACrC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;QACtB,OAAO;IACT,CAAC;IACD,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;AACzB,CAAC,CAAC;AAEF,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3G,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}