@vreko/cli 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 (98) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +45 -0
  3. package/dist/CeremonyView-LQS7FTMK.js +134 -0
  4. package/dist/CeremonyView-LQS7FTMK.js.map +1 -0
  5. package/dist/InitApp-7K5DTYSW.js +1479 -0
  6. package/dist/InitApp-7K5DTYSW.js.map +1 -0
  7. package/dist/SkippedTestDetector-PJSKSOZR.js +7 -0
  8. package/dist/SkippedTestDetector-PJSKSOZR.js.map +1 -0
  9. package/dist/TuiApp-FX23XQBK.js +8 -0
  10. package/dist/TuiApp-FX23XQBK.js.map +1 -0
  11. package/dist/analysis-ABEO6RTN.js +8 -0
  12. package/dist/analysis-ABEO6RTN.js.map +1 -0
  13. package/dist/auth-XNBEBNPY.js +7669 -0
  14. package/dist/auth-XNBEBNPY.js.map +1 -0
  15. package/dist/ceremony-M7CXVBVA.js +45 -0
  16. package/dist/ceremony-M7CXVBVA.js.map +1 -0
  17. package/dist/chunk-A3QSZJPD.js +3147 -0
  18. package/dist/chunk-A3QSZJPD.js.map +1 -0
  19. package/dist/chunk-ASGZ5B6C.js +3969 -0
  20. package/dist/chunk-ASGZ5B6C.js.map +1 -0
  21. package/dist/chunk-DMXC2JTC.js +58 -0
  22. package/dist/chunk-DMXC2JTC.js.map +1 -0
  23. package/dist/chunk-EEBSK2IH.js +161 -0
  24. package/dist/chunk-EEBSK2IH.js.map +1 -0
  25. package/dist/chunk-EWOJGXRX.js +22 -0
  26. package/dist/chunk-EWOJGXRX.js.map +1 -0
  27. package/dist/chunk-F7GEJLP7.js +2389 -0
  28. package/dist/chunk-F7GEJLP7.js.map +1 -0
  29. package/dist/chunk-GOYL3F4T.js +605 -0
  30. package/dist/chunk-GOYL3F4T.js.map +1 -0
  31. package/dist/chunk-GRMRYWYS.js +17 -0
  32. package/dist/chunk-GRMRYWYS.js.map +1 -0
  33. package/dist/chunk-GSUGROXB.js +1951 -0
  34. package/dist/chunk-GSUGROXB.js.map +1 -0
  35. package/dist/chunk-H7773ONB.js +50 -0
  36. package/dist/chunk-H7773ONB.js.map +1 -0
  37. package/dist/chunk-HFQHU5LC.js +445 -0
  38. package/dist/chunk-HFQHU5LC.js.map +1 -0
  39. package/dist/chunk-IVHUBLJD.js +318 -0
  40. package/dist/chunk-IVHUBLJD.js.map +1 -0
  41. package/dist/chunk-KJWKY4L4.js +14 -0
  42. package/dist/chunk-KJWKY4L4.js.map +1 -0
  43. package/dist/chunk-MJVY2XUN.js +1793 -0
  44. package/dist/chunk-MJVY2XUN.js.map +1 -0
  45. package/dist/chunk-QWZVCJII.js +1797 -0
  46. package/dist/chunk-QWZVCJII.js.map +1 -0
  47. package/dist/chunk-VTSNRV3V.js +3237 -0
  48. package/dist/chunk-VTSNRV3V.js.map +1 -0
  49. package/dist/chunk-W5B4GTXR.js +1466 -0
  50. package/dist/chunk-W5B4GTXR.js.map +1 -0
  51. package/dist/chunk-WZEZLVOW.js +4995 -0
  52. package/dist/chunk-WZEZLVOW.js.map +1 -0
  53. package/dist/chunk-YPTTIXKC.js +199 -0
  54. package/dist/chunk-YPTTIXKC.js.map +1 -0
  55. package/dist/chunk-Z55UGM6X.js +6360 -0
  56. package/dist/chunk-Z55UGM6X.js.map +1 -0
  57. package/dist/chunk-ZIIRQODJ.js +110 -0
  58. package/dist/chunk-ZIIRQODJ.js.map +1 -0
  59. package/dist/chunk-ZSUQ4FMB.js +77 -0
  60. package/dist/chunk-ZSUQ4FMB.js.map +1 -0
  61. package/dist/client-JMTSZS3V.js +10 -0
  62. package/dist/client-JMTSZS3V.js.map +1 -0
  63. package/dist/deprecated-snap.js +19 -0
  64. package/dist/deprecated-snap.js.map +1 -0
  65. package/dist/dist-2KWBZFLA.js +14 -0
  66. package/dist/dist-2KWBZFLA.js.map +1 -0
  67. package/dist/dist-5ZYKNNU3.js +7 -0
  68. package/dist/dist-5ZYKNNU3.js.map +1 -0
  69. package/dist/dist-CP3RFHPI.js +11 -0
  70. package/dist/dist-CP3RFHPI.js.map +1 -0
  71. package/dist/gecko-53ITAGG6.js +56 -0
  72. package/dist/gecko-53ITAGG6.js.map +1 -0
  73. package/dist/guards-QAFC64NO.js +7 -0
  74. package/dist/guards-QAFC64NO.js.map +1 -0
  75. package/dist/index.js +57785 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/init-command-246JIVXM.js +7 -0
  78. package/dist/init-command-246JIVXM.js.map +1 -0
  79. package/dist/init-core-KAI7LCXZ.js +12 -0
  80. package/dist/init-core-KAI7LCXZ.js.map +1 -0
  81. package/dist/init-scan-RZNYDTUV.js +1919 -0
  82. package/dist/init-scan-RZNYDTUV.js.map +1 -0
  83. package/dist/local-service-adapter-6KNN6WQL.js +8 -0
  84. package/dist/local-service-adapter-6KNN6WQL.js.map +1 -0
  85. package/dist/secure-credentials-JXWAQLS2.js +306 -0
  86. package/dist/secure-credentials-JXWAQLS2.js.map +1 -0
  87. package/dist/tui-TPJPUS2R.js +111 -0
  88. package/dist/tui-TPJPUS2R.js.map +1 -0
  89. package/dist/vreko-dir-O3RLG7PI.js +8 -0
  90. package/dist/vreko-dir-O3RLG7PI.js.map +1 -0
  91. package/package.json +132 -0
  92. package/scripts/check-banned-words.ts +152 -0
  93. package/scripts/hooks/posttooluse-file-notify.sh +108 -0
  94. package/scripts/hooks/pretooluse-fragile-guard.sh +82 -0
  95. package/scripts/post-install-notice.js +24 -0
  96. package/scripts/postinstall.mjs +84 -0
  97. package/scripts/preuninstall.mjs +34 -0
  98. package/scripts/verify-jsx-transform.mjs +55 -0
@@ -0,0 +1,605 @@
1
+ #!/usr/bin/env node
2
+ import { __name, __export, __require } from './chunk-EWOJGXRX.js';
3
+ import pino from 'pino';
4
+ import { LRUCache } from 'lru-cache';
5
+ import os from 'os';
6
+ import chokidar from 'chokidar';
7
+ import CircuitBreaker from 'opossum';
8
+ import PQueue from 'p-queue';
9
+ import pRetry, { AbortError } from 'p-retry';
10
+
11
+ process.env.VREKO_CLI='true';process.env.NODE_NO_WARNINGS='1';
12
+ var MCP_QUIET = process.env.MCP_QUIET === "1" || process.env.MCP_QUIET === "true";
13
+ var isProduction = process.env.NODE_ENV === "production";
14
+ var isTest = process.env.NODE_ENV === "test" || process.env.VITEST === "true";
15
+ var isVSCodeExtension = process.env.VSCODE_EXTENSION === "true";
16
+ var isNextJS = typeof process.env.NEXT_RUNTIME !== "undefined" || typeof process.env.__NEXT_PRIVATE_ORIGIN !== "undefined";
17
+ var isBundled = typeof process.env.VREKO_BUNDLED !== "undefined" || // Check if we're running from a bundled location (dist/server with no source)
18
+ typeof __dirname === "string" && !__dirname.includes("node_modules") && !__dirname.includes("packages/");
19
+ var serviceName = process.env.SERVICE_NAME || process.env.npm_package_name || "app";
20
+ var redactPaths = [
21
+ "user.email",
22
+ "user.password",
23
+ "apiKey",
24
+ "session.token",
25
+ "req.headers.authorization",
26
+ "auth.*.password",
27
+ "config.*.secret",
28
+ "env.*",
29
+ "password",
30
+ "token",
31
+ "secret",
32
+ "authorization",
33
+ "cookie",
34
+ "*.password",
35
+ "*.token",
36
+ "*.apiKey",
37
+ "*.secret",
38
+ "*.authorization",
39
+ "*.cookie",
40
+ "*.path",
41
+ "*.file",
42
+ "*.filePath"
43
+ ];
44
+ function traceContextMixin() {
45
+ try {
46
+ const api = __require("@opentelemetry/api");
47
+ const span = api.trace.getSpan(api.context.active());
48
+ if (span) {
49
+ const ctx = span.spanContext();
50
+ return {
51
+ trace_id: ctx.traceId,
52
+ span_id: ctx.spanId
53
+ };
54
+ }
55
+ } catch {
56
+ }
57
+ return {};
58
+ }
59
+ __name(traceContextMixin, "traceContextMixin");
60
+ var pinoLogger = pino({
61
+ // When MCP_QUIET=1, set level to 'silent' to suppress all output
62
+ level: MCP_QUIET ? "silent" : process.env.LOG_LEVEL || "info",
63
+ redact: {
64
+ paths: redactPaths,
65
+ censor: "[REDACTED]"
66
+ },
67
+ // Add service name as base context for terminal multiplexer clarity
68
+ base: {
69
+ service: serviceName
70
+ },
71
+ // Inject trace context into every log line
72
+ mixin: traceContextMixin,
73
+ // Only use transport in non-production AND non-VSCode AND non-Next.js AND non-test environments
74
+ // pino-pretty uses worker threads which fail in Next.js bundled contexts and vitest
75
+ // Also disable in bundled mode (MCPB) where worker threads don't work
76
+ ...isProduction || isTest || isVSCodeExtension || MCP_QUIET || isNextJS || isBundled ? {} : {
77
+ transport: {
78
+ target: "pino-pretty",
79
+ options: {
80
+ colorize: true,
81
+ translateTime: "SYS:HH:MM:ss.l",
82
+ ignore: "pid,hostname,service",
83
+ // Show service name in message prefix for terminal clarity
84
+ messageFormat: "[{service}] {msg}",
85
+ // Include trace context in output - this is your "local Grafana"
86
+ // trace_id will appear inline when OTel is active
87
+ include: "level,time,trace_id,span_id",
88
+ // Single line for better terminal readability
89
+ singleLine: true,
90
+ // Custom colors for level differentiation
91
+ levelColors: {
92
+ trace: "gray",
93
+ debug: "cyan",
94
+ info: "green",
95
+ warn: "yellow",
96
+ error: "red",
97
+ fatal: "bgRed"
98
+ }
99
+ }
100
+ }
101
+ }
102
+ }, pino.destination({
103
+ fd: 2
104
+ }));
105
+ var logger = {
106
+ debug: /* @__PURE__ */ __name((messageOrObj, metaOrMsg) => {
107
+ if (typeof messageOrObj === "string" && (!metaOrMsg || typeof metaOrMsg === "object")) {
108
+ if (metaOrMsg) {
109
+ pinoLogger.debug(metaOrMsg, messageOrObj);
110
+ } else {
111
+ pinoLogger.debug(messageOrObj);
112
+ }
113
+ } else if (typeof messageOrObj === "object" && typeof metaOrMsg === "string") {
114
+ pinoLogger.debug(messageOrObj, metaOrMsg);
115
+ }
116
+ }, "debug"),
117
+ info: /* @__PURE__ */ __name((messageOrObj, metaOrMsg) => {
118
+ if (typeof messageOrObj === "string" && (!metaOrMsg || typeof metaOrMsg === "object")) {
119
+ if (metaOrMsg) {
120
+ pinoLogger.info(metaOrMsg, messageOrObj);
121
+ } else {
122
+ pinoLogger.info(messageOrObj);
123
+ }
124
+ } else if (typeof messageOrObj === "object" && typeof metaOrMsg === "string") {
125
+ pinoLogger.info(messageOrObj, metaOrMsg);
126
+ }
127
+ }, "info"),
128
+ warn: /* @__PURE__ */ __name((messageOrObj, metaOrMsg) => {
129
+ if (typeof messageOrObj === "string" && (!metaOrMsg || typeof metaOrMsg === "object")) {
130
+ if (metaOrMsg) {
131
+ pinoLogger.warn(metaOrMsg, messageOrObj);
132
+ } else {
133
+ pinoLogger.warn(messageOrObj);
134
+ }
135
+ } else if (typeof messageOrObj === "object" && typeof metaOrMsg === "string") {
136
+ pinoLogger.warn(messageOrObj, metaOrMsg);
137
+ }
138
+ }, "warn"),
139
+ error: /* @__PURE__ */ __name((messageOrObj, metaOrMsg) => {
140
+ if (typeof messageOrObj === "string" && (!metaOrMsg || typeof metaOrMsg !== "string")) {
141
+ if (metaOrMsg) {
142
+ pinoLogger.error(metaOrMsg, messageOrObj);
143
+ } else {
144
+ pinoLogger.error(messageOrObj);
145
+ }
146
+ } else if (typeof messageOrObj === "object" && typeof metaOrMsg === "string") {
147
+ pinoLogger.error(messageOrObj, metaOrMsg);
148
+ }
149
+ }, "error"),
150
+ // Child method for creating scoped loggers
151
+ child: /* @__PURE__ */ __name((bindings) => {
152
+ const childLogger = pinoLogger.child(bindings);
153
+ return {
154
+ debug: /* @__PURE__ */ __name((messageOrObj, metaOrMsg) => {
155
+ if (typeof messageOrObj === "string" && (!metaOrMsg || typeof metaOrMsg === "object")) {
156
+ if (metaOrMsg) {
157
+ childLogger.debug(metaOrMsg, messageOrObj);
158
+ } else {
159
+ childLogger.debug(messageOrObj);
160
+ }
161
+ } else if (typeof messageOrObj === "object" && typeof metaOrMsg === "string") {
162
+ childLogger.debug(messageOrObj, metaOrMsg);
163
+ }
164
+ }, "debug"),
165
+ info: /* @__PURE__ */ __name((messageOrObj, metaOrMsg) => {
166
+ if (typeof messageOrObj === "string" && (!metaOrMsg || typeof metaOrMsg === "object")) {
167
+ if (metaOrMsg) {
168
+ childLogger.info(metaOrMsg, messageOrObj);
169
+ } else {
170
+ childLogger.info(messageOrObj);
171
+ }
172
+ } else if (typeof messageOrObj === "object" && typeof metaOrMsg === "string") {
173
+ childLogger.info(messageOrObj, metaOrMsg);
174
+ }
175
+ }, "info"),
176
+ warn: /* @__PURE__ */ __name((messageOrObj, metaOrMsg) => {
177
+ if (typeof messageOrObj === "string" && (!metaOrMsg || typeof metaOrMsg === "object")) {
178
+ if (metaOrMsg) {
179
+ childLogger.warn(metaOrMsg, messageOrObj);
180
+ } else {
181
+ childLogger.warn(messageOrObj);
182
+ }
183
+ } else if (typeof messageOrObj === "object" && typeof metaOrMsg === "string") {
184
+ childLogger.warn(messageOrObj, metaOrMsg);
185
+ }
186
+ }, "warn"),
187
+ error: /* @__PURE__ */ __name((messageOrObj, metaOrMsg) => {
188
+ if (typeof messageOrObj === "string" && (!metaOrMsg || typeof metaOrMsg !== "string")) {
189
+ if (metaOrMsg) {
190
+ childLogger.error(metaOrMsg, messageOrObj);
191
+ } else {
192
+ childLogger.error(messageOrObj);
193
+ }
194
+ } else if (typeof messageOrObj === "object" && typeof metaOrMsg === "string") {
195
+ childLogger.error(messageOrObj, metaOrMsg);
196
+ }
197
+ }, "error"),
198
+ level: childLogger.level,
199
+ child: /* @__PURE__ */ __name((nestedBindings) => logger.child({
200
+ ...bindings,
201
+ ...nestedBindings
202
+ }), "child")
203
+ };
204
+ }, "child")
205
+ };
206
+
207
+ // ../../packages/infrastructure/dist/cache/index.js
208
+ var cache_exports = {};
209
+ __export(cache_exports, {
210
+ cacheDefaults: () => cacheDefaults,
211
+ clearDocCache: () => clearDocCache,
212
+ dashboardCache: () => dashboardCache,
213
+ docCache: () => docCache,
214
+ getDashboardCached: () => getDashboardCached,
215
+ getLibraryDocsCached: () => getLibraryDocsCached,
216
+ getLibraryDocsCachedWithHint: () => getLibraryDocsCachedWithHint,
217
+ invalidateDashboardCache: () => invalidateDashboardCache
218
+ });
219
+ var cacheDefaults = {
220
+ mcp: {
221
+ cache: {
222
+ maxEntries: 500,
223
+ ttlMs: 60 * 60 * 1e3
224
+ }
225
+ },
226
+ dashboard: {
227
+ cache: {
228
+ maxEntries: 1e3,
229
+ defaultTtlMs: 5 * 60 * 1e3
230
+ }
231
+ }
232
+ };
233
+ var docCache = new LRUCache({
234
+ max: cacheDefaults.mcp.cache.maxEntries,
235
+ ttl: cacheDefaults.mcp.cache.ttlMs,
236
+ allowStale: true,
237
+ updateAgeOnGet: true
238
+ });
239
+ function clearDocCache() {
240
+ docCache.clear();
241
+ }
242
+ __name(clearDocCache, "clearDocCache");
243
+ var dashboardCache = new LRUCache({
244
+ max: cacheDefaults.dashboard.cache.maxEntries,
245
+ ttl: cacheDefaults.dashboard.cache.defaultTtlMs,
246
+ allowStale: true,
247
+ updateAgeOnGet: true
248
+ });
249
+ async function getLibraryDocsCached(key, fetcher, ttlMs) {
250
+ const hit = docCache.get(key);
251
+ if (hit) {
252
+ logger.debug(`Cache hit for key: ${key}`);
253
+ return hit;
254
+ }
255
+ try {
256
+ logger.debug(`Cache miss for key: ${key}, fetching data`);
257
+ const value = await fetcher();
258
+ if (ttlMs) {
259
+ docCache.set(key, value, {
260
+ ttl: ttlMs
261
+ });
262
+ } else {
263
+ docCache.set(key, value);
264
+ }
265
+ return value;
266
+ } catch (error) {
267
+ logger.error({
268
+ error
269
+ }, `Failed to fetch data for cache key: ${key}`);
270
+ throw error;
271
+ }
272
+ }
273
+ __name(getLibraryDocsCached, "getLibraryDocsCached");
274
+ async function getLibraryDocsCachedWithHint(cacheKey, ttlMs, fetcher) {
275
+ if (cacheKey) {
276
+ return await getLibraryDocsCached(cacheKey, fetcher, ttlMs);
277
+ }
278
+ return await fetcher();
279
+ }
280
+ __name(getLibraryDocsCachedWithHint, "getLibraryDocsCachedWithHint");
281
+ async function getDashboardCached(key, fetcher, ttlMs) {
282
+ const hit = dashboardCache.get(key);
283
+ if (hit) {
284
+ logger.debug(`Dashboard cache hit for key: ${key}`);
285
+ return hit;
286
+ }
287
+ try {
288
+ logger.debug(`Dashboard cache miss for key: ${key}, fetching data`);
289
+ const value = await fetcher();
290
+ dashboardCache.set(key, value, {
291
+ ttl: ttlMs ?? cacheDefaults.dashboard.cache.defaultTtlMs
292
+ });
293
+ return value;
294
+ } catch (error) {
295
+ logger.error({
296
+ error
297
+ }, `Failed to fetch dashboard data for cache key: ${key}`);
298
+ throw error;
299
+ }
300
+ }
301
+ __name(getDashboardCached, "getDashboardCached");
302
+ function invalidateDashboardCache(pattern) {
303
+ const keysToDelete = [];
304
+ for (const key of dashboardCache.keys()) {
305
+ if (key.includes(pattern)) {
306
+ keysToDelete.push(key);
307
+ }
308
+ }
309
+ for (const key of keysToDelete) {
310
+ dashboardCache.delete(key);
311
+ }
312
+ logger.info(`Invalidated ${keysToDelete.length} dashboard cache entries matching pattern: ${pattern}`);
313
+ }
314
+ __name(invalidateDashboardCache, "invalidateDashboardCache");
315
+ var watcherDefaults = {
316
+ watcher: {
317
+ awaitWriteFinish: {
318
+ stabilityThreshold: 200,
319
+ pollInterval: 50
320
+ },
321
+ ignored: [
322
+ "**/{node_modules,.git,.vscode,dist,.next,.nuxt,coverage}/**"
323
+ ]
324
+ }
325
+ };
326
+ function makeWatcher(root) {
327
+ os.platform() === "darwin";
328
+ return chokidar.watch(root, {
329
+ ignoreInitial: true,
330
+ ignored: [
331
+ ...watcherDefaults.watcher.ignored
332
+ ],
333
+ awaitWriteFinish: watcherDefaults.watcher.awaitWriteFinish,
334
+ ignorePermissionErrors: true,
335
+ depth: 10
336
+ });
337
+ }
338
+ __name(makeWatcher, "makeWatcher");
339
+
340
+ // ../../packages/infrastructure/dist/resiliency/index.js
341
+ var resiliency_exports = {};
342
+ __export(resiliency_exports, {
343
+ AbortError: () => AbortError,
344
+ RetryPresets: () => RetryPresets,
345
+ batchCall: () => batchCall,
346
+ calculateBackoff: () => calculateBackoff,
347
+ callTool: () => callTool,
348
+ clearCircuitBreakers: () => clearCircuitBreakers,
349
+ getCircuitBreakerState: () => getCircuitBreakerState,
350
+ resilienceDefaults: () => resilienceDefaults,
351
+ withBreaker: () => withBreaker,
352
+ withRetry: () => withRetry
353
+ });
354
+ function sanitizeError(error) {
355
+ const message = error instanceof Error ? error.message : String(error);
356
+ return message.replace(/api[_-]?key[=:]\s*["']?\S+["']?/gi, "api_key=[REDACTED]").replace(/token[=:]\s*["']?\S+["']?/gi, "token=[REDACTED]").replace(/password[=:]\s*["']?\S+["']?/gi, "password=[REDACTED]").replace(/bearer\s+\S+/gi, "Bearer [REDACTED]").replace(/authorization[=:]\s*["']?\S+["']?/gi, "authorization=[REDACTED]").replace(/secret[=:]\s*["']?\S+["']?/gi, "secret=[REDACTED]").replace(/credential[s]?[=:]\s*["']?\S+["']?/gi, "credentials=[REDACTED]");
357
+ }
358
+ __name(sanitizeError, "sanitizeError");
359
+ var resilienceDefaults = {
360
+ mcp: {
361
+ timeoutMs: 5e3,
362
+ maxConcurrent: 4,
363
+ retry: {
364
+ maxAttempts: 2,
365
+ baseDelayMs: 250,
366
+ maxDelayMs: 1500,
367
+ jitter: true
368
+ },
369
+ circuit: {
370
+ enabled: true,
371
+ errorThresholdPercentage: 50,
372
+ volumeThreshold: 10,
373
+ timeoutMs: 5e3,
374
+ resetMs: 3e4,
375
+ rollingCountMs: 6e4,
376
+ rollingCountBuckets: 6
377
+ },
378
+ batch: {
379
+ size: 5,
380
+ maxWaitMs: 150
381
+ }
382
+ }
383
+ };
384
+ var circuitBreakers = /* @__PURE__ */ new Map();
385
+ function withBreaker(toolName, fn, cfg = resilienceDefaults.mcp.circuit) {
386
+ if (!circuitBreakers.has(toolName)) {
387
+ const br2 = new CircuitBreaker(async (input) => fn(input), {
388
+ timeout: cfg.timeoutMs,
389
+ errorThresholdPercentage: cfg.errorThresholdPercentage,
390
+ resetTimeout: cfg.resetMs,
391
+ rollingCountTimeout: cfg.rollingCountMs,
392
+ rollingCountBuckets: cfg.rollingCountBuckets,
393
+ volumeThreshold: cfg.volumeThreshold
394
+ });
395
+ br2.on("open", () => {
396
+ logger.warn(`Circuit breaker opened for tool: ${toolName}`, {
397
+ tool: toolName,
398
+ state: "open",
399
+ stats: br2.stats
400
+ });
401
+ });
402
+ br2.on("halfOpen", () => {
403
+ logger.warn(`Circuit breaker half-open for tool: ${toolName}`, {
404
+ tool: toolName,
405
+ state: "half-open",
406
+ stats: br2.stats
407
+ });
408
+ });
409
+ br2.on("close", () => {
410
+ logger.info(`Circuit breaker closed for tool: ${toolName}`, {
411
+ tool: toolName,
412
+ state: "closed",
413
+ stats: br2.stats
414
+ });
415
+ });
416
+ br2.on("success", () => {
417
+ logger.debug(`Circuit breaker success for tool: ${toolName}`, {
418
+ tool: toolName,
419
+ event: "success",
420
+ successes: br2.stats.successes,
421
+ failures: br2.stats.failures
422
+ });
423
+ });
424
+ br2.on("failure", (error) => {
425
+ logger.warn(`Circuit breaker failure for tool: ${toolName}`, {
426
+ tool: toolName,
427
+ event: "failure",
428
+ error: sanitizeError(error),
429
+ successes: br2.stats.successes,
430
+ failures: br2.stats.failures
431
+ });
432
+ });
433
+ br2.on("timeout", () => {
434
+ logger.warn(`Circuit breaker timeout for tool: ${toolName}`, {
435
+ tool: toolName,
436
+ event: "timeout",
437
+ timeoutMs: cfg.timeoutMs
438
+ });
439
+ });
440
+ br2.on("reject", () => {
441
+ logger.warn(`Circuit breaker rejected call for tool: ${toolName}`, {
442
+ tool: toolName,
443
+ event: "reject",
444
+ state: br2.opened ? "open" : br2.halfOpen ? "half-open" : "closed"
445
+ });
446
+ });
447
+ circuitBreakers.set(toolName, br2);
448
+ }
449
+ const br = circuitBreakers.get(toolName);
450
+ if (!br) {
451
+ throw new Error(`Circuit breaker not found for tool: ${toolName}`);
452
+ }
453
+ return (input) => br.fire(input);
454
+ }
455
+ __name(withBreaker, "withBreaker");
456
+ function getCircuitBreakerState(toolName) {
457
+ const br = circuitBreakers.get(toolName);
458
+ if (!br) {
459
+ return null;
460
+ }
461
+ return {
462
+ isOpen: br.opened,
463
+ isHalfOpen: br.halfOpen,
464
+ isClosed: br.closed
465
+ };
466
+ }
467
+ __name(getCircuitBreakerState, "getCircuitBreakerState");
468
+ function clearCircuitBreakers() {
469
+ circuitBreakers.clear();
470
+ }
471
+ __name(clearCircuitBreakers, "clearCircuitBreakers");
472
+ var RetryPresets = {
473
+ /** Fast retries for network requests (max 5s delay) */
474
+ network: {
475
+ maxAttempts: 3,
476
+ baseDelayMs: 1e3,
477
+ maxDelayMs: 5e3,
478
+ jitter: true
479
+ },
480
+ /** Medium retries for API calls (max 30s delay) */
481
+ api: {
482
+ maxAttempts: 5,
483
+ baseDelayMs: 2e3,
484
+ maxDelayMs: 3e4,
485
+ jitter: true
486
+ },
487
+ /** Aggressive retries for critical operations (max 1min delay) */
488
+ critical: {
489
+ maxAttempts: 10,
490
+ baseDelayMs: 1e3,
491
+ maxDelayMs: 6e4,
492
+ jitter: true
493
+ },
494
+ /** Quick retries for fast operations (max 2s delay) */
495
+ fast: {
496
+ maxAttempts: 3,
497
+ baseDelayMs: 100,
498
+ maxDelayMs: 2e3,
499
+ jitter: false
500
+ }
501
+ };
502
+ async function withRetry(operation, options) {
503
+ const { maxAttempts, baseDelayMs, maxDelayMs = 3e4, jitter = false, onRetry, shouldRetry } = options;
504
+ return pRetry(operation, {
505
+ retries: maxAttempts,
506
+ minTimeout: baseDelayMs,
507
+ maxTimeout: maxDelayMs,
508
+ randomize: jitter,
509
+ onFailedAttempt: /* @__PURE__ */ __name((error) => {
510
+ if (shouldRetry && !shouldRetry(error)) {
511
+ throw error;
512
+ }
513
+ if (onRetry) {
514
+ onRetry(error, error.attemptNumber);
515
+ }
516
+ }, "onFailedAttempt")
517
+ });
518
+ }
519
+ __name(withRetry, "withRetry");
520
+ function calculateBackoff(attempt, baseMs, maxMs, jitter) {
521
+ const exponential = baseMs * 2 ** (attempt - 1);
522
+ const capped = Math.min(exponential, maxMs);
523
+ if (jitter) {
524
+ const jitterAmount = Math.random() * capped;
525
+ return capped + jitterAmount;
526
+ }
527
+ return capped;
528
+ }
529
+ __name(calculateBackoff, "calculateBackoff");
530
+
531
+ // ../../packages/infrastructure/dist/resiliency/concurrency.js
532
+ var queue = new PQueue({
533
+ concurrency: resilienceDefaults.mcp.maxConcurrent
534
+ });
535
+ var batchQueues = /* @__PURE__ */ new Map();
536
+ var callTool = /* @__PURE__ */ __name((name, raw) => {
537
+ const wrapped = withBreaker(name, raw);
538
+ return (input) => queue.add(() => withRetry(() => wrapped(input), {
539
+ maxAttempts: resilienceDefaults.mcp.retry.maxAttempts,
540
+ baseDelayMs: resilienceDefaults.mcp.retry.baseDelayMs,
541
+ maxDelayMs: resilienceDefaults.mcp.retry.maxDelayMs,
542
+ jitter: resilienceDefaults.mcp.retry.jitter,
543
+ onRetry: /* @__PURE__ */ __name((e, n) => logger.warn({
544
+ error: e
545
+ }, `Retrying tool ${name} attempt ${n}: ${e.message}`), "onRetry")
546
+ }));
547
+ }, "callTool");
548
+ async function batchCall(batchKey, input, processor) {
549
+ if (!batchQueues.has(batchKey)) {
550
+ batchQueues.set(batchKey, []);
551
+ }
552
+ const queue2 = batchQueues.get(batchKey);
553
+ if (!queue2) {
554
+ throw new Error(`Batch queue not found for key: ${batchKey}`);
555
+ }
556
+ return new Promise((resolve, reject) => {
557
+ queue2.push({
558
+ input,
559
+ resolve,
560
+ reject
561
+ });
562
+ if (queue2.length >= resilienceDefaults.mcp.batch.size) {
563
+ processBatch(batchKey, processor);
564
+ return;
565
+ }
566
+ setTimeout(() => {
567
+ const queue3 = batchQueues.get(batchKey);
568
+ if (queue3 && queue3.length > 0) {
569
+ processBatch(batchKey, processor);
570
+ }
571
+ }, resilienceDefaults.mcp.batch.maxWaitMs);
572
+ });
573
+ }
574
+ __name(batchCall, "batchCall");
575
+ async function processBatch(batchKey, processor) {
576
+ const queue2 = batchQueues.get(batchKey);
577
+ if (!queue2 || queue2.length === 0) {
578
+ return;
579
+ }
580
+ const batch = queue2.splice(0, resilienceDefaults.mcp.batch.size);
581
+ const inputs = batch.map((item) => item.input);
582
+ try {
583
+ logger.debug(`Processing batch of ${inputs.length} requests for ${batchKey}`);
584
+ const results = await processor(inputs);
585
+ batch.forEach((item, index) => {
586
+ if (index < results.length) {
587
+ item.resolve(results[index]);
588
+ } else {
589
+ item.reject(new Error(`No result for batch item ${index}`));
590
+ }
591
+ });
592
+ } catch (error) {
593
+ for (const item of batch) {
594
+ item.reject(error);
595
+ }
596
+ logger.error({
597
+ error
598
+ }, `Batch processing failed for ${batchKey}: ${error.message}`);
599
+ }
600
+ }
601
+ __name(processBatch, "processBatch");
602
+
603
+ export { cache_exports, getCircuitBreakerState, logger, makeWatcher, resiliency_exports, withBreaker };
604
+ //# sourceMappingURL=chunk-GOYL3F4T.js.map
605
+ //# sourceMappingURL=chunk-GOYL3F4T.js.map