@novorb/mcp-core 2.1.2 → 3.0.1

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 (240) hide show
  1. package/README.md +77 -163
  2. package/bin/mcp-core-jest.mjs +112 -0
  3. package/dist/auth.d.ts +57 -0
  4. package/dist/auth.d.ts.map +1 -0
  5. package/dist/auth.js +74 -0
  6. package/dist/auth.js.map +1 -0
  7. package/dist/bootstrap.d.ts +129 -0
  8. package/dist/bootstrap.d.ts.map +1 -0
  9. package/dist/bootstrap.js +206 -0
  10. package/dist/bootstrap.js.map +1 -0
  11. package/dist/client-input.d.ts +72 -0
  12. package/dist/client-input.d.ts.map +1 -0
  13. package/dist/client-input.js +109 -0
  14. package/dist/client-input.js.map +1 -0
  15. package/dist/credential-checks.d.ts +80 -0
  16. package/dist/credential-checks.d.ts.map +1 -0
  17. package/dist/credential-checks.js +189 -0
  18. package/dist/credential-checks.js.map +1 -0
  19. package/dist/credential-health.d.ts +12 -0
  20. package/dist/credential-health.d.ts.map +1 -0
  21. package/dist/credential-health.js +12 -0
  22. package/dist/credential-health.js.map +1 -0
  23. package/dist/credential-report.d.ts +46 -0
  24. package/dist/credential-report.d.ts.map +1 -0
  25. package/dist/credential-report.js +135 -0
  26. package/dist/credential-report.js.map +1 -0
  27. package/dist/credential-status-tool.d.ts +20 -0
  28. package/dist/credential-status-tool.d.ts.map +1 -0
  29. package/dist/credential-status-tool.js +33 -0
  30. package/dist/credential-status-tool.js.map +1 -0
  31. package/dist/credentials.d.ts +288 -0
  32. package/dist/credentials.d.ts.map +1 -0
  33. package/dist/credentials.js +652 -0
  34. package/dist/credentials.js.map +1 -0
  35. package/dist/express-peers.d.ts +29 -0
  36. package/dist/express-peers.d.ts.map +1 -0
  37. package/dist/express-peers.js +36 -0
  38. package/dist/express-peers.js.map +1 -0
  39. package/dist/express.d.ts +74 -0
  40. package/dist/express.d.ts.map +1 -0
  41. package/dist/express.js +164 -0
  42. package/dist/express.js.map +1 -0
  43. package/dist/http-client.d.ts +277 -42
  44. package/dist/http-client.d.ts.map +1 -1
  45. package/dist/http-client.js +620 -180
  46. package/dist/http-client.js.map +1 -1
  47. package/dist/index.d.ts +27 -6
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +47 -8
  50. package/dist/index.js.map +1 -1
  51. package/dist/limits.d.ts +28 -0
  52. package/dist/limits.d.ts.map +1 -0
  53. package/dist/limits.js +37 -0
  54. package/dist/limits.js.map +1 -0
  55. package/dist/list-pagination.d.ts +41 -0
  56. package/dist/list-pagination.d.ts.map +1 -0
  57. package/dist/list-pagination.js +104 -0
  58. package/dist/list-pagination.js.map +1 -0
  59. package/dist/net.d.ts +112 -0
  60. package/dist/net.d.ts.map +1 -0
  61. package/dist/net.js +490 -0
  62. package/dist/net.js.map +1 -0
  63. package/dist/notifications.d.ts +78 -0
  64. package/dist/notifications.d.ts.map +1 -0
  65. package/dist/notifications.js +173 -0
  66. package/dist/notifications.js.map +1 -0
  67. package/dist/pagination.d.ts +236 -5
  68. package/dist/pagination.d.ts.map +1 -1
  69. package/dist/pagination.js +393 -6
  70. package/dist/pagination.js.map +1 -1
  71. package/dist/prompts.d.ts +70 -0
  72. package/dist/prompts.d.ts.map +1 -0
  73. package/dist/prompts.js +109 -0
  74. package/dist/prompts.js.map +1 -0
  75. package/dist/protocol-errors.d.ts +15 -0
  76. package/dist/protocol-errors.d.ts.map +1 -0
  77. package/dist/protocol-errors.js +28 -0
  78. package/dist/protocol-errors.js.map +1 -0
  79. package/dist/protocol-logging.d.ts +37 -0
  80. package/dist/protocol-logging.d.ts.map +1 -0
  81. package/dist/protocol-logging.js +77 -0
  82. package/dist/protocol-logging.js.map +1 -0
  83. package/dist/rate-limiter.d.ts +36 -0
  84. package/dist/rate-limiter.d.ts.map +1 -0
  85. package/dist/rate-limiter.js +79 -0
  86. package/dist/rate-limiter.js.map +1 -0
  87. package/dist/request-state.d.ts +74 -0
  88. package/dist/request-state.d.ts.map +1 -0
  89. package/dist/request-state.js +190 -0
  90. package/dist/request-state.js.map +1 -0
  91. package/dist/resources.d.ts +181 -0
  92. package/dist/resources.d.ts.map +1 -0
  93. package/dist/resources.js +302 -0
  94. package/dist/resources.js.map +1 -0
  95. package/dist/result-limits.d.ts +80 -0
  96. package/dist/result-limits.d.ts.map +1 -0
  97. package/dist/result-limits.js +248 -0
  98. package/dist/result-limits.js.map +1 -0
  99. package/dist/retry.d.ts +79 -23
  100. package/dist/retry.d.ts.map +1 -1
  101. package/dist/retry.js +170 -57
  102. package/dist/retry.js.map +1 -1
  103. package/dist/sdk/client-stdio.d.ts +6 -0
  104. package/dist/sdk/client-stdio.d.ts.map +1 -0
  105. package/dist/sdk/client-stdio.js +6 -0
  106. package/dist/sdk/client-stdio.js.map +1 -0
  107. package/dist/sdk/client.d.ts +6 -0
  108. package/dist/sdk/client.d.ts.map +1 -0
  109. package/dist/sdk/client.js +6 -0
  110. package/dist/sdk/client.js.map +1 -0
  111. package/dist/sdk/express.d.ts +3 -0
  112. package/dist/sdk/express.d.ts.map +1 -0
  113. package/dist/sdk/express.js +11 -0
  114. package/dist/sdk/express.js.map +1 -0
  115. package/dist/sdk/node.d.ts +6 -0
  116. package/dist/sdk/node.d.ts.map +1 -0
  117. package/dist/sdk/node.js +6 -0
  118. package/dist/sdk/node.js.map +1 -0
  119. package/dist/sdk/server-stdio.d.ts +6 -0
  120. package/dist/sdk/server-stdio.d.ts.map +1 -0
  121. package/dist/sdk/server-stdio.js +6 -0
  122. package/dist/sdk/server-stdio.js.map +1 -0
  123. package/dist/sdk/server.d.ts +6 -0
  124. package/dist/sdk/server.d.ts.map +1 -0
  125. package/dist/sdk/server.js +6 -0
  126. package/dist/sdk/server.js.map +1 -0
  127. package/dist/server.d.ts +88 -35
  128. package/dist/server.d.ts.map +1 -1
  129. package/dist/server.js +98 -44
  130. package/dist/server.js.map +1 -1
  131. package/dist/task-request.d.ts +20 -0
  132. package/dist/task-request.d.ts.map +1 -0
  133. package/dist/task-request.js +43 -0
  134. package/dist/task-request.js.map +1 -0
  135. package/dist/task-store.d.ts +230 -0
  136. package/dist/task-store.d.ts.map +1 -0
  137. package/dist/task-store.js +459 -0
  138. package/dist/task-store.js.map +1 -0
  139. package/dist/task-tools.d.ts +115 -0
  140. package/dist/task-tools.d.ts.map +1 -0
  141. package/dist/task-tools.js +397 -0
  142. package/dist/task-tools.js.map +1 -0
  143. package/dist/testing/client.d.ts +25 -0
  144. package/dist/testing/client.d.ts.map +1 -0
  145. package/dist/testing/client.js +11 -0
  146. package/dist/testing/client.js.map +1 -0
  147. package/dist/testing/in-memory.d.ts +26 -0
  148. package/dist/testing/in-memory.d.ts.map +1 -0
  149. package/dist/testing/in-memory.js +41 -0
  150. package/dist/testing/in-memory.js.map +1 -0
  151. package/dist/testing/index.d.ts +20 -0
  152. package/dist/testing/index.d.ts.map +1 -0
  153. package/dist/testing/index.js +20 -0
  154. package/dist/testing/index.js.map +1 -0
  155. package/dist/testing/isolated-dirs.d.ts +27 -0
  156. package/dist/testing/isolated-dirs.d.ts.map +1 -0
  157. package/dist/testing/isolated-dirs.js +67 -0
  158. package/dist/testing/isolated-dirs.js.map +1 -0
  159. package/dist/testing/logs.d.ts +61 -0
  160. package/dist/testing/logs.d.ts.map +1 -0
  161. package/dist/testing/logs.js +113 -0
  162. package/dist/testing/logs.js.map +1 -0
  163. package/dist/testing/raw-http.d.ts +25 -0
  164. package/dist/testing/raw-http.d.ts.map +1 -0
  165. package/dist/testing/raw-http.js +41 -0
  166. package/dist/testing/raw-http.js.map +1 -0
  167. package/dist/testing/raw-peer.d.ts +43 -0
  168. package/dist/testing/raw-peer.d.ts.map +1 -0
  169. package/dist/testing/raw-peer.js +101 -0
  170. package/dist/testing/raw-peer.js.map +1 -0
  171. package/dist/testing/recording-server.d.ts +38 -0
  172. package/dist/testing/recording-server.d.ts.map +1 -0
  173. package/dist/testing/recording-server.js +38 -0
  174. package/dist/testing/recording-server.js.map +1 -0
  175. package/dist/testing/server-process.d.ts +76 -0
  176. package/dist/testing/server-process.d.ts.map +1 -0
  177. package/dist/testing/server-process.js +241 -0
  178. package/dist/testing/server-process.js.map +1 -0
  179. package/dist/testing/tools.d.ts +53 -0
  180. package/dist/testing/tools.d.ts.map +1 -0
  181. package/dist/testing/tools.js +98 -0
  182. package/dist/testing/tools.js.map +1 -0
  183. package/dist/testing/unit.d.ts +52 -0
  184. package/dist/testing/unit.d.ts.map +1 -0
  185. package/dist/testing/unit.js +95 -0
  186. package/dist/testing/unit.js.map +1 -0
  187. package/dist/tools.d.ts +205 -0
  188. package/dist/tools.d.ts.map +1 -0
  189. package/dist/tools.js +370 -0
  190. package/dist/tools.js.map +1 -0
  191. package/dist/transport.d.ts +143 -52
  192. package/dist/transport.d.ts.map +1 -1
  193. package/dist/transport.js +292 -123
  194. package/dist/transport.js.map +1 -1
  195. package/dist/url-path.d.ts +49 -0
  196. package/dist/url-path.d.ts.map +1 -0
  197. package/dist/url-path.js +165 -0
  198. package/dist/url-path.js.map +1 -0
  199. package/dist/utils/dataStore.d.ts +143 -0
  200. package/dist/utils/dataStore.d.ts.map +1 -0
  201. package/dist/utils/dataStore.js +429 -0
  202. package/dist/utils/dataStore.js.map +1 -0
  203. package/dist/utils/envLoader.d.ts +129 -0
  204. package/dist/utils/envLoader.d.ts.map +1 -0
  205. package/dist/utils/envLoader.js +399 -0
  206. package/dist/utils/envLoader.js.map +1 -0
  207. package/dist/utils/logger.d.ts +181 -0
  208. package/dist/utils/logger.d.ts.map +1 -0
  209. package/dist/utils/logger.js +664 -0
  210. package/dist/utils/logger.js.map +1 -0
  211. package/dist/utils/redact.d.ts +50 -0
  212. package/dist/utils/redact.d.ts.map +1 -0
  213. package/dist/utils/redact.js +318 -0
  214. package/dist/utils/redact.js.map +1 -0
  215. package/docs/api-reference.md +29 -0
  216. package/docs/building-a-server.md +63 -0
  217. package/docs/credentials.md +131 -0
  218. package/docs/data-store.md +37 -0
  219. package/docs/env.md +38 -0
  220. package/docs/features.md +28 -0
  221. package/docs/http-client.md +116 -0
  222. package/docs/logger.md +100 -0
  223. package/docs/migrating-to-v3.md +45 -0
  224. package/docs/outbound-urls.md +104 -0
  225. package/docs/pagination.md +45 -0
  226. package/docs/protocol-features.md +62 -0
  227. package/docs/resources-prompts-tasks.md +95 -0
  228. package/docs/sdk.md +33 -0
  229. package/docs/server.md +68 -0
  230. package/docs/testing-harness.md +139 -0
  231. package/docs/testing.md +151 -0
  232. package/docs/tools.md +88 -0
  233. package/docs/transport.md +85 -0
  234. package/examples/testing/tools.integration.test.example.ts +312 -0
  235. package/examples/testing/tools.unit.test.example.ts +149 -0
  236. package/package.json +130 -17
  237. package/dist/logger.d.ts +0 -80
  238. package/dist/logger.d.ts.map +0 -1
  239. package/dist/logger.js +0 -237
  240. package/dist/logger.js.map +0 -1
@@ -0,0 +1,189 @@
1
+ /**
2
+ * @novorb/mcp-core - Startup credential checks
3
+ *
4
+ * `runMcpServer` registers every credential the env schema declares (a server's own `secret` keys and
5
+ * every key with a `check`; each member of a `multi` family on its own, pooled under the family's base
6
+ * key) and then runs the declared checks ONCE, in parallel, each bounded by
7
+ * `MCP_CREDENTIAL_CHECK_TIMEOUT_MS` (default 5000). `MCP_CREDENTIAL_CHECKS=false` skips them. A check
8
+ * never stops the server: a throw, a timeout or a network error reads `unknown`, and the results are
9
+ * logged by key name and status only.
10
+ *
11
+ * {
12
+ * key: 'SEARCH_API_KEY', multi: true, secret: true,
13
+ * check: async (value, { http, signal }) => {
14
+ * await http({ baseURL: 'https://api.example.com', auth: { type: 'bearer', token: value } })
15
+ * .get('/account', { signal });
16
+ * return 'valid';
17
+ * },
18
+ * }
19
+ *
20
+ * A check may return a status, `{ status, reason?, retryAfterMs? }`, or throw: a thrown `HttpError`
21
+ * is classified like any HTTP outcome (401/403 invalid, 402/429 degraded, ...).
22
+ */
23
+ import { CREDENTIAL_STATUSES, credentialOutcomeFromError, UnknownCredentialError, } from './credentials.js';
24
+ import { createHttpClient } from './http-client.js';
25
+ import { CORE_ENV_SCHEMA } from './utils/envLoader.js';
26
+ import { getLogger, maskSecretValues } from './utils/logger.js';
27
+ export const DEFAULT_CREDENTIAL_CHECK_TIMEOUT_MS = 5000;
28
+ const CORE_KEYS = new Set(CORE_ENV_SCHEMA.map((s) => s.key));
29
+ /**
30
+ * Register the env's credentials in `registry`: every set value of a spec with a `check`, and of every
31
+ * `secret` spec that is not one of mcp-core's own keys. A multi family's members are pooled under the
32
+ * base key. Returns the registered key names with their checks.
33
+ */
34
+ export function registerEnvCredentials(env, registry) {
35
+ const out = [];
36
+ const declared = new Set(env.schema.map((s) => s.key));
37
+ for (const spec of env.schema) {
38
+ if (spec.check === undefined && !(spec.secret === true && !CORE_KEYS.has(spec.key)))
39
+ continue;
40
+ for (const key of env.members(spec.key)) {
41
+ registry.register(key, spec.multi ? { pool: spec.key } : {});
42
+ out.push(spec.check ? { key, check: spec.check } : { key });
43
+ }
44
+ }
45
+ // Covered parts follow their primary's status; undeclared or unset parts are skipped.
46
+ for (const spec of env.schema) {
47
+ if (spec.check === undefined || spec.covers === undefined)
48
+ continue;
49
+ const parts = spec.covers.filter((k) => declared.has(k)).flatMap((k) => env.members(k));
50
+ for (const part of parts) {
51
+ const partSpec = env.schema.find((s) => s.key === part || env.members(s.key).includes(part));
52
+ registry.register(part, partSpec?.multi ? { pool: partSpec.key } : {});
53
+ }
54
+ for (const key of env.members(spec.key))
55
+ registry.cover(key, parts);
56
+ }
57
+ return out;
58
+ }
59
+ const STATUSES = new Set(CREDENTIAL_STATUSES);
60
+ function isStatus(value) {
61
+ return typeof value === 'string' && STATUSES.has(value);
62
+ }
63
+ function asResult(value) {
64
+ if (isStatus(value))
65
+ return { status: value };
66
+ if (typeof value === 'object' && value !== null) {
67
+ const r = value;
68
+ if (isStatus(r.status)) {
69
+ return {
70
+ status: r.status,
71
+ ...(typeof r.reason === 'string' ? { reason: r.reason } : {}),
72
+ ...(typeof r.retryAfterMs === 'number' ? { retryAfterMs: r.retryAfterMs } : {}),
73
+ };
74
+ }
75
+ }
76
+ return { status: 'unknown', reason: 'check returned no status' };
77
+ }
78
+ function fromThrow(err, timedOut) {
79
+ if (timedOut)
80
+ return { status: 'unknown', reason: 'timeout' };
81
+ const classified = credentialOutcomeFromError(err);
82
+ if (classified) {
83
+ return {
84
+ status: classified.outcome,
85
+ ...(classified.reason !== undefined ? { reason: classified.reason } : {}),
86
+ ...(classified.retryAfterMs !== undefined ? { retryAfterMs: classified.retryAfterMs } : {}),
87
+ };
88
+ }
89
+ const status = err?.status;
90
+ return { status: 'unknown', reason: typeof status === 'number' ? `check failed (HTTP ${status})` : 'check failed' };
91
+ }
92
+ async function runOne(key, value, check, timeoutMs, get) {
93
+ const controller = new AbortController();
94
+ let timedOut = false;
95
+ let timer;
96
+ const timeout = new Promise((_, reject) => {
97
+ timer = setTimeout(() => {
98
+ timedOut = true;
99
+ controller.abort();
100
+ reject(new Error('timeout'));
101
+ }, timeoutMs);
102
+ timer.unref?.();
103
+ });
104
+ const ctx = {
105
+ key,
106
+ signal: controller.signal,
107
+ http: (config) => createHttpClient({ timeout: timeoutMs, ...config, retry: { retries: 0, ...config.retry } }),
108
+ get,
109
+ };
110
+ try {
111
+ return asResult(await Promise.race([check(value, ctx), timeout]));
112
+ }
113
+ catch (err) {
114
+ return fromThrow(err, timedOut);
115
+ }
116
+ finally {
117
+ if (timer)
118
+ clearTimeout(timer);
119
+ }
120
+ }
121
+ export const DEFAULT_CREDENTIAL_CHECK_CONCURRENCY = 4;
122
+ /** Run `jobs` with at most `limit` in flight, results in input order. */
123
+ async function mapLimited(items, limit, job) {
124
+ const out = new Array(items.length);
125
+ let next = 0;
126
+ const worker = async () => {
127
+ while (next < items.length) {
128
+ const index = next++;
129
+ out[index] = await job(items[index]);
130
+ }
131
+ };
132
+ await Promise.all(Array.from({ length: Math.min(Math.max(1, limit), items.length) }, worker));
133
+ return out;
134
+ }
135
+ function positive(value) {
136
+ return value !== undefined && value > 0 ? value : undefined;
137
+ }
138
+ /**
139
+ * Register the env's credentials and run their checks once (at most `concurrency` at a time, each with
140
+ * a timeout), then attach each check as the key's re-check probe (run again after the
141
+ * MCP_CREDENTIAL_RECHECK_MS cool-down while the key is invalid or expired). Never throws; logs one
142
+ * summary line (key names and statuses only). Resolves with the checked keys' results.
143
+ */
144
+ export async function runCredentialChecks(env, registry, options = {}) {
145
+ const logger = options.logger ?? getLogger();
146
+ const declared = registerEnvCredentials(env, registry);
147
+ const withCheck = declared.filter((d) => d.check !== undefined);
148
+ if (withCheck.length === 0)
149
+ return [];
150
+ const enabled = options.enabled ?? env.bool('MCP_CREDENTIAL_CHECKS') ?? true;
151
+ if (!enabled) {
152
+ logger.info(`credential checks skipped (MCP_CREDENTIAL_CHECKS=false): ${withCheck.length} credential(s) unknown`, 'Credentials');
153
+ return [];
154
+ }
155
+ const timeoutMs = Math.max(1, options.timeoutMs ?? positive(env.int('MCP_CREDENTIAL_CHECK_TIMEOUT_MS')) ?? DEFAULT_CREDENTIAL_CHECK_TIMEOUT_MS);
156
+ const recheckMs = options.recheckMs ?? positive(env.int('MCP_CREDENTIAL_RECHECK_MS'));
157
+ if (recheckMs !== undefined)
158
+ registry.setRecheckMs(recheckMs);
159
+ const declaredKeys = new Set(env.schema.flatMap((spec) => [spec.key, ...env.members(spec.key)]));
160
+ const get = (name) => {
161
+ if (!declaredKeys.has(name))
162
+ throw new UnknownCredentialError();
163
+ return env.get(name);
164
+ };
165
+ const mask = (reason) => reason !== undefined ? maskSecretValues(reason).slice(0, 200) : undefined;
166
+ const results = await mapLimited(withCheck, options.concurrency ?? DEFAULT_CREDENTIAL_CHECK_CONCURRENCY, async ({ key, check }) => {
167
+ const value = env.get(key) ?? '';
168
+ const probe = async () => {
169
+ const r = await runOne(key, value, check, timeoutMs, get);
170
+ const reason = mask(r.reason);
171
+ return { status: r.status, ...(reason !== undefined ? { reason } : {}), ...retryOf(r) };
172
+ };
173
+ const result = await probe();
174
+ registry.set(key, result.status, { silent: true, ...result });
175
+ registry.setProbe(key, probe);
176
+ return { key, status: result.status, ...(result.reason !== undefined ? { reason: result.reason } : {}) };
177
+ });
178
+ const summary = results.map((r) => `${r.key} ${r.status}${r.reason ? ` (${r.reason})` : ''}`).join(', ');
179
+ const healthy = results.every((r) => r.status === 'valid');
180
+ if (healthy)
181
+ logger.info(`credential checks: ${summary}`, 'Credentials');
182
+ else
183
+ logger.warn(`credential checks: ${summary}`, 'Credentials');
184
+ return results;
185
+ }
186
+ function retryOf(r) {
187
+ return r.retryAfterMs !== undefined ? { retryAfterMs: r.retryAfterMs } : {};
188
+ }
189
+ //# sourceMappingURL=credential-checks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-checks.js","sourceRoot":"","sources":["../src/credential-checks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @novorb/mcp-core - Credential health (subpath `./credentials`)
3
+ *
4
+ * The one import for credential health: the registry and the per-call scope (`credentials.ts`), the
5
+ * startup checks (`credential-checks.ts`), the result report (`credential-report.ts`) and the status
6
+ * tool (`credential-status-tool.ts`). Pure re-exports.
7
+ */
8
+ export { type CredentialCheck, type CredentialCheckContext, type CredentialCheckResult, DEFAULT_CREDENTIAL_CHECK_CONCURRENCY, DEFAULT_CREDENTIAL_CHECK_TIMEOUT_MS, type RunCredentialChecksOptions, registerEnvCredentials, runCredentialChecks, } from './credential-checks.js';
9
+ export { attachCredentialMeta, attachCredentialReport, CREDENTIALS_FIELD, CREDENTIALS_JSON_SCHEMA, CREDENTIALS_META_KEY, credentialReportBytes, withCredentialsField, } from './credential-report.js';
10
+ export { type CredentialStatusToolOptions, credentialStatusTool } from './credential-status-tool.js';
11
+ export { type AuthChallenge, type ClassifiedOutcome, CREDENTIAL_STATUSES, type CredentialHttpFacts, type CredentialOutcome, type CredentialOutcomeInfo, type CredentialProbe, type CredentialRecorder, CredentialRegistry, type CredentialRegistryOptions, type CredentialReportEntry, CredentialScope, type CredentialState, type CredentialStatus, credentialOutcomeFromError, credentialOutcomeFromHttp, currentCredentialScope, DEFAULT_CREDENTIAL_RECHECK_MS, formatCredentialReport, NoUsableCredentialError, parseAuthChallenge, processCredentials, runWithCredentialScope, setProcessCredentials, UnknownCredentialError, } from './credentials.js';
12
+ //# sourceMappingURL=credential-health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-health.d.ts","sourceRoot":"","sources":["../src/credential-health.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,oCAAoC,EACpC,mCAAmC,EACnC,KAAK,0BAA0B,EAC/B,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,KAAK,2BAA2B,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACrG,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,mBAAmB,EACnB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,kBAAkB,EAClB,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,EAC1B,eAAe,EACf,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,0BAA0B,EAC1B,yBAAyB,EACzB,sBAAsB,EACtB,6BAA6B,EAC7B,sBAAsB,EACtB,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @novorb/mcp-core - Credential health (subpath `./credentials`)
3
+ *
4
+ * The one import for credential health: the registry and the per-call scope (`credentials.ts`), the
5
+ * startup checks (`credential-checks.ts`), the result report (`credential-report.ts`) and the status
6
+ * tool (`credential-status-tool.ts`). Pure re-exports.
7
+ */
8
+ export { DEFAULT_CREDENTIAL_CHECK_CONCURRENCY, DEFAULT_CREDENTIAL_CHECK_TIMEOUT_MS, registerEnvCredentials, runCredentialChecks, } from './credential-checks.js';
9
+ export { attachCredentialMeta, attachCredentialReport, CREDENTIALS_FIELD, CREDENTIALS_JSON_SCHEMA, CREDENTIALS_META_KEY, credentialReportBytes, withCredentialsField, } from './credential-report.js';
10
+ export { credentialStatusTool } from './credential-status-tool.js';
11
+ export { CREDENTIAL_STATUSES, CredentialRegistry, CredentialScope, credentialOutcomeFromError, credentialOutcomeFromHttp, currentCredentialScope, DEFAULT_CREDENTIAL_RECHECK_MS, formatCredentialReport, NoUsableCredentialError, parseAuthChallenge, processCredentials, runWithCredentialScope, setProcessCredentials, UnknownCredentialError, } from './credentials.js';
12
+ //# sourceMappingURL=credential-health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-health.js","sourceRoot":"","sources":["../src/credential-health.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAIL,oCAAoC,EACpC,mCAAmC,EAEnC,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAoC,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACrG,OAAO,EAGL,mBAAmB,EAMnB,kBAAkB,EAGlB,eAAe,EAGf,0BAA0B,EAC1B,yBAAyB,EACzB,sBAAsB,EACtB,6BAA6B,EAC7B,sBAAsB,EACtB,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * @novorb/mcp-core - The credential report on a tool result
3
+ *
4
+ * `registerTools` appends the report of a call's credentials (see `credentials.ts`) to every result
5
+ * that touched one, in three shapes:
6
+ *
7
+ * - a short text block the model reads: `Credentials: A used; B degraded (quota, retry in 60s)`;
8
+ * - `_meta[CREDENTIALS_META_KEY]`: the same entries, machine-readable;
9
+ * - `structuredContent.credentials`, when the result has an object `structuredContent`. The tool's
10
+ * outputSchema gets that optional field automatically (`withCredentialsField`), unless the schema
11
+ * already declares its own `credentials` property (then only the text and `_meta` carry the report).
12
+ *
13
+ * Key names only, never values; the text passes the client masking.
14
+ */
15
+ import type { CallToolResult, StandardSchemaWithJSON } from '@modelcontextprotocol/server';
16
+ import { type CredentialReportEntry } from './credentials.js';
17
+ /** The `_meta` key of the machine-readable report. */
18
+ export declare const CREDENTIALS_META_KEY = "io.novorb/credentials";
19
+ /** The field name added to `structuredContent` and to the output schema. */
20
+ export declare const CREDENTIALS_FIELD = "credentials";
21
+ /** JSON Schema of the `credentials` field. */
22
+ export declare const CREDENTIALS_JSON_SCHEMA: Record<string, unknown>;
23
+ /**
24
+ * The output schema plus an optional `credentials` field: validation strips the field before the
25
+ * tool's own schema sees it (so strict schemas keep passing) and the listed JSON Schema declares it.
26
+ * Returned UNCHANGED (the same object) when the listed schema cannot declare it: it already has its own
27
+ * `credentials`, or its root is not an object with `properties` (a record root, `allOf`, `$ref`). Such
28
+ * tools get the report in text and `_meta` only, never in `structuredContent`.
29
+ */
30
+ export declare function withCredentialsField(schema: StandardSchemaWithJSON): StandardSchemaWithJSON;
31
+ /** The serialized size the report adds to a result (text block, `_meta`, and `structuredContent` when structured). */
32
+ export declare function credentialReportBytes(entries: readonly CredentialReportEntry[], structured: boolean): number;
33
+ /**
34
+ * Append the report to a result: the text block, `_meta`, and `structuredContent.credentials` when
35
+ * `structured` (the listed output schema declares it) and the result has object structured content.
36
+ * Every copy (text, `_meta`, structured) passes `mask`. No entries = the result unchanged.
37
+ */
38
+ export declare function attachCredentialReport(result: CallToolResult, entries: readonly CredentialReportEntry[], options: {
39
+ structured: boolean;
40
+ mask: (text: string) => string;
41
+ }): CallToolResult;
42
+ /** The report on a result that has no content (an input-required result): `_meta` only, masked. */
43
+ export declare function attachCredentialMeta<R extends {
44
+ _meta?: Record<string, unknown>;
45
+ }>(result: R, entries: readonly CredentialReportEntry[], mask: (text: string) => string): R;
46
+ //# sourceMappingURL=credential-report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-report.d.ts","sourceRoot":"","sources":["../src/credential-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAC3F,OAAO,EAAuB,KAAK,qBAAqB,EAA0B,MAAM,kBAAkB,CAAC;AAE3G,sDAAsD;AACtD,eAAO,MAAM,oBAAoB,0BAA0B,CAAC;AAE5D,4EAA4E;AAC5E,eAAO,MAAM,iBAAiB,gBAAgB,CAAC;AAE/C,8CAA8C;AAC9C,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAc3D,CAAC;AAoBF;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,sBAAsB,GAAG,sBAAsB,CA+B3F;AAcD,sHAAsH;AACtH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,SAAS,qBAAqB,EAAE,EAAE,UAAU,EAAE,OAAO,GAAG,MAAM,CAK5G;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,SAAS,qBAAqB,EAAE,EACzC,OAAO,EAAE;IAAE,UAAU,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;CAAE,GAC/D,cAAc,CAgBhB;AAED,mGAAmG;AACnG,wBAAgB,oBAAoB,CAAC,CAAC,SAAS;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,EAChF,MAAM,EAAE,CAAC,EACT,OAAO,EAAE,SAAS,qBAAqB,EAAE,EACzC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAC7B,CAAC,CAGH"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * @novorb/mcp-core - The credential report on a tool result
3
+ *
4
+ * `registerTools` appends the report of a call's credentials (see `credentials.ts`) to every result
5
+ * that touched one, in three shapes:
6
+ *
7
+ * - a short text block the model reads: `Credentials: A used; B degraded (quota, retry in 60s)`;
8
+ * - `_meta[CREDENTIALS_META_KEY]`: the same entries, machine-readable;
9
+ * - `structuredContent.credentials`, when the result has an object `structuredContent`. The tool's
10
+ * outputSchema gets that optional field automatically (`withCredentialsField`), unless the schema
11
+ * already declares its own `credentials` property (then only the text and `_meta` carry the report).
12
+ *
13
+ * Key names only, never values; the text passes the client masking.
14
+ */
15
+ import { CREDENTIAL_STATUSES, formatCredentialReport } from './credentials.js';
16
+ /** The `_meta` key of the machine-readable report. */
17
+ export const CREDENTIALS_META_KEY = 'io.novorb/credentials';
18
+ /** The field name added to `structuredContent` and to the output schema. */
19
+ export const CREDENTIALS_FIELD = 'credentials';
20
+ /** JSON Schema of the `credentials` field. */
21
+ export const CREDENTIALS_JSON_SCHEMA = {
22
+ type: 'array',
23
+ description: 'Credentials this call used, and the ones it found degraded, invalid or expired (key names only)',
24
+ items: {
25
+ type: 'object',
26
+ properties: {
27
+ key: { type: 'string' },
28
+ status: { type: 'string', enum: [...CREDENTIAL_STATUSES] },
29
+ used: { type: 'boolean' },
30
+ reason: { type: 'string' },
31
+ retryInSeconds: { type: 'number' },
32
+ },
33
+ required: ['key', 'status', 'used'],
34
+ },
35
+ };
36
+ function isPlainObject(value) {
37
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
38
+ }
39
+ /**
40
+ * Whether the listed output JSON Schema can carry the field: an object root (no `type`, or `object`)
41
+ * with a `properties` map that does not already declare `credentials`.
42
+ */
43
+ function extensible(schema) {
44
+ try {
45
+ const json = schema['~standard'].jsonSchema.output({ target: 'draft-2020-12' });
46
+ const objectRoot = json.type === undefined || json.type === 'object';
47
+ return objectRoot && isPlainObject(json.properties) && !(CREDENTIALS_FIELD in json.properties);
48
+ }
49
+ catch {
50
+ return false;
51
+ }
52
+ }
53
+ /**
54
+ * The output schema plus an optional `credentials` field: validation strips the field before the
55
+ * tool's own schema sees it (so strict schemas keep passing) and the listed JSON Schema declares it.
56
+ * Returned UNCHANGED (the same object) when the listed schema cannot declare it: it already has its own
57
+ * `credentials`, or its root is not an object with `properties` (a record root, `allOf`, `$ref`). Such
58
+ * tools get the report in text and `_meta` only, never in `structuredContent`.
59
+ */
60
+ export function withCredentialsField(schema) {
61
+ if (!extensible(schema))
62
+ return schema;
63
+ const std = schema['~standard'];
64
+ const restore = (result, credentials) => result.issues !== undefined || !isPlainObject(result.value)
65
+ ? result
66
+ : { value: { ...result.value, [CREDENTIALS_FIELD]: credentials } };
67
+ const validate = (value, options) => {
68
+ if (!isPlainObject(value) || !(CREDENTIALS_FIELD in value))
69
+ return std.validate(value, options);
70
+ const { [CREDENTIALS_FIELD]: credentials, ...rest } = value;
71
+ const result = std.validate(rest, options);
72
+ return result instanceof Promise ? result.then((r) => restore(r, credentials)) : restore(result, credentials);
73
+ };
74
+ return {
75
+ '~standard': {
76
+ version: 1,
77
+ vendor: std.vendor,
78
+ ...(std.types !== undefined ? { types: std.types } : {}),
79
+ validate,
80
+ jsonSchema: {
81
+ input: (options) => std.jsonSchema.input(options),
82
+ output: (options) => {
83
+ const json = std.jsonSchema.output(options);
84
+ if (!isPlainObject(json.properties))
85
+ return json;
86
+ return { ...json, properties: { ...json.properties, [CREDENTIALS_FIELD]: CREDENTIALS_JSON_SCHEMA } };
87
+ },
88
+ },
89
+ },
90
+ };
91
+ }
92
+ /** Every copy of the entries goes through the same masking as the text block. */
93
+ function maskedEntries(entries, mask) {
94
+ return entries.map((e) => ({
95
+ ...e,
96
+ key: mask(e.key),
97
+ ...(e.reason !== undefined ? { reason: mask(e.reason) } : {}),
98
+ }));
99
+ }
100
+ /** The serialized size the report adds to a result (text block, `_meta`, and `structuredContent` when structured). */
101
+ export function credentialReportBytes(entries, structured) {
102
+ if (entries.length === 0)
103
+ return 0;
104
+ const text = Buffer.byteLength(JSON.stringify({ type: 'text', text: formatCredentialReport(entries) }));
105
+ const meta = Buffer.byteLength(JSON.stringify({ [CREDENTIALS_META_KEY]: entries }));
106
+ return text + meta + (structured ? Buffer.byteLength(JSON.stringify({ [CREDENTIALS_FIELD]: entries })) : 0) + 16;
107
+ }
108
+ /**
109
+ * Append the report to a result: the text block, `_meta`, and `structuredContent.credentials` when
110
+ * `structured` (the listed output schema declares it) and the result has object structured content.
111
+ * Every copy (text, `_meta`, structured) passes `mask`. No entries = the result unchanged.
112
+ */
113
+ export function attachCredentialReport(result, entries, options) {
114
+ if (entries.length === 0)
115
+ return result;
116
+ const masked = maskedEntries(entries, options.mask);
117
+ const out = {
118
+ ...result,
119
+ content: [...result.content, { type: 'text', text: options.mask(formatCredentialReport(masked)) }],
120
+ _meta: { ...(result._meta ?? {}), [CREDENTIALS_META_KEY]: masked.map((e) => ({ ...e })) },
121
+ };
122
+ if (options.structured &&
123
+ isPlainObject(result.structuredContent) &&
124
+ !(CREDENTIALS_FIELD in result.structuredContent)) {
125
+ out.structuredContent = { ...result.structuredContent, [CREDENTIALS_FIELD]: masked.map((e) => ({ ...e })) };
126
+ }
127
+ return out;
128
+ }
129
+ /** The report on a result that has no content (an input-required result): `_meta` only, masked. */
130
+ export function attachCredentialMeta(result, entries, mask) {
131
+ if (entries.length === 0)
132
+ return result;
133
+ return { ...result, _meta: { ...(result._meta ?? {}), [CREDENTIALS_META_KEY]: maskedEntries(entries, mask) } };
134
+ }
135
+ //# sourceMappingURL=credential-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-report.js","sourceRoot":"","sources":["../src/credential-report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * @novorb/mcp-core - The credential status tool
3
+ *
4
+ * `credentialStatusTool()` is a ready tool definition a server may register (with `registerTools`)
5
+ * to list every credential's current status: key names, pools, statuses, reasons and retry-after
6
+ * only, never a value. Integration tests read the startup check results through it.
7
+ *
8
+ * registerTools(server, [...buildTools(shared), credentialStatusTool()], { env, serverName });
9
+ */
10
+ import { type CredentialRegistry } from './credentials.js';
11
+ import { type AnyToolDefinition } from './tools.js';
12
+ export interface CredentialStatusToolOptions {
13
+ /** Tool name (default `credential_status`). */
14
+ name?: string;
15
+ /** The registry to list (default the process registry). */
16
+ registry?: CredentialRegistry;
17
+ }
18
+ /** A read-only tool listing every credential's status (names and statuses only). */
19
+ export declare function credentialStatusTool(options?: CredentialStatusToolOptions): AnyToolDefinition;
20
+ //# sourceMappingURL=credential-status-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-status-tool.d.ts","sourceRoot":"","sources":["../src/credential-status-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,KAAK,kBAAkB,EAAsB,MAAM,kBAAkB,CAAC;AAE/E,OAAO,EAAE,KAAK,iBAAiB,EAA0B,MAAM,YAAY,CAAC;AAE5E,MAAM,WAAW,2BAA2B;IAC1C,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,kBAAkB,CAAC;CAC/B;AAED,oFAAoF;AACpF,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,2BAAgC,GAAG,iBAAiB,CAsBjG"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * @novorb/mcp-core - The credential status tool
3
+ *
4
+ * `credentialStatusTool()` is a ready tool definition a server may register (with `registerTools`)
5
+ * to list every credential's current status: key names, pools, statuses, reasons and retry-after
6
+ * only, never a value. Integration tests read the startup check results through it.
7
+ *
8
+ * registerTools(server, [...buildTools(shared), credentialStatusTool()], { env, serverName });
9
+ */
10
+ import { processCredentials } from './credentials.js';
11
+ import { fromJsonSchema, TOOL_ANNOTATIONS } from './server.js';
12
+ import { defineTool, toolResult } from './tools.js';
13
+ /** A read-only tool listing every credential's status (names and statuses only). */
14
+ export function credentialStatusTool(options = {}) {
15
+ return defineTool({
16
+ name: options.name ?? 'credential_status',
17
+ title: 'Credential status',
18
+ description: 'List the status of every credential this server holds (valid, invalid, expired, degraded or unknown), by key name only.',
19
+ inputSchema: fromJsonSchema({ type: 'object', properties: {}, additionalProperties: false }),
20
+ annotations: TOOL_ANNOTATIONS.readOnly,
21
+ handler: async () => {
22
+ const credentials = (options.registry ?? processCredentials()).snapshot();
23
+ const lines = credentials.map((c) => {
24
+ const details = [c.reason, c.retryInSeconds !== undefined ? `retry in ${c.retryInSeconds}s` : undefined]
25
+ .filter((d) => d !== undefined)
26
+ .join(', ');
27
+ return `${c.key}${c.pool !== undefined && c.pool !== c.key ? ` [${c.pool}]` : ''}: ${c.status}${details ? ` (${details})` : ''}`;
28
+ });
29
+ return toolResult({ credentials }, { text: credentials.length === 0 ? 'No credentials are registered.' : lines.join('\n') });
30
+ },
31
+ });
32
+ }
33
+ //# sourceMappingURL=credential-status-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-status-tool.js","sourceRoot":"","sources":["../src/credential-status-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAA2B,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAA0B,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAS5E,oFAAoF;AACpF,MAAM,UAAU,oBAAoB,CAAC,UAAuC,EAAE;IAC5E,OAAO,UAAU,CAAC;QAChB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,mBAAmB;QACzC,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EACT,yHAAyH;QAC3H,WAAW,EAAE,cAAc,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC;QAC5F,WAAW,EAAE,gBAAgB,CAAC,QAAQ;QACtC,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,WAAW,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,kBAAkB,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC1E,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBAClC,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;qBACrG,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC;qBAC3C,IAAI,CAAC,IAAI,CAAC,CAAC;gBACd,OAAO,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACnI,CAAC,CAAC,CAAC;YACH,OAAO,UAAU,CACf,EAAE,WAAW,EAAE,EACf,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACzF,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}