@inso_web/els-mcp 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 (266) hide show
  1. package/README.md +482 -0
  2. package/dist/audit/prisma.d.ts +67 -0
  3. package/dist/audit/prisma.d.ts.map +1 -0
  4. package/dist/audit/prisma.js +65 -0
  5. package/dist/audit/prisma.js.map +1 -0
  6. package/dist/audit/service.d.ts +72 -0
  7. package/dist/audit/service.d.ts.map +1 -0
  8. package/dist/audit/service.js +137 -0
  9. package/dist/audit/service.js.map +1 -0
  10. package/dist/billing/limits.d.ts +34 -0
  11. package/dist/billing/limits.d.ts.map +1 -0
  12. package/dist/billing/limits.js +51 -0
  13. package/dist/billing/limits.js.map +1 -0
  14. package/dist/billing/tracker.d.ts +39 -0
  15. package/dist/billing/tracker.d.ts.map +1 -0
  16. package/dist/billing/tracker.js +92 -0
  17. package/dist/billing/tracker.js.map +1 -0
  18. package/dist/cache/cachedElsClient.d.ts +71 -0
  19. package/dist/cache/cachedElsClient.d.ts.map +1 -0
  20. package/dist/cache/cachedElsClient.js +167 -0
  21. package/dist/cache/cachedElsClient.js.map +1 -0
  22. package/dist/cache/index.d.ts +10 -0
  23. package/dist/cache/index.d.ts.map +1 -0
  24. package/dist/cache/index.js +6 -0
  25. package/dist/cache/index.js.map +1 -0
  26. package/dist/cache/policies.d.ts +60 -0
  27. package/dist/cache/policies.d.ts.map +1 -0
  28. package/dist/cache/policies.js +90 -0
  29. package/dist/cache/policies.js.map +1 -0
  30. package/dist/cache/redis.d.ts +52 -0
  31. package/dist/cache/redis.d.ts.map +1 -0
  32. package/dist/cache/redis.js +134 -0
  33. package/dist/cache/redis.js.map +1 -0
  34. package/dist/cache/types.d.ts +32 -0
  35. package/dist/cache/types.d.ts.map +1 -0
  36. package/dist/cache/types.js +32 -0
  37. package/dist/cache/types.js.map +1 -0
  38. package/dist/cache/wrapper.d.ts +38 -0
  39. package/dist/cache/wrapper.d.ts.map +1 -0
  40. package/dist/cache/wrapper.js +109 -0
  41. package/dist/cache/wrapper.js.map +1 -0
  42. package/dist/cli.d.ts +3 -0
  43. package/dist/cli.d.ts.map +1 -0
  44. package/dist/cli.js +86 -0
  45. package/dist/cli.js.map +1 -0
  46. package/dist/config.d.ts +105 -0
  47. package/dist/config.d.ts.map +1 -0
  48. package/dist/config.js +211 -0
  49. package/dist/config.js.map +1 -0
  50. package/dist/elsClient.d.ts +137 -0
  51. package/dist/elsClient.d.ts.map +1 -0
  52. package/dist/elsClient.js +285 -0
  53. package/dist/elsClient.js.map +1 -0
  54. package/dist/http/app.d.ts +40 -0
  55. package/dist/http/app.d.ts.map +1 -0
  56. package/dist/http/app.js +135 -0
  57. package/dist/http/app.js.map +1 -0
  58. package/dist/http/jwks.d.ts +8 -0
  59. package/dist/http/jwks.d.ts.map +1 -0
  60. package/dist/http/jwks.js +34 -0
  61. package/dist/http/jwks.js.map +1 -0
  62. package/dist/http/middleware/auth.d.ts +11 -0
  63. package/dist/http/middleware/auth.d.ts.map +1 -0
  64. package/dist/http/middleware/auth.js +225 -0
  65. package/dist/http/middleware/auth.js.map +1 -0
  66. package/dist/http/middleware/dcrRateLimit.d.ts +29 -0
  67. package/dist/http/middleware/dcrRateLimit.d.ts.map +1 -0
  68. package/dist/http/middleware/dcrRateLimit.js +59 -0
  69. package/dist/http/middleware/dcrRateLimit.js.map +1 -0
  70. package/dist/http/middleware/errorHandler.d.ts +12 -0
  71. package/dist/http/middleware/errorHandler.d.ts.map +1 -0
  72. package/dist/http/middleware/errorHandler.js +26 -0
  73. package/dist/http/middleware/errorHandler.js.map +1 -0
  74. package/dist/http/middleware/originGuard.d.ts +28 -0
  75. package/dist/http/middleware/originGuard.d.ts.map +1 -0
  76. package/dist/http/middleware/originGuard.js +55 -0
  77. package/dist/http/middleware/originGuard.js.map +1 -0
  78. package/dist/http/middleware/requestId.d.ts +19 -0
  79. package/dist/http/middleware/requestId.d.ts.map +1 -0
  80. package/dist/http/middleware/requestId.js +23 -0
  81. package/dist/http/middleware/requestId.js.map +1 -0
  82. package/dist/http/routes/health.d.ts +24 -0
  83. package/dist/http/routes/health.d.ts.map +1 -0
  84. package/dist/http/routes/health.js +73 -0
  85. package/dist/http/routes/health.js.map +1 -0
  86. package/dist/http/routes/metrics.d.ts +18 -0
  87. package/dist/http/routes/metrics.d.ts.map +1 -0
  88. package/dist/http/routes/metrics.js +42 -0
  89. package/dist/http/routes/metrics.js.map +1 -0
  90. package/dist/http/routes/wellKnown.d.ts +15 -0
  91. package/dist/http/routes/wellKnown.d.ts.map +1 -0
  92. package/dist/http/routes/wellKnown.js +43 -0
  93. package/dist/http/routes/wellKnown.js.map +1 -0
  94. package/dist/http/types.d.ts +40 -0
  95. package/dist/http/types.d.ts.map +1 -0
  96. package/dist/http/types.js +9 -0
  97. package/dist/http/types.js.map +1 -0
  98. package/dist/instrumentation.d.ts +22 -0
  99. package/dist/instrumentation.d.ts.map +1 -0
  100. package/dist/instrumentation.js +38 -0
  101. package/dist/instrumentation.js.map +1 -0
  102. package/dist/lib/cursor.d.ts +22 -0
  103. package/dist/lib/cursor.d.ts.map +1 -0
  104. package/dist/lib/cursor.js +95 -0
  105. package/dist/lib/cursor.js.map +1 -0
  106. package/dist/lib/errors.d.ts +49 -0
  107. package/dist/lib/errors.d.ts.map +1 -0
  108. package/dist/lib/errors.js +83 -0
  109. package/dist/lib/errors.js.map +1 -0
  110. package/dist/lib/responseFormat.d.ts +14 -0
  111. package/dist/lib/responseFormat.d.ts.map +1 -0
  112. package/dist/lib/responseFormat.js +74 -0
  113. package/dist/lib/responseFormat.js.map +1 -0
  114. package/dist/middleware/withMiddleware.d.ts +53 -0
  115. package/dist/middleware/withMiddleware.d.ts.map +1 -0
  116. package/dist/middleware/withMiddleware.js +190 -0
  117. package/dist/middleware/withMiddleware.js.map +1 -0
  118. package/dist/observability/health.d.ts +51 -0
  119. package/dist/observability/health.d.ts.map +1 -0
  120. package/dist/observability/health.js +77 -0
  121. package/dist/observability/health.js.map +1 -0
  122. package/dist/observability/index.d.ts +8 -0
  123. package/dist/observability/index.d.ts.map +1 -0
  124. package/dist/observability/index.js +5 -0
  125. package/dist/observability/index.js.map +1 -0
  126. package/dist/observability/logger.d.ts +45 -0
  127. package/dist/observability/logger.d.ts.map +1 -0
  128. package/dist/observability/logger.js +75 -0
  129. package/dist/observability/logger.js.map +1 -0
  130. package/dist/observability/metrics.d.ts +49 -0
  131. package/dist/observability/metrics.d.ts.map +1 -0
  132. package/dist/observability/metrics.js +184 -0
  133. package/dist/observability/metrics.js.map +1 -0
  134. package/dist/observability/tracing.d.ts +28 -0
  135. package/dist/observability/tracing.d.ts.map +1 -0
  136. package/dist/observability/tracing.js +56 -0
  137. package/dist/observability/tracing.js.map +1 -0
  138. package/dist/prompts/index.d.ts +20 -0
  139. package/dist/prompts/index.d.ts.map +1 -0
  140. package/dist/prompts/index.js +202 -0
  141. package/dist/prompts/index.js.map +1 -0
  142. package/dist/redaction/argsRedactor.d.ts +22 -0
  143. package/dist/redaction/argsRedactor.d.ts.map +1 -0
  144. package/dist/redaction/argsRedactor.js +97 -0
  145. package/dist/redaction/argsRedactor.js.map +1 -0
  146. package/dist/redaction/fields.d.ts +64 -0
  147. package/dist/redaction/fields.d.ts.map +1 -0
  148. package/dist/redaction/fields.js +155 -0
  149. package/dist/redaction/fields.js.map +1 -0
  150. package/dist/redaction/index.d.ts +52 -0
  151. package/dist/redaction/index.d.ts.map +1 -0
  152. package/dist/redaction/index.js +160 -0
  153. package/dist/redaction/index.js.map +1 -0
  154. package/dist/redaction/promptInjection.d.ts +32 -0
  155. package/dist/redaction/promptInjection.d.ts.map +1 -0
  156. package/dist/redaction/promptInjection.js +68 -0
  157. package/dist/redaction/promptInjection.js.map +1 -0
  158. package/dist/redaction/url.d.ts +8 -0
  159. package/dist/redaction/url.d.ts.map +1 -0
  160. package/dist/redaction/url.js +26 -0
  161. package/dist/redaction/url.js.map +1 -0
  162. package/dist/redaction/userAgent.d.ts +9 -0
  163. package/dist/redaction/userAgent.d.ts.map +1 -0
  164. package/dist/redaction/userAgent.js +39 -0
  165. package/dist/redaction/userAgent.js.map +1 -0
  166. package/dist/resources/index.d.ts +24 -0
  167. package/dist/resources/index.d.ts.map +1 -0
  168. package/dist/resources/index.js +150 -0
  169. package/dist/resources/index.js.map +1 -0
  170. package/dist/server.d.ts +37 -0
  171. package/dist/server.d.ts.map +1 -0
  172. package/dist/server.js +35 -0
  173. package/dist/server.js.map +1 -0
  174. package/dist/tools/baselineCompare.d.ts +36 -0
  175. package/dist/tools/baselineCompare.d.ts.map +1 -0
  176. package/dist/tools/baselineCompare.js +69 -0
  177. package/dist/tools/baselineCompare.js.map +1 -0
  178. package/dist/tools/errorHeatmap.d.ts +40 -0
  179. package/dist/tools/errorHeatmap.d.ts.map +1 -0
  180. package/dist/tools/errorHeatmap.js +69 -0
  181. package/dist/tools/errorHeatmap.js.map +1 -0
  182. package/dist/tools/errorHistogram.d.ts +39 -0
  183. package/dist/tools/errorHistogram.d.ts.map +1 -0
  184. package/dist/tools/errorHistogram.js +61 -0
  185. package/dist/tools/errorHistogram.js.map +1 -0
  186. package/dist/tools/errorStatsBreakdown.d.ts +43 -0
  187. package/dist/tools/errorStatsBreakdown.d.ts.map +1 -0
  188. package/dist/tools/errorStatsBreakdown.js +77 -0
  189. package/dist/tools/errorStatsBreakdown.js.map +1 -0
  190. package/dist/tools/errorsInSession.d.ts +44 -0
  191. package/dist/tools/errorsInSession.d.ts.map +1 -0
  192. package/dist/tools/errorsInSession.js +91 -0
  193. package/dist/tools/errorsInSession.js.map +1 -0
  194. package/dist/tools/explainError.d.ts +35 -0
  195. package/dist/tools/explainError.d.ts.map +1 -0
  196. package/dist/tools/explainError.js +98 -0
  197. package/dist/tools/explainError.js.map +1 -0
  198. package/dist/tools/findCorrelatedErrors.d.ts +43 -0
  199. package/dist/tools/findCorrelatedErrors.d.ts.map +1 -0
  200. package/dist/tools/findCorrelatedErrors.js +59 -0
  201. package/dist/tools/findCorrelatedErrors.js.map +1 -0
  202. package/dist/tools/findSimilarErrors.d.ts +44 -0
  203. package/dist/tools/findSimilarErrors.d.ts.map +1 -0
  204. package/dist/tools/findSimilarErrors.js +59 -0
  205. package/dist/tools/findSimilarErrors.js.map +1 -0
  206. package/dist/tools/getLogDetails.d.ts +30 -0
  207. package/dist/tools/getLogDetails.d.ts.map +1 -0
  208. package/dist/tools/getLogDetails.js +49 -0
  209. package/dist/tools/getLogDetails.js.map +1 -0
  210. package/dist/tools/groupedErrors.d.ts +46 -0
  211. package/dist/tools/groupedErrors.d.ts.map +1 -0
  212. package/dist/tools/groupedErrors.js +71 -0
  213. package/dist/tools/groupedErrors.js.map +1 -0
  214. package/dist/tools/impactAnalysis.d.ts +42 -0
  215. package/dist/tools/impactAnalysis.d.ts.map +1 -0
  216. package/dist/tools/impactAnalysis.js +61 -0
  217. package/dist/tools/impactAnalysis.js.map +1 -0
  218. package/dist/tools/index.d.ts +41 -0
  219. package/dist/tools/index.d.ts.map +1 -0
  220. package/dist/tools/index.js +83 -0
  221. package/dist/tools/index.js.map +1 -0
  222. package/dist/tools/listApps.d.ts +27 -0
  223. package/dist/tools/listApps.d.ts.map +1 -0
  224. package/dist/tools/listApps.js +78 -0
  225. package/dist/tools/listApps.js.map +1 -0
  226. package/dist/tools/queryLogsJql.d.ts +44 -0
  227. package/dist/tools/queryLogsJql.d.ts.map +1 -0
  228. package/dist/tools/queryLogsJql.js +107 -0
  229. package/dist/tools/queryLogsJql.js.map +1 -0
  230. package/dist/tools/searchLogs.d.ts +60 -0
  231. package/dist/tools/searchLogs.d.ts.map +1 -0
  232. package/dist/tools/searchLogs.js +127 -0
  233. package/dist/tools/searchLogs.js.map +1 -0
  234. package/dist/tools/topErrorMessages.d.ts +42 -0
  235. package/dist/tools/topErrorMessages.d.ts.map +1 -0
  236. package/dist/tools/topErrorMessages.js +63 -0
  237. package/dist/tools/topErrorMessages.js.map +1 -0
  238. package/dist/tools/trafficStats.d.ts +39 -0
  239. package/dist/tools/trafficStats.d.ts.map +1 -0
  240. package/dist/tools/trafficStats.js +57 -0
  241. package/dist/tools/trafficStats.js.map +1 -0
  242. package/dist/tools/triageRecentCritical.d.ts +26 -0
  243. package/dist/tools/triageRecentCritical.d.ts.map +1 -0
  244. package/dist/tools/triageRecentCritical.js +81 -0
  245. package/dist/tools/triageRecentCritical.js.map +1 -0
  246. package/dist/tools/versionRegression.d.ts +29 -0
  247. package/dist/tools/versionRegression.d.ts.map +1 -0
  248. package/dist/tools/versionRegression.js +80 -0
  249. package/dist/tools/versionRegression.js.map +1 -0
  250. package/dist/transports/http-server.d.ts +25 -0
  251. package/dist/transports/http-server.d.ts.map +1 -0
  252. package/dist/transports/http-server.js +84 -0
  253. package/dist/transports/http-server.js.map +1 -0
  254. package/dist/transports/http.d.ts +71 -0
  255. package/dist/transports/http.d.ts.map +1 -0
  256. package/dist/transports/http.js +315 -0
  257. package/dist/transports/http.js.map +1 -0
  258. package/dist/transports/stdio.d.ts +13 -0
  259. package/dist/transports/stdio.d.ts.map +1 -0
  260. package/dist/transports/stdio.js +16 -0
  261. package/dist/transports/stdio.js.map +1 -0
  262. package/dist/types.d.ts +150 -0
  263. package/dist/types.d.ts.map +1 -0
  264. package/dist/types.js +8 -0
  265. package/dist/types.js.map +1 -0
  266. package/package.json +95 -0
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Pipeline редакции ErrorLog items перед возвратом из tools.
3
+ *
4
+ * Контракт:
5
+ * - Не мутирует исходный объект, возвращает плоский клон.
6
+ * - Применяет PII regex ко всем string-полям (включая компактные варианты).
7
+ * - Анонимизирует `ip` (last octet → 0 для IPv4, /64 для IPv6).
8
+ * - Усекает `userAgent` до family.
9
+ * - Strip query из `url` и `referrer`.
10
+ * - Оборачивает `message`/`stack` в `<untrusted>...</untrusted>` для compact/full форматов.
11
+ * - Считает `suspiciousContent` по deny-list (см. promptInjection.ts).
12
+ *
13
+ * Конфиг управляется ENV (см. src/config.ts):
14
+ * - MCP_REDACTION_ENABLED (default true)
15
+ * - MCP_REDACTION_FIELDS (csv override — например `email,phone,jwt`)
16
+ */
17
+ import { redactString } from './fields.js';
18
+ import { userAgentFamily } from './userAgent.js';
19
+ import { stripUrlQuery } from './url.js';
20
+ import { redactValue } from './argsRedactor.js';
21
+ import { wrapUntrusted, detectSuspicious } from './promptInjection.js';
22
+ export const DEFAULT_REDACTION_CONFIG = {
23
+ enabled: true,
24
+ wrapUntrusted: true,
25
+ };
26
+ function shouldApply(field, cfg) {
27
+ if (!cfg.enabled)
28
+ return false;
29
+ if (!cfg.fields || cfg.fields.size === 0)
30
+ return true;
31
+ return cfg.fields.has(field);
32
+ }
33
+ /**
34
+ * Список «строковых» полей ErrorLog, которые мы прогоняем через `redactString`.
35
+ * Стек, message — отдельно (с wrap-обёрткой).
36
+ */
37
+ const STRING_FIELDS_TO_SCAN = [
38
+ 'browser',
39
+ 'urlPath',
40
+ 'errorCategory',
41
+ 'appSlug',
42
+ 'serviceName',
43
+ 'deploymentEnv',
44
+ 'language',
45
+ 'fingerprint',
46
+ 'sessionId',
47
+ 'appVersion',
48
+ 'screenSize',
49
+ 'viewportSize',
50
+ ];
51
+ /**
52
+ * Редактирует один ErrorLog (или его compact-вариант). Возвращает новый объект.
53
+ */
54
+ export function redactErrorLog(log, opts = {}) {
55
+ const cfg = opts.config ?? DEFAULT_REDACTION_CONFIG;
56
+ const fieldsHit = new Set();
57
+ let suspiciousRule;
58
+ if (!cfg.enabled) {
59
+ return {
60
+ value: log,
61
+ stats: { fieldsHit: [], suspiciousContentBlocked: false },
62
+ };
63
+ }
64
+ const out = { ...log };
65
+ // 1. IP (отдельная анонимизация).
66
+ if (shouldApply('ip', cfg) && typeof out.ip === 'string' && out.ip.length > 0) {
67
+ const { value, fieldsHit: hits } = redactString(out.ip);
68
+ out.ip = value;
69
+ for (const h of hits)
70
+ fieldsHit.add(h);
71
+ }
72
+ // 2. userAgent → family.
73
+ if (shouldApply('userAgent', cfg) && typeof out.userAgent === 'string') {
74
+ const fam = userAgentFamily(out.userAgent);
75
+ out.userAgent = fam;
76
+ if (fam !== out.userAgent)
77
+ fieldsHit.add('userAgent');
78
+ }
79
+ // 3. URL / referrer — strip query.
80
+ if (shouldApply('url', cfg)) {
81
+ if (typeof out.url === 'string')
82
+ out.url = stripUrlQuery(out.url);
83
+ if (typeof out.referrer === 'string')
84
+ out.referrer = stripUrlQuery(out.referrer);
85
+ }
86
+ // 4. Простые строковые поля — regex pii.
87
+ for (const f of STRING_FIELDS_TO_SCAN) {
88
+ if (!shouldApply(f, cfg))
89
+ continue;
90
+ const v = out[f];
91
+ if (typeof v === 'string' && v.length > 0) {
92
+ const { value, fieldsHit: hits } = redactString(v);
93
+ out[f] = value;
94
+ for (const h of hits)
95
+ fieldsHit.add(h);
96
+ }
97
+ }
98
+ // 5. message + stack — отдельно. Сначала regex, потом suspicious-detect, потом wrap.
99
+ const processSensitiveText = (key) => {
100
+ if (!shouldApply(key, cfg))
101
+ return;
102
+ const v = out[key];
103
+ if (typeof v !== 'string' || v.length === 0)
104
+ return;
105
+ const { value, fieldsHit: hits } = redactString(v);
106
+ for (const h of hits)
107
+ fieldsHit.add(h);
108
+ const suspicious = detectSuspicious(value);
109
+ if (suspicious && !suspiciousRule)
110
+ suspiciousRule = suspicious.rule;
111
+ out[key] = cfg.wrapUntrusted !== false ? wrapUntrusted(value) : value;
112
+ };
113
+ processSensitiveText('message');
114
+ processSensitiveText('stack');
115
+ processSensitiveText('componentStack');
116
+ // 6. aiDiagnosis — если есть, прогоняем через универсальный redactor.
117
+ if (out.aiDiagnosis !== undefined && out.aiDiagnosis !== null) {
118
+ const { value, fieldsHit: hits } = redactValue(out.aiDiagnosis);
119
+ out.aiDiagnosis = value;
120
+ for (const h of hits)
121
+ fieldsHit.add(h);
122
+ }
123
+ return {
124
+ value: out,
125
+ stats: {
126
+ fieldsHit: Array.from(fieldsHit),
127
+ suspiciousContentBlocked: !!suspiciousRule,
128
+ ...(suspiciousRule ? { suspiciousRule } : {}),
129
+ },
130
+ };
131
+ }
132
+ /**
133
+ * Массовая редакция items. Объединяет stats по всем.
134
+ */
135
+ export function redactErrorLogs(logs, opts = {}) {
136
+ const fieldsHit = new Set();
137
+ let suspiciousRule;
138
+ const items = logs.map((log) => {
139
+ const { value, stats } = redactErrorLog(log, opts);
140
+ for (const f of stats.fieldsHit)
141
+ fieldsHit.add(f);
142
+ if (stats.suspiciousContentBlocked && !suspiciousRule)
143
+ suspiciousRule = stats.suspiciousRule;
144
+ return value;
145
+ });
146
+ return {
147
+ items,
148
+ stats: {
149
+ fieldsHit: Array.from(fieldsHit),
150
+ suspiciousContentBlocked: !!suspiciousRule,
151
+ ...(suspiciousRule ? { suspiciousRule } : {}),
152
+ },
153
+ };
154
+ }
155
+ export { redactValue } from './argsRedactor.js';
156
+ export { wrapUntrusted, detectSuspicious, containsSuspicious } from './promptInjection.js';
157
+ export { userAgentFamily } from './userAgent.js';
158
+ export { stripUrlQuery } from './url.js';
159
+ export { redactString } from './fields.js';
160
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/redaction/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAgBvE,MAAM,CAAC,MAAM,wBAAwB,GAAoB;IACvD,OAAO,EAAE,IAAI;IACb,aAAa,EAAE,IAAI;CACpB,CAAC;AAEF,SAAS,WAAW,CAAC,KAAa,EAAE,GAAoB;IACtD,IAAI,CAAC,GAAG,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC/B,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtD,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED;;;GAGG;AACH,MAAM,qBAAqB,GAAG;IAC5B,SAAS;IACT,SAAS;IACT,eAAe;IACf,SAAS;IACT,aAAa;IACb,eAAe;IACf,UAAU;IACV,aAAa;IACb,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,cAAc;CACN,CAAC;AAMX;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,GAAM,EACN,OAA0B,EAAE;IAE5B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,wBAAwB,CAAC;IACpD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,IAAI,cAAkC,CAAC;IAEvC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO;YACL,KAAK,EAAE,GAAG;YACV,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,wBAAwB,EAAE,KAAK,EAAE;SAC1D,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAA4B,EAAE,GAAG,GAAG,EAAE,CAAC;IAEhD,kCAAkC;IAClC,IAAI,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,IAAI,GAAG,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9E,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxD,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC;QACf,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,yBAAyB;IACzB,IAAI,WAAW,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QACvE,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC3C,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC;QACpB,IAAI,GAAG,KAAK,GAAG,CAAC,SAAS;YAAE,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACxD,CAAC;IAED,mCAAmC;IACnC,IAAI,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;QAC5B,IAAI,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ;YAAE,GAAG,CAAC,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClE,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ;YAAE,GAAG,CAAC,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACnF,CAAC;IAED,yCAAyC;IACzC,KAAK,MAAM,CAAC,IAAI,qBAAqB,EAAE,CAAC;QACtC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,GAAG,CAAC;YAAE,SAAS;QACnC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACjB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YACnD,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;YACf,KAAK,MAAM,CAAC,IAAI,IAAI;gBAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,qFAAqF;IACrF,MAAM,oBAAoB,GAAG,CAAC,GAA2C,EAAQ,EAAE;QACjF,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC;YAAE,OAAO;QACnC,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACnB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACpD,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QACnD,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,UAAU,IAAI,CAAC,cAAc;YAAE,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC;QACpE,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACxE,CAAC,CAAC;IACF,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAChC,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;IAEvC,sEAAsE;IACtE,IAAI,GAAG,CAAC,WAAW,KAAK,SAAS,IAAI,GAAG,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;QAC9D,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAChE,GAAG,CAAC,WAAW,GAAG,KAAK,CAAC;QACxB,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,OAAO;QACL,KAAK,EAAE,GAAQ;QACf,KAAK,EAAE;YACL,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;YAChC,wBAAwB,EAAE,CAAC,CAAC,cAAc;YAC1C,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9C;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAS,EACT,OAA0B,EAAE;IAE5B,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,IAAI,cAAkC,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QAC7B,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACnD,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS;YAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAClD,IAAI,KAAK,CAAC,wBAAwB,IAAI,CAAC,cAAc;YAAE,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;QAC7F,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IACH,OAAO;QACL,KAAK;QACL,KAAK,EAAE;YACL,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;YAChC,wBAAwB,EAAE,CAAC,CAAC,cAAc;YAC1C,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9C;KACF,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC3F,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Prompt-injection mitigation:
3
+ * 1. Оборачиваем untrusted-контент в `<untrusted>...</untrusted>` теги.
4
+ * 2. Сканируем на regex-deny-list. При совпадении — флаг `suspicious=true`,
5
+ * вызывающий код может заменить контент на `<blocked: suspicious content>`.
6
+ *
7
+ * См. 06-security.md §2.
8
+ *
9
+ * Phase 6: при detect инкрементим Prometheus counter
10
+ * `mcp_prompt_injection_blocked_total{rule}`.
11
+ */
12
+ /** Regex-список «подозрительных» паттернов в untrusted-контенте. */
13
+ export declare const SUSPICIOUS_PATTERNS: Array<{
14
+ name: string;
15
+ re: RegExp;
16
+ }>;
17
+ /**
18
+ * Оборачивает строку в `<untrusted>`-теги. Если внутри уже есть точно
19
+ * такие же теги — экранируем их, чтобы не дать атакующему «закрыть»
20
+ * нашу обёртку.
21
+ */
22
+ export declare function wrapUntrusted(text: string | null | undefined): string | null;
23
+ export interface SuspiciousMatch {
24
+ rule: string;
25
+ }
26
+ /**
27
+ * Возвращает первое совпавшее правило или null. Не модифицирует строку.
28
+ */
29
+ export declare function detectSuspicious(text: string | null | undefined): SuspiciousMatch | null;
30
+ /** Удобный bool-обёртка вокруг `detectSuspicious`. */
31
+ export declare function containsSuspicious(text: string | null | undefined): boolean;
32
+ //# sourceMappingURL=promptInjection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promptInjection.d.ts","sourceRoot":"","sources":["../../src/redaction/promptInjection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,oEAAoE;AACpE,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAUnE,CAAC;AAOF;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAM5E;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,eAAe,GAAG,IAAI,CAcxF;AAED,sDAAsD;AACtD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAE3E"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Prompt-injection mitigation:
3
+ * 1. Оборачиваем untrusted-контент в `<untrusted>...</untrusted>` теги.
4
+ * 2. Сканируем на regex-deny-list. При совпадении — флаг `suspicious=true`,
5
+ * вызывающий код может заменить контент на `<blocked: suspicious content>`.
6
+ *
7
+ * См. 06-security.md §2.
8
+ *
9
+ * Phase 6: при detect инкрементим Prometheus counter
10
+ * `mcp_prompt_injection_blocked_total{rule}`.
11
+ */
12
+ import { recordPromptInjectionBlocked } from '../observability/metrics.js';
13
+ /** Regex-список «подозрительных» паттернов в untrusted-контенте. */
14
+ export const SUSPICIOUS_PATTERNS = [
15
+ { name: 'ignore_previous', re: /ignore\s+(all\s+)?previous\s+(instructions?|messages?|prompts?)/i },
16
+ { name: 'disregard_prior', re: /disregard\s+(all\s+)?(prior|previous)/i },
17
+ { name: 'system_role', re: /(^|\W)system\s*:/i },
18
+ { name: 'assistant_role', re: /(^|\W)assistant\s*:/i },
19
+ { name: 'im_marker', re: /<\|im_(start|end)\|>/i },
20
+ { name: 'inst_marker', re: /\[\/?INST\]/i },
21
+ { name: 'you_are_now', re: /you\s+are\s+now\s+(a|an)\s+\w+/i },
22
+ { name: 'override_rules', re: /override\s+your\s+(rules|instructions)/i },
23
+ { name: 'jailbreak', re: /jailbreak/i },
24
+ ];
25
+ const OPEN_TAG = '<untrusted>';
26
+ const CLOSE_TAG = '</untrusted>';
27
+ const ESCAPED_OPEN = '&lt;untrusted&gt;';
28
+ const ESCAPED_CLOSE = '&lt;/untrusted&gt;';
29
+ /**
30
+ * Оборачивает строку в `<untrusted>`-теги. Если внутри уже есть точно
31
+ * такие же теги — экранируем их, чтобы не дать атакующему «закрыть»
32
+ * нашу обёртку.
33
+ */
34
+ export function wrapUntrusted(text) {
35
+ if (text === null || text === undefined)
36
+ return null;
37
+ if (typeof text !== 'string')
38
+ return String(text);
39
+ if (text.length === 0)
40
+ return text;
41
+ const escaped = text.replace(/<untrusted>/gi, ESCAPED_OPEN).replace(/<\/untrusted>/gi, ESCAPED_CLOSE);
42
+ return `${OPEN_TAG}${escaped}${CLOSE_TAG}`;
43
+ }
44
+ /**
45
+ * Возвращает первое совпавшее правило или null. Не модифицирует строку.
46
+ */
47
+ export function detectSuspicious(text) {
48
+ if (!text || typeof text !== 'string')
49
+ return null;
50
+ for (const { name, re } of SUSPICIOUS_PATTERNS) {
51
+ if (re.test(text)) {
52
+ // Phase 6: метрика на каждое срабатывание.
53
+ try {
54
+ recordPromptInjectionBlocked(name);
55
+ }
56
+ catch {
57
+ // не блокируем основной flow при ошибке метрики
58
+ }
59
+ return { rule: name };
60
+ }
61
+ }
62
+ return null;
63
+ }
64
+ /** Удобный bool-обёртка вокруг `detectSuspicious`. */
65
+ export function containsSuspicious(text) {
66
+ return detectSuspicious(text) !== null;
67
+ }
68
+ //# sourceMappingURL=promptInjection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promptInjection.js","sourceRoot":"","sources":["../../src/redaction/promptInjection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAE3E,oEAAoE;AACpE,MAAM,CAAC,MAAM,mBAAmB,GAAwC;IACtE,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE,kEAAkE,EAAE;IACnG,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE,wCAAwC,EAAE;IACzE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,mBAAmB,EAAE;IAChD,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,EAAE,sBAAsB,EAAE;IACtD,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,uBAAuB,EAAE;IAClD,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,cAAc,EAAE;IAC3C,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,iCAAiC,EAAE;IAC9D,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,EAAE,yCAAyC,EAAE;IACzE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,YAAY,EAAE;CACxC,CAAC;AAEF,MAAM,QAAQ,GAAG,aAAa,CAAC;AAC/B,MAAM,SAAS,GAAG,cAAc,CAAC;AACjC,MAAM,YAAY,GAAG,mBAAmB,CAAC;AACzC,MAAM,aAAa,GAAG,oBAAoB,CAAC;AAE3C;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAA+B;IAC3D,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACrD,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;IACtG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,EAAE,CAAC;AAC7C,CAAC;AAMD;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAA+B;IAC9D,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACnD,KAAK,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,mBAAmB,EAAE,CAAC;QAC/C,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAClB,2CAA2C;YAC3C,IAAI,CAAC;gBACH,4BAA4B,CAAC,IAAI,CAAC,CAAC;YACrC,CAAC;YAAC,MAAM,CAAC;gBACP,gDAAgD;YAClD,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,kBAAkB,CAAC,IAA+B;IAChE,OAAO,gBAAgB,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;AACzC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Очистка URL: убираем query string (часто содержит токены/PII),
3
+ * оставляем host + path. Hash-фрагмент тоже отбрасываем.
4
+ *
5
+ * Если строка не похожа на URL — возвращаем как есть.
6
+ */
7
+ export declare function stripUrlQuery(url: string | null | undefined): string | null;
8
+ //# sourceMappingURL=url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../src/redaction/url.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAgB3E"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Очистка URL: убираем query string (часто содержит токены/PII),
3
+ * оставляем host + path. Hash-фрагмент тоже отбрасываем.
4
+ *
5
+ * Если строка не похожа на URL — возвращаем как есть.
6
+ */
7
+ export function stripUrlQuery(url) {
8
+ if (!url)
9
+ return url ?? null;
10
+ try {
11
+ // Поддерживаем как absolute, так и relative URL.
12
+ if (url.startsWith('/')) {
13
+ const qIdx = url.indexOf('?');
14
+ const hIdx = url.indexOf('#');
15
+ const end = [qIdx, hIdx].filter((i) => i >= 0).sort((a, b) => a - b)[0];
16
+ return end === undefined ? url : url.slice(0, end);
17
+ }
18
+ const u = new URL(url);
19
+ return `${u.protocol}//${u.host}${u.pathname}`;
20
+ }
21
+ catch {
22
+ // Не URL — возвращаем как есть.
23
+ return url;
24
+ }
25
+ }
26
+ //# sourceMappingURL=url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/redaction/url.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,GAA8B;IAC1D,IAAI,CAAC,GAAG;QAAE,OAAO,GAAG,IAAI,IAAI,CAAC;IAC7B,IAAI,CAAC;QACH,iDAAiD;QACjD,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC9B,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC9B,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxE,OAAO,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACrD,CAAC;QACD,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACvB,OAAO,GAAG,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,gCAAgC;QAChC,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Сокращение userAgent до family (browser / runtime name).
3
+ *
4
+ * Phase 5: упрощённый matcher без зависимости на ua-parser-js (минимизируем
5
+ * supply-chain). Покрывает 99 % browser/runtime семейств, встречающихся в логах.
6
+ * При необходимости можно поменять на ua-parser-js в будущем — контракт остаётся.
7
+ */
8
+ export declare function userAgentFamily(ua: string | null | undefined): string | null;
9
+ //# sourceMappingURL=userAgent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userAgent.d.ts","sourceRoot":"","sources":["../../src/redaction/userAgent.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAyBH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAM5E"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Сокращение userAgent до family (browser / runtime name).
3
+ *
4
+ * Phase 5: упрощённый matcher без зависимости на ua-parser-js (минимизируем
5
+ * supply-chain). Покрывает 99 % browser/runtime семейств, встречающихся в логах.
6
+ * При необходимости можно поменять на ua-parser-js в будущем — контракт остаётся.
7
+ */
8
+ const PATTERNS = [
9
+ // Boтыs / crawlers — first, чтобы не путать с Chrome.
10
+ { re: /Googlebot/i, family: 'Googlebot' },
11
+ { re: /Bingbot/i, family: 'Bingbot' },
12
+ { re: /YandexBot/i, family: 'YandexBot' },
13
+ { re: /DuckDuckBot/i, family: 'DuckDuckBot' },
14
+ { re: /Slackbot|Slack-ImgProxy/i, family: 'Slackbot' },
15
+ // Order matters: Edge contains Chrome substring.
16
+ { re: /Edg\//i, family: 'Edge' },
17
+ { re: /OPR\/|Opera/i, family: 'Opera' },
18
+ { re: /Firefox\//i, family: 'Firefox' },
19
+ { re: /Chrome\//i, family: 'Chrome' },
20
+ { re: /Safari\//i, family: 'Safari' },
21
+ // Runtimes.
22
+ { re: /curl\//i, family: 'curl' },
23
+ { re: /wget\//i, family: 'wget' },
24
+ { re: /node\b|node-fetch|undici/i, family: 'Node' },
25
+ { re: /python-requests|urllib/i, family: 'Python' },
26
+ { re: /Go-http-client/i, family: 'Go' },
27
+ { re: /Java\//i, family: 'Java' },
28
+ { re: /PostmanRuntime/i, family: 'Postman' },
29
+ ];
30
+ export function userAgentFamily(ua) {
31
+ if (!ua)
32
+ return null;
33
+ for (const { re, family } of PATTERNS) {
34
+ if (re.test(ua))
35
+ return family;
36
+ }
37
+ return 'Unknown';
38
+ }
39
+ //# sourceMappingURL=userAgent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userAgent.js","sourceRoot":"","sources":["../../src/redaction/userAgent.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,QAAQ,GAA0C;IACtD,sDAAsD;IACtD,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE;IACzC,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE;IACrC,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE;IACzC,EAAE,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE;IAC7C,EAAE,EAAE,EAAE,0BAA0B,EAAE,MAAM,EAAE,UAAU,EAAE;IACtD,iDAAiD;IACjD,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE;IAChC,EAAE,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE;IACvC,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE;IACvC,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE;IACrC,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE;IACrC,YAAY;IACZ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE;IACjC,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE;IACjC,EAAE,EAAE,EAAE,2BAA2B,EAAE,MAAM,EAAE,MAAM,EAAE;IACnD,EAAE,EAAE,EAAE,yBAAyB,EAAE,MAAM,EAAE,QAAQ,EAAE;IACnD,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,EAAE,IAAI,EAAE;IACvC,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE;IACjC,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,EAAE,SAAS,EAAE;CAC7C,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,EAA6B;IAC3D,IAAI,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IACrB,KAAK,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QACtC,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,OAAO,MAAM,CAAC;IACjC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { Logger } from 'pino';
3
+ import type { ElsClient } from '../elsClient.js';
4
+ /**
5
+ * Phase 2 MCP-resources поверх ELS.
6
+ *
7
+ * Подход: каждый resource — это thin wrapper над соответствующим tool/handler,
8
+ * чтобы вся business-логика жила в одном месте. Cache + subscriptions —
9
+ * Phase 4 (нужен Redis); сейчас на каждый read делается свежий upstream-вызов.
10
+ *
11
+ * Зарегистрированные URI:
12
+ * els://apps — список доступных apps
13
+ * els://apps/{slug}/stats/24h — сводка за 24ч
14
+ * els://apps/{slug}/recent-critical — top-50 CRITICAL за час
15
+ * els://logs/{traceId} — детальный лог
16
+ * els://apps/{slug}/saved-queries — V2 placeholder
17
+ */
18
+ export interface RegisterResourcesOptions {
19
+ client: ElsClient;
20
+ log?: Logger;
21
+ }
22
+ export declare const ALL_RESOURCE_URIS: readonly ["els://apps", "els://apps/{slug}/stats/24h", "els://apps/{slug}/recent-critical", "els://logs/{traceId}", "els://apps/{slug}/saved-queries"];
23
+ export declare function registerResources(server: McpServer, opts: RegisterResourcesOptions): string[];
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAoB,MAAM,yCAAyC,CAAC;AACtF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAOjD;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,SAAS,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,iBAAiB,wJAMpB,CAAC;AAqBX,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,wBAAwB,GAAG,MAAM,EAAE,CA+J7F"}
@@ -0,0 +1,150 @@
1
+ import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { ToolError } from '../lib/errors.js';
3
+ import { handleListApps } from '../tools/listApps.js';
4
+ import { handleErrorStatsBreakdown } from '../tools/errorStatsBreakdown.js';
5
+ import { handleSearchLogs } from '../tools/searchLogs.js';
6
+ import { handleGetLogDetails } from '../tools/getLogDetails.js';
7
+ export const ALL_RESOURCE_URIS = [
8
+ 'els://apps',
9
+ 'els://apps/{slug}/stats/24h',
10
+ 'els://apps/{slug}/recent-critical',
11
+ 'els://logs/{traceId}',
12
+ 'els://apps/{slug}/saved-queries',
13
+ ];
14
+ function buildJsonResource(uri, payload) {
15
+ return {
16
+ contents: [
17
+ {
18
+ uri,
19
+ mimeType: 'application/json',
20
+ text: JSON.stringify(payload, null, 2),
21
+ },
22
+ ],
23
+ };
24
+ }
25
+ function extractStructured(result) {
26
+ if (result.isError) {
27
+ return { error: result.structuredContent ?? { code: 'INTERNAL' } };
28
+ }
29
+ return result.structuredContent ?? {};
30
+ }
31
+ export function registerResources(server, opts) {
32
+ const { client } = opts;
33
+ const registered = [];
34
+ // ─── els://apps ─────────────────────────────────────────────────────────
35
+ server.registerResource('els-apps', 'els://apps', {
36
+ title: 'List of apps accessible to current API key',
37
+ description: 'Returns apps available to the current API key. For master keys — all apps; for regular keys — single current app.',
38
+ mimeType: 'application/json',
39
+ }, async (uri) => {
40
+ const result = await handleListApps({}, client);
41
+ return buildJsonResource(uri.toString(), extractStructured(result));
42
+ });
43
+ registered.push('els://apps');
44
+ // ─── els://apps/{slug}/stats/24h ─────────────────────────────────────────
45
+ server.registerResource('els-app-stats-24h', new ResourceTemplate('els://apps/{slug}/stats/24h', { list: undefined }), {
46
+ title: 'App stats for the last 24 hours',
47
+ description: 'Aggregated stats for a single app over the last 24 hours: total, unique fingerprints, distinct users/services/urls, byLevel breakdown.',
48
+ mimeType: 'application/json',
49
+ }, async (uri, variables) => {
50
+ const slug = String(variables.slug ?? '');
51
+ const fromIso = new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString();
52
+ const toIso = new Date().toISOString();
53
+ try {
54
+ const result = await handleErrorStatsBreakdown({ from: fromIso, to: toIso, compareTo: 'none' }, client);
55
+ const payload = { slug, window: '24h', from: fromIso, to: toIso, ...extractStructured(result) };
56
+ return buildJsonResource(uri.toString(), payload);
57
+ }
58
+ catch (err) {
59
+ if (err instanceof ToolError) {
60
+ return buildJsonResource(uri.toString(), {
61
+ slug,
62
+ error: { code: err.code, message: err.message },
63
+ });
64
+ }
65
+ throw err;
66
+ }
67
+ });
68
+ registered.push('els://apps/{slug}/stats/24h');
69
+ // ─── els://apps/{slug}/recent-critical ───────────────────────────────────
70
+ server.registerResource('els-app-recent-critical', new ResourceTemplate('els://apps/{slug}/recent-critical', { list: undefined }), {
71
+ title: 'Recent CRITICAL errors (last hour, top 50)',
72
+ description: 'Up to 50 CRITICAL errors from the last hour, newest first. Phase 2: no subscriptions yet (each read = fresh upstream call). Subscriptions added in Phase 4.',
73
+ mimeType: 'application/json',
74
+ }, async (uri, variables) => {
75
+ const slug = String(variables.slug ?? '');
76
+ const fromIso = new Date(Date.now() - 60 * 60 * 1000).toISOString();
77
+ try {
78
+ const result = await handleSearchLogs({
79
+ limit: 50,
80
+ sortBy: 'receivedAt',
81
+ sortOrder: 'desc',
82
+ from: fromIso,
83
+ level: ['CRITICAL'],
84
+ response_format: 'compact',
85
+ }, client);
86
+ const sc = extractStructured(result);
87
+ const payload = {
88
+ slug,
89
+ items: sc.items ?? [],
90
+ total: sc.total ?? 0,
91
+ lastUpdated: new Date().toISOString(),
92
+ _meta: sc._meta,
93
+ };
94
+ return buildJsonResource(uri.toString(), payload);
95
+ }
96
+ catch (err) {
97
+ if (err instanceof ToolError) {
98
+ return buildJsonResource(uri.toString(), {
99
+ slug,
100
+ error: { code: err.code, message: err.message },
101
+ });
102
+ }
103
+ throw err;
104
+ }
105
+ });
106
+ registered.push('els://apps/{slug}/recent-critical');
107
+ // ─── els://logs/{traceId} ────────────────────────────────────────────────
108
+ server.registerResource('els-log-details', new ResourceTemplate('els://logs/{traceId}', { list: undefined }), {
109
+ title: 'Full error log details by traceId',
110
+ description: 'Identical payload to get_log_details (response_format=full).',
111
+ mimeType: 'application/json',
112
+ }, async (uri, variables) => {
113
+ const traceId = String(variables.traceId ?? '');
114
+ try {
115
+ const result = await handleGetLogDetails({ traceId, response_format: 'full' }, client);
116
+ return buildJsonResource(uri.toString(), extractStructured(result));
117
+ }
118
+ catch (err) {
119
+ if (err instanceof ToolError) {
120
+ return buildJsonResource(uri.toString(), {
121
+ traceId,
122
+ error: { code: err.code, message: err.message },
123
+ });
124
+ }
125
+ throw err;
126
+ }
127
+ });
128
+ registered.push('els://logs/{traceId}');
129
+ // ─── els://apps/{slug}/saved-queries (V2 placeholder) ────────────────────
130
+ server.registerResource('els-app-saved-queries', new ResourceTemplate('els://apps/{slug}/saved-queries', { list: undefined }), {
131
+ title: 'Saved JQL queries (not implemented yet)',
132
+ description: 'Placeholder for V2: saved JQL queries per app. Returns empty list with notImplemented marker until Phase 4.',
133
+ mimeType: 'application/json',
134
+ }, async (uri, variables) => {
135
+ const slug = String(variables.slug ?? '');
136
+ return buildJsonResource(uri.toString(), {
137
+ slug,
138
+ items: [],
139
+ _meta: {
140
+ notImplemented: true,
141
+ plannedFor: 'Phase 4 (post-GA)',
142
+ rationale: 'Saved queries are a UI feature in LK; MCP delivers in Phase 4 when JQL editor is stable.',
143
+ },
144
+ });
145
+ });
146
+ registered.push('els://apps/{slug}/saved-queries');
147
+ opts.log?.info?.({ resources: registered }, 'MCP resources registered');
148
+ return registered;
149
+ }
150
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { type Logger } from 'pino';
3
+ import type { Config } from './config.js';
4
+ import { ElsClient } from './elsClient.js';
5
+ import type { ToolContext, MiddlewareDeps } from './middleware/withMiddleware.js';
6
+ /**
7
+ * Создаёт McpServer, регистрирует tools, возвращает готовый объект.
8
+ *
9
+ * В Phase 1 transport подключается отдельно (stdio через cli.ts). В Phase 3
10
+ * добавится HTTP transport.
11
+ *
12
+ * Логи всегда идут в stderr (pino.destination(2)) — stdout зарезервирован
13
+ * для JSON-RPC.
14
+ */
15
+ export interface CreateMcpServerOptions {
16
+ config: Config;
17
+ log?: Logger;
18
+ /** Для тестов: использовать готовый ELS клиент вместо создания нового. */
19
+ client?: ElsClient;
20
+ /**
21
+ * Phase 5/6: opt-in contextProvider. Если задан — все tools будут обёрнуты
22
+ * в `withMiddleware` (quota + audit + usage + redaction).
23
+ */
24
+ contextProvider?: () => ToolContext;
25
+ /** Phase 5: middleware deps (audit/usage/redaction). */
26
+ middleware?: MiddlewareDeps;
27
+ }
28
+ export interface McpServerHandle {
29
+ server: McpServer;
30
+ client: ElsClient;
31
+ log: Logger;
32
+ registeredTools: string[];
33
+ registeredResources: string[];
34
+ registeredPrompts: string[];
35
+ }
36
+ export declare function createMcpServer(opts: CreateMcpServerOptions): McpServerHandle;
37
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAa,EAAE,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAI3C,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAElF;;;;;;;;GAQG;AAEH,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,WAAW,CAAC;IACpC,wDAAwD;IACxD,UAAU,CAAC,EAAE,cAAc,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,SAAS,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,sBAAsB,GAAG,eAAe,CA4C7E"}