driftdetect-mcp 0.4.0 → 0.4.2

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 (140) hide show
  1. package/dist/bin/server.d.ts +12 -2
  2. package/dist/bin/server.d.ts.map +1 -1
  3. package/dist/bin/server.js +25 -5
  4. package/dist/bin/server.js.map +1 -1
  5. package/dist/enterprise-server.d.ts +78 -0
  6. package/dist/enterprise-server.d.ts.map +1 -0
  7. package/dist/enterprise-server.js +201 -0
  8. package/dist/enterprise-server.js.map +1 -0
  9. package/dist/index.d.ts +15 -2
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +17 -1
  12. package/dist/index.js.map +1 -1
  13. package/dist/infrastructure/cache.d.ts +86 -0
  14. package/dist/infrastructure/cache.d.ts.map +1 -0
  15. package/dist/infrastructure/cache.js +271 -0
  16. package/dist/infrastructure/cache.js.map +1 -0
  17. package/dist/infrastructure/cursor-manager.d.ts +86 -0
  18. package/dist/infrastructure/cursor-manager.d.ts.map +1 -0
  19. package/dist/infrastructure/cursor-manager.js +175 -0
  20. package/dist/infrastructure/cursor-manager.js.map +1 -0
  21. package/dist/infrastructure/error-handler.d.ts +82 -0
  22. package/dist/infrastructure/error-handler.d.ts.map +1 -0
  23. package/dist/infrastructure/error-handler.js +226 -0
  24. package/dist/infrastructure/error-handler.js.map +1 -0
  25. package/dist/infrastructure/index.d.ts +19 -0
  26. package/dist/infrastructure/index.d.ts.map +1 -0
  27. package/dist/infrastructure/index.js +26 -0
  28. package/dist/infrastructure/index.js.map +1 -0
  29. package/dist/infrastructure/metrics.d.ts +104 -0
  30. package/dist/infrastructure/metrics.d.ts.map +1 -0
  31. package/dist/infrastructure/metrics.js +291 -0
  32. package/dist/infrastructure/metrics.js.map +1 -0
  33. package/dist/infrastructure/rate-limiter.d.ts +59 -0
  34. package/dist/infrastructure/rate-limiter.d.ts.map +1 -0
  35. package/dist/infrastructure/rate-limiter.js +132 -0
  36. package/dist/infrastructure/rate-limiter.js.map +1 -0
  37. package/dist/infrastructure/response-builder.d.ts +104 -0
  38. package/dist/infrastructure/response-builder.d.ts.map +1 -0
  39. package/dist/infrastructure/response-builder.js +207 -0
  40. package/dist/infrastructure/response-builder.js.map +1 -0
  41. package/dist/infrastructure/token-estimator.d.ts +48 -0
  42. package/dist/infrastructure/token-estimator.d.ts.map +1 -0
  43. package/dist/infrastructure/token-estimator.js +131 -0
  44. package/dist/infrastructure/token-estimator.js.map +1 -0
  45. package/dist/server.d.ts.map +1 -1
  46. package/dist/server.js +1074 -17
  47. package/dist/server.js.map +1 -1
  48. package/dist/tools/detail/code-examples.d.ts +33 -0
  49. package/dist/tools/detail/code-examples.d.ts.map +1 -0
  50. package/dist/tools/detail/code-examples.js +126 -0
  51. package/dist/tools/detail/code-examples.js.map +1 -0
  52. package/dist/tools/detail/dna-check.d.ts +32 -0
  53. package/dist/tools/detail/dna-check.d.ts.map +1 -0
  54. package/dist/tools/detail/dna-check.js +231 -0
  55. package/dist/tools/detail/dna-check.js.map +1 -0
  56. package/dist/tools/detail/dna-profile.d.ts +37 -0
  57. package/dist/tools/detail/dna-profile.d.ts.map +1 -0
  58. package/dist/tools/detail/dna-profile.js +101 -0
  59. package/dist/tools/detail/dna-profile.js.map +1 -0
  60. package/dist/tools/detail/file-patterns.d.ts +39 -0
  61. package/dist/tools/detail/file-patterns.d.ts.map +1 -0
  62. package/dist/tools/detail/file-patterns.js +103 -0
  63. package/dist/tools/detail/file-patterns.js.map +1 -0
  64. package/dist/tools/detail/files-list.d.ts +30 -0
  65. package/dist/tools/detail/files-list.d.ts.map +1 -0
  66. package/dist/tools/detail/files-list.js +99 -0
  67. package/dist/tools/detail/files-list.js.map +1 -0
  68. package/dist/tools/detail/impact-analysis.d.ts +53 -0
  69. package/dist/tools/detail/impact-analysis.d.ts.map +1 -0
  70. package/dist/tools/detail/impact-analysis.js +130 -0
  71. package/dist/tools/detail/impact-analysis.js.map +1 -0
  72. package/dist/tools/detail/index.d.ts +23 -0
  73. package/dist/tools/detail/index.d.ts.map +1 -0
  74. package/dist/tools/detail/index.js +200 -0
  75. package/dist/tools/detail/index.js.map +1 -0
  76. package/dist/tools/detail/pattern-get.d.ts +45 -0
  77. package/dist/tools/detail/pattern-get.d.ts.map +1 -0
  78. package/dist/tools/detail/pattern-get.js +87 -0
  79. package/dist/tools/detail/pattern-get.js.map +1 -0
  80. package/dist/tools/detail/reachability.d.ts +60 -0
  81. package/dist/tools/detail/reachability.d.ts.map +1 -0
  82. package/dist/tools/detail/reachability.js +168 -0
  83. package/dist/tools/detail/reachability.js.map +1 -0
  84. package/dist/tools/discovery/capabilities.d.ts +28 -0
  85. package/dist/tools/discovery/capabilities.d.ts.map +1 -0
  86. package/dist/tools/discovery/capabilities.js +112 -0
  87. package/dist/tools/discovery/capabilities.js.map +1 -0
  88. package/dist/tools/discovery/index.d.ts +13 -0
  89. package/dist/tools/discovery/index.d.ts.map +1 -0
  90. package/dist/tools/discovery/index.js +30 -0
  91. package/dist/tools/discovery/index.js.map +1 -0
  92. package/dist/tools/discovery/projects.d.ts +26 -0
  93. package/dist/tools/discovery/projects.d.ts.map +1 -0
  94. package/dist/tools/discovery/projects.js +210 -0
  95. package/dist/tools/discovery/projects.js.map +1 -0
  96. package/dist/tools/discovery/status.d.ts +42 -0
  97. package/dist/tools/discovery/status.d.ts.map +1 -0
  98. package/dist/tools/discovery/status.js +157 -0
  99. package/dist/tools/discovery/status.js.map +1 -0
  100. package/dist/tools/exploration/contracts-list.d.ts +35 -0
  101. package/dist/tools/exploration/contracts-list.d.ts.map +1 -0
  102. package/dist/tools/exploration/contracts-list.js +106 -0
  103. package/dist/tools/exploration/contracts-list.js.map +1 -0
  104. package/dist/tools/exploration/files-list.d.ts +29 -0
  105. package/dist/tools/exploration/files-list.d.ts.map +1 -0
  106. package/dist/tools/exploration/files-list.js +94 -0
  107. package/dist/tools/exploration/files-list.js.map +1 -0
  108. package/dist/tools/exploration/index.d.ts +17 -0
  109. package/dist/tools/exploration/index.d.ts.map +1 -0
  110. package/dist/tools/exploration/index.js +126 -0
  111. package/dist/tools/exploration/index.js.map +1 -0
  112. package/dist/tools/exploration/patterns-list.d.ts +40 -0
  113. package/dist/tools/exploration/patterns-list.d.ts.map +1 -0
  114. package/dist/tools/exploration/patterns-list.js +172 -0
  115. package/dist/tools/exploration/patterns-list.js.map +1 -0
  116. package/dist/tools/exploration/security-summary.d.ts +49 -0
  117. package/dist/tools/exploration/security-summary.d.ts.map +1 -0
  118. package/dist/tools/exploration/security-summary.js +111 -0
  119. package/dist/tools/exploration/security-summary.js.map +1 -0
  120. package/dist/tools/exploration/trends.d.ts +49 -0
  121. package/dist/tools/exploration/trends.d.ts.map +1 -0
  122. package/dist/tools/exploration/trends.js +147 -0
  123. package/dist/tools/exploration/trends.js.map +1 -0
  124. package/dist/tools/index.d.ts +13 -0
  125. package/dist/tools/index.d.ts.map +1 -0
  126. package/dist/tools/index.js +13 -0
  127. package/dist/tools/index.js.map +1 -0
  128. package/dist/tools/orchestration/context.d.ts +72 -0
  129. package/dist/tools/orchestration/context.d.ts.map +1 -0
  130. package/dist/tools/orchestration/context.js +499 -0
  131. package/dist/tools/orchestration/context.js.map +1 -0
  132. package/dist/tools/orchestration/index.d.ts +11 -0
  133. package/dist/tools/orchestration/index.d.ts.map +1 -0
  134. package/dist/tools/orchestration/index.js +56 -0
  135. package/dist/tools/orchestration/index.js.map +1 -0
  136. package/dist/tools/registry.d.ts +41 -0
  137. package/dist/tools/registry.d.ts.map +1 -0
  138. package/dist/tools/registry.js +64 -0
  139. package/dist/tools/registry.js.map +1 -0
  140. package/package.json +3 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/infrastructure/metrics.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA+BH,MAAM,OAAO,gBAAgB;IACnB,QAAQ,GAAwB,IAAI,GAAG,EAAE,CAAC;IAC1C,MAAM,GAAwB,IAAI,GAAG,EAAE,CAAC;IACxC,UAAU,GAAkC,IAAI,GAAG,EAAE,CAAC;IACtD,OAAO,GAAa,EAAE,CAAC;IACvB,UAAU,GAAW,KAAK,CAAC;IAEnC;;OAEG;IACH,SAAS,CAAC,IAAY,EAAE,SAAuB,EAAE,EAAE,QAAgB,CAAC;QAClE,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,GAAG,KAAK,CAAC,CAAC;QAExC,IAAI,CAAC,YAAY,CAAC;YAChB,IAAI;YACJ,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,OAAO,GAAG,KAAK;YACtB,MAAM;YACN,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAY,EAAE,KAAa,EAAE,SAAuB,EAAE;QAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAE5B,IAAI,CAAC,YAAY,CAAC;YAChB,IAAI;YACJ,IAAI,EAAE,OAAO;YACb,KAAK;YACL,MAAM;YACN,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,IAAY,EAAE,KAAa,EAAE,SAAuB,EAAE;QAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAEvC,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACpC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACpC,CAAC;QAED,iBAAiB;QACjB,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,KAAK,IAAI,GAAG;YAAE,OAAO,CAAC,MAAM,EAAE,CAAC;QACnC,IAAI,KAAK,IAAI,GAAG;YAAE,OAAO,CAAC,MAAM,EAAE,CAAC;QACnC,IAAI,KAAK,IAAI,GAAG;YAAE,OAAO,CAAC,MAAM,EAAE,CAAC;QACnC,IAAI,KAAK,IAAI,IAAI;YAAE,OAAO,CAAC,OAAO,EAAE,CAAC;QACrC,IAAI,KAAK,IAAI,IAAI;YAAE,OAAO,CAAC,OAAO,EAAE,CAAC;QACrC,IAAI,KAAK,IAAI,IAAI;YAAE,OAAO,CAAC,OAAO,EAAE,CAAC;QACrC,OAAO,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,IAAI,KAAK,CAAC;QACrB,OAAO,CAAC,KAAK,EAAE,CAAC;QAEhB,IAAI,CAAC,YAAY,CAAC;YAChB,IAAI;YACJ,IAAI,EAAE,WAAW;YACjB,KAAK;YACL,MAAM;YACN,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;IACL,CAAC;IAED,yCAAyC;IAEzC;;OAEG;IACH,aAAa,CAAC,IAAY,EAAE,UAAkB,EAAE,OAAgB,EAAE,SAAkB,KAAK;QACvF,IAAI,CAAC,SAAS,CAAC,0BAA0B,EAAE;YACzC,IAAI;YACJ,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC;YACxB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;SACvB,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,+BAA+B,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAEpE,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,SAAS,CAAC,4BAA4B,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,SAAS,CAAC,8BAA8B,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,IAAY,EAAE,SAAiB;QACzC,IAAI,CAAC,SAAS,CAAC,wBAAwB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAChE,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,IAAY,EAAE,MAAc;QACvC,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED;;OAEG;IACH,qBAAqB,CAAC,KAAa,EAAE,IAAY;QAC/C,IAAI,CAAC,SAAS,CAAC,kCAAkC,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;IACtE,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,UAAU;QAQR,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,MAAM,cAAc,GAA2B,EAAE,CAAC;QAElD,iBAAiB;QACjB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzC,IAAI,GAAG,CAAC,UAAU,CAAC,0BAA0B,CAAC,EAAE,CAAC;gBAC/C,aAAa,IAAI,KAAK,CAAC;gBAEvB,wBAAwB;gBACxB,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBAC1C,IAAI,SAAS,EAAE,CAAC;oBACd,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;oBAC3B,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC;gBAC7D,CAAC;YACH,CAAC;YACD,IAAI,GAAG,CAAC,UAAU,CAAC,wBAAwB,CAAC,EAAE,CAAC;gBAC7C,WAAW,IAAI,KAAK,CAAC;YACvB,CAAC;YACD,IAAI,GAAG,CAAC,UAAU,CAAC,4BAA4B,CAAC,EAAE,CAAC;gBACjD,SAAS,IAAI,KAAK,CAAC;YACrB,CAAC;YACD,IAAI,GAAG,CAAC,UAAU,CAAC,8BAA8B,CAAC,EAAE,CAAC;gBACnD,WAAW,IAAI,KAAK,CAAC;YACvB,CAAC;QACH,CAAC;QAED,qCAAqC;QACrC,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAC7C,IAAI,GAAG,CAAC,UAAU,CAAC,+BAA+B,CAAC,EAAE,CAAC;gBACpD,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC;gBAC7B,aAAa,IAAI,OAAO,CAAC,KAAK,CAAC;YACjC,CAAC;YACD,IAAI,GAAG,CAAC,UAAU,CAAC,2BAA2B,CAAC,EAAE,CAAC;gBAChD,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC;gBAC3B,UAAU,IAAI,OAAO,CAAC,KAAK,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,OAAO;YACL,aAAa;YACb,WAAW;YACX,YAAY,EAAE,SAAS,GAAG,WAAW,GAAG,CAAC;gBACvC,CAAC,CAAC,SAAS,GAAG,CAAC,SAAS,GAAG,WAAW,CAAC;gBACvC,CAAC,CAAC,CAAC;YACL,aAAa,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YACpE,SAAS,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YACxD,cAAc;SACf,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,YAAY;QACV,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,WAAW;QACX,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAC3C,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,QAAQ,IAAI,KAAK,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,SAAS;QACT,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACvC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAC3C,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,QAAQ,IAAI,KAAK,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,aAAa;QACb,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAC7C,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAE3C,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,UAAU,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YACpF,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,UAAU,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YACpF,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,UAAU,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YACtF,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,UAAU,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YACtF,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,UAAU,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YACtF,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,UAAU,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YACxF,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,UAAU,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YACxF,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,UAAU,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YACxF,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,UAAU,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YACvF,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YACpD,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,SAAS,QAAQ,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1D,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACpB,CAAC;IAED,kBAAkB;IAEV,OAAO,CAAC,IAAY,EAAE,MAAoB;QAChD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;aACtC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC;aAClC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;aACtC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEhC,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC;YAC1B,CAAC,CAAC,GAAG,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG;YACpC,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IAEO,QAAQ,CAAC,GAAW;QAC1B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACnC,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACvB,MAAM,MAAM,GAAiB,EAAE,CAAC;QAEhC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACb,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC/B,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACV,MAAiC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC;IAEO,YAAY,CAAC,MAAoB;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;aACjC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC;aAClC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAElC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,CAAC;IAEO,QAAQ,CAAC,QAAgB,EAAE,GAAW,EAAE,KAAa;QAC3D,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;YACpB,OAAO,IAAI,GAAG,KAAK,KAAK,IAAI,CAAC;QAC/B,CAAC;QACD,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC;IACtD,CAAC;IAEO,kBAAkB;QACxB,OAAO;YACL,KAAK,EAAE,CAAC;YACR,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,CAAC;YACT,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;YACV,MAAM,EAAE,CAAC;YACT,GAAG,EAAE,CAAC;YACN,KAAK,EAAE,CAAC;SACT,CAAC;IACJ,CAAC;IAEO,YAAY,CAAC,MAAc;QACjC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE1B,iCAAiC;QACjC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAC1C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Rate Limiter
3
+ *
4
+ * Sliding window rate limiting to prevent abuse.
5
+ * Configurable per-tool and global limits.
6
+ */
7
+ export interface RateLimitConfig {
8
+ globalMaxRequests: number;
9
+ globalWindowMs: number;
10
+ toolLimits?: Record<string, {
11
+ maxRequests: number;
12
+ windowMs: number;
13
+ }>;
14
+ expensiveTools?: string[];
15
+ expensiveMaxRequests?: number;
16
+ expensiveWindowMs?: number;
17
+ }
18
+ export declare class RateLimiter {
19
+ private windows;
20
+ private config;
21
+ constructor(config?: Partial<RateLimitConfig>);
22
+ /**
23
+ * Check if request is allowed
24
+ * @throws DriftError if rate limited
25
+ */
26
+ checkLimit(tool: string, identifier?: string): void;
27
+ /**
28
+ * Get remaining requests for a limit
29
+ */
30
+ getRemainingRequests(tool: string, identifier?: string): {
31
+ global: number;
32
+ tool?: number;
33
+ expensive?: number;
34
+ };
35
+ /**
36
+ * Record a request (call after successful processing)
37
+ */
38
+ recordRequest(tool: string, identifier?: string): void;
39
+ /**
40
+ * Clear all rate limit windows
41
+ */
42
+ clear(): void;
43
+ /**
44
+ * Get statistics
45
+ */
46
+ getStats(): {
47
+ activeWindows: number;
48
+ totalRequests: number;
49
+ };
50
+ private checkWindowLimit;
51
+ private getRemaining;
52
+ private addToWindow;
53
+ private getOrCreateWindow;
54
+ }
55
+ /**
56
+ * Singleton instance for convenience
57
+ */
58
+ export declare const rateLimiter: RateLimiter;
59
+ //# sourceMappingURL=rate-limiter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/infrastructure/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,eAAe;IAE9B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IAGvB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAC1B,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;IAGH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAmBD,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAA2C;IAC1D,OAAO,CAAC,MAAM,CAAkB;gBAEpB,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM;IAIjD;;;OAGG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,GAAE,MAAkB,GAAG,IAAI;IAiC9D;;OAEG;IACH,oBAAoB,CAClB,IAAI,EAAE,MAAM,EACZ,UAAU,GAAE,MAAkB,GAC7B;QACD,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB;IAsCD;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,GAAE,MAAkB,GAAG,IAAI;IAcjE;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,QAAQ,IAAI;QACV,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;KACvB;IAcD,OAAO,CAAC,gBAAgB;IAqBxB,OAAO,CAAC,YAAY;IAiBpB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,iBAAiB;CAQ1B;AAED;;GAEG;AACH,eAAO,MAAM,WAAW,aAAoB,CAAC"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Rate Limiter
3
+ *
4
+ * Sliding window rate limiting to prevent abuse.
5
+ * Configurable per-tool and global limits.
6
+ */
7
+ import { Errors } from './error-handler.js';
8
+ const DEFAULT_CONFIG = {
9
+ globalMaxRequests: 100,
10
+ globalWindowMs: 60000, // 1 minute
11
+ expensiveTools: [
12
+ 'drift_callgraph',
13
+ 'drift_code_examples',
14
+ 'drift_impact_analysis',
15
+ 'drift_security_summary',
16
+ ],
17
+ expensiveMaxRequests: 10,
18
+ expensiveWindowMs: 60000,
19
+ };
20
+ export class RateLimiter {
21
+ windows = new Map();
22
+ config;
23
+ constructor(config = {}) {
24
+ this.config = { ...DEFAULT_CONFIG, ...config };
25
+ }
26
+ /**
27
+ * Check if request is allowed
28
+ * @throws DriftError if rate limited
29
+ */
30
+ checkLimit(tool, identifier = 'default') {
31
+ const now = Date.now();
32
+ // Check global limit
33
+ this.checkWindowLimit(`global:${identifier}`, this.config.globalMaxRequests, this.config.globalWindowMs, now);
34
+ // Check tool-specific limit
35
+ const toolLimit = this.config.toolLimits?.[tool];
36
+ if (toolLimit) {
37
+ this.checkWindowLimit(`tool:${tool}:${identifier}`, toolLimit.maxRequests, toolLimit.windowMs, now);
38
+ }
39
+ // Check expensive tool limit
40
+ if (this.config.expensiveTools?.includes(tool)) {
41
+ this.checkWindowLimit(`expensive:${identifier}`, this.config.expensiveMaxRequests ?? 10, this.config.expensiveWindowMs ?? 60000, now);
42
+ }
43
+ }
44
+ /**
45
+ * Get remaining requests for a limit
46
+ */
47
+ getRemainingRequests(tool, identifier = 'default') {
48
+ const now = Date.now();
49
+ const result = {
50
+ global: this.getRemaining(`global:${identifier}`, this.config.globalMaxRequests, this.config.globalWindowMs, now),
51
+ };
52
+ const toolLimit = this.config.toolLimits?.[tool];
53
+ if (toolLimit) {
54
+ result.tool = this.getRemaining(`tool:${tool}:${identifier}`, toolLimit.maxRequests, toolLimit.windowMs, now);
55
+ }
56
+ if (this.config.expensiveTools?.includes(tool)) {
57
+ result.expensive = this.getRemaining(`expensive:${identifier}`, this.config.expensiveMaxRequests ?? 10, this.config.expensiveWindowMs ?? 60000, now);
58
+ }
59
+ return result;
60
+ }
61
+ /**
62
+ * Record a request (call after successful processing)
63
+ */
64
+ recordRequest(tool, identifier = 'default') {
65
+ const now = Date.now();
66
+ this.addToWindow(`global:${identifier}`, now);
67
+ if (this.config.toolLimits?.[tool]) {
68
+ this.addToWindow(`tool:${tool}:${identifier}`, now);
69
+ }
70
+ if (this.config.expensiveTools?.includes(tool)) {
71
+ this.addToWindow(`expensive:${identifier}`, now);
72
+ }
73
+ }
74
+ /**
75
+ * Clear all rate limit windows
76
+ */
77
+ clear() {
78
+ this.windows.clear();
79
+ }
80
+ /**
81
+ * Get statistics
82
+ */
83
+ getStats() {
84
+ let totalRequests = 0;
85
+ for (const window of this.windows.values()) {
86
+ totalRequests += window.requests.length;
87
+ }
88
+ return {
89
+ activeWindows: this.windows.size,
90
+ totalRequests,
91
+ };
92
+ }
93
+ // Private methods
94
+ checkWindowLimit(key, maxRequests, windowMs, now) {
95
+ const window = this.getOrCreateWindow(key);
96
+ const windowStart = now - windowMs;
97
+ // Clean old requests
98
+ window.requests = window.requests.filter(t => t > windowStart);
99
+ if (window.requests.length >= maxRequests) {
100
+ // Calculate retry after
101
+ const oldestRequest = window.requests[0];
102
+ const retryAfter = oldestRequest ? oldestRequest + windowMs - now : windowMs;
103
+ throw Errors.rateLimited(Math.max(0, retryAfter));
104
+ }
105
+ }
106
+ getRemaining(key, maxRequests, windowMs, now) {
107
+ const window = this.windows.get(key);
108
+ if (!window) {
109
+ return maxRequests;
110
+ }
111
+ const windowStart = now - windowMs;
112
+ const validRequests = window.requests.filter(t => t > windowStart);
113
+ return Math.max(0, maxRequests - validRequests.length);
114
+ }
115
+ addToWindow(key, timestamp) {
116
+ const window = this.getOrCreateWindow(key);
117
+ window.requests.push(timestamp);
118
+ }
119
+ getOrCreateWindow(key) {
120
+ let window = this.windows.get(key);
121
+ if (!window) {
122
+ window = { requests: [] };
123
+ this.windows.set(key, window);
124
+ }
125
+ return window;
126
+ }
127
+ }
128
+ /**
129
+ * Singleton instance for convenience
130
+ */
131
+ export const rateLimiter = new RateLimiter();
132
+ //# sourceMappingURL=rate-limiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/infrastructure/rate-limiter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Enterprise Response Builder
3
+ *
4
+ * Provides consistent response formatting with:
5
+ * - Summary-first responses
6
+ * - Token budget awareness
7
+ * - Pagination support
8
+ * - AI-friendly hints
9
+ */
10
+ export interface MCPResponseMeta {
11
+ requestId: string;
12
+ durationMs: number;
13
+ cached: boolean;
14
+ tokenEstimate: number;
15
+ }
16
+ export interface PaginationInfo {
17
+ cursor?: string | undefined;
18
+ hasMore: boolean;
19
+ totalCount?: number | undefined;
20
+ pageSize: number;
21
+ }
22
+ export interface ResponseHints {
23
+ nextActions?: string[];
24
+ relatedTools?: string[];
25
+ warnings?: string[] | undefined;
26
+ }
27
+ export interface MCPResponse<T> {
28
+ summary: string;
29
+ data: T;
30
+ pagination?: PaginationInfo;
31
+ hints?: ResponseHints;
32
+ meta: MCPResponseMeta;
33
+ }
34
+ export interface ResponseBuilderConfig {
35
+ maxResponseTokens: number;
36
+ maxSectionTokens: number;
37
+ preferSummary: boolean;
38
+ }
39
+ export declare class ResponseBuilder<T> {
40
+ private readonly requestId;
41
+ private summary;
42
+ private data;
43
+ private pagination?;
44
+ private hints?;
45
+ private startTime;
46
+ private cached;
47
+ private readonly config;
48
+ private readonly tokenEstimator;
49
+ constructor(requestId: string, config?: Partial<ResponseBuilderConfig>);
50
+ /**
51
+ * Set the summary (1-2 sentences describing the response)
52
+ */
53
+ withSummary(summary: string): this;
54
+ /**
55
+ * Set the main data payload
56
+ */
57
+ withData(data: T): this;
58
+ /**
59
+ * Add pagination info
60
+ */
61
+ withPagination(info: PaginationInfo): this;
62
+ /**
63
+ * Create pagination from array results
64
+ */
65
+ withArrayPagination<Item>(items: Item[], totalCount: number, pageSize: number, createCursor: (lastItem: Item) => string): this;
66
+ /**
67
+ * Add hints for AI to understand next steps
68
+ */
69
+ withHints(hints: ResponseHints): this;
70
+ /**
71
+ * Add a single next action hint
72
+ */
73
+ addNextAction(action: string): this;
74
+ /**
75
+ * Add a warning hint
76
+ */
77
+ addWarning(warning: string): this;
78
+ /**
79
+ * Mark response as served from cache
80
+ */
81
+ markCached(): this;
82
+ /**
83
+ * Build the final response
84
+ */
85
+ build(): MCPResponse<T>;
86
+ /**
87
+ * Build and serialize to MCP content format
88
+ */
89
+ buildContent(): {
90
+ content: Array<{
91
+ type: string;
92
+ text: string;
93
+ }>;
94
+ };
95
+ /**
96
+ * Fit response to token budget
97
+ */
98
+ private fitToBudget;
99
+ }
100
+ /**
101
+ * Factory function for creating response builders
102
+ */
103
+ export declare function createResponseBuilder<T>(requestId?: string, config?: Partial<ResponseBuilderConfig>): ResponseBuilder<T>;
104
+ //# sourceMappingURL=response-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-builder.d.ts","sourceRoot":"","sources":["../../src/infrastructure/response-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;CACjC;AAED,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,CAAC,CAAC;IACR,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;CACxB;AAQD,qBAAa,eAAe,CAAC,CAAC;IAY1B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAX5B,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,IAAI,CAAkB;IAC9B,OAAO,CAAC,UAAU,CAAC,CAAiB;IACpC,OAAO,CAAC,KAAK,CAAC,CAAgB;IAC9B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAkB;IAEhC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;IAC/C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;gBAG7B,SAAS,EAAE,MAAM,EAClC,MAAM,GAAE,OAAO,CAAC,qBAAqB,CAAM;IAO7C;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKlC;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;IAKvB;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAK1C;;OAEG;IACH,mBAAmB,CAAC,IAAI,EACtB,KAAK,EAAE,IAAI,EAAE,EACb,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,CAAC,QAAQ,EAAE,IAAI,KAAK,MAAM,GACvC,IAAI;IAeP;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAKrC;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAWnC;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAWjC;;OAEG;IACH,UAAU,IAAI,IAAI;IAKlB;;OAEG;IACH,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC;IAyCvB;;OAEG;IACH,YAAY,IAAI;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE;IAUlE;;OAEG;IACH,OAAO,CAAC,WAAW;CA+CpB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EACrC,SAAS,CAAC,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,GACtC,eAAe,CAAC,CAAC,CAAC,CAGpB"}
@@ -0,0 +1,207 @@
1
+ /**
2
+ * Enterprise Response Builder
3
+ *
4
+ * Provides consistent response formatting with:
5
+ * - Summary-first responses
6
+ * - Token budget awareness
7
+ * - Pagination support
8
+ * - AI-friendly hints
9
+ */
10
+ import { TokenEstimator } from './token-estimator.js';
11
+ const DEFAULT_CONFIG = {
12
+ maxResponseTokens: 4000,
13
+ maxSectionTokens: 1000,
14
+ preferSummary: true,
15
+ };
16
+ export class ResponseBuilder {
17
+ requestId;
18
+ summary = '';
19
+ data = null;
20
+ pagination;
21
+ hints;
22
+ startTime;
23
+ cached = false;
24
+ config;
25
+ tokenEstimator;
26
+ constructor(requestId, config = {}) {
27
+ this.requestId = requestId;
28
+ this.config = { ...DEFAULT_CONFIG, ...config };
29
+ this.tokenEstimator = new TokenEstimator();
30
+ this.startTime = Date.now();
31
+ }
32
+ /**
33
+ * Set the summary (1-2 sentences describing the response)
34
+ */
35
+ withSummary(summary) {
36
+ this.summary = summary;
37
+ return this;
38
+ }
39
+ /**
40
+ * Set the main data payload
41
+ */
42
+ withData(data) {
43
+ this.data = data;
44
+ return this;
45
+ }
46
+ /**
47
+ * Add pagination info
48
+ */
49
+ withPagination(info) {
50
+ this.pagination = info;
51
+ return this;
52
+ }
53
+ /**
54
+ * Create pagination from array results
55
+ */
56
+ withArrayPagination(items, totalCount, pageSize, createCursor) {
57
+ const hasMore = items.length === pageSize && items.length < totalCount;
58
+ this.pagination = {
59
+ hasMore,
60
+ totalCount,
61
+ pageSize,
62
+ cursor: hasMore && items.length > 0
63
+ ? createCursor(items[items.length - 1])
64
+ : undefined,
65
+ };
66
+ return this;
67
+ }
68
+ /**
69
+ * Add hints for AI to understand next steps
70
+ */
71
+ withHints(hints) {
72
+ this.hints = hints;
73
+ return this;
74
+ }
75
+ /**
76
+ * Add a single next action hint
77
+ */
78
+ addNextAction(action) {
79
+ if (!this.hints) {
80
+ this.hints = {};
81
+ }
82
+ if (!this.hints.nextActions) {
83
+ this.hints.nextActions = [];
84
+ }
85
+ this.hints.nextActions.push(action);
86
+ return this;
87
+ }
88
+ /**
89
+ * Add a warning hint
90
+ */
91
+ addWarning(warning) {
92
+ if (!this.hints) {
93
+ this.hints = {};
94
+ }
95
+ if (!this.hints.warnings) {
96
+ this.hints.warnings = [];
97
+ }
98
+ this.hints.warnings.push(warning);
99
+ return this;
100
+ }
101
+ /**
102
+ * Mark response as served from cache
103
+ */
104
+ markCached() {
105
+ this.cached = true;
106
+ return this;
107
+ }
108
+ /**
109
+ * Build the final response
110
+ */
111
+ build() {
112
+ if (this.data === null) {
113
+ throw new Error('Response data is required');
114
+ }
115
+ if (!this.summary) {
116
+ throw new Error('Response summary is required');
117
+ }
118
+ const response = {
119
+ summary: this.summary,
120
+ data: this.data,
121
+ meta: {
122
+ requestId: this.requestId,
123
+ durationMs: Date.now() - this.startTime,
124
+ cached: this.cached,
125
+ tokenEstimate: 0, // Will be calculated below
126
+ },
127
+ };
128
+ if (this.pagination) {
129
+ response.pagination = this.pagination;
130
+ }
131
+ if (this.hints && Object.keys(this.hints).length > 0) {
132
+ response.hints = this.hints;
133
+ }
134
+ // Calculate token estimate
135
+ response.meta.tokenEstimate = this.tokenEstimator.estimate(JSON.stringify(response));
136
+ // Check if we need to fit to budget
137
+ if (response.meta.tokenEstimate > this.config.maxResponseTokens) {
138
+ return this.fitToBudget(response);
139
+ }
140
+ return response;
141
+ }
142
+ /**
143
+ * Build and serialize to MCP content format
144
+ */
145
+ buildContent() {
146
+ const response = this.build();
147
+ return {
148
+ content: [{
149
+ type: 'text',
150
+ text: JSON.stringify(response, null, 2),
151
+ }],
152
+ };
153
+ }
154
+ /**
155
+ * Fit response to token budget
156
+ */
157
+ fitToBudget(response) {
158
+ // Strategy 1: If data is an array, reduce page size
159
+ if (Array.isArray(response.data) && response.pagination) {
160
+ const targetSize = Math.floor(response.data.length *
161
+ (this.config.maxResponseTokens / response.meta.tokenEstimate));
162
+ const reducedData = response.data.slice(0, Math.max(1, targetSize));
163
+ return {
164
+ ...response,
165
+ data: reducedData,
166
+ pagination: {
167
+ ...response.pagination,
168
+ hasMore: true,
169
+ pageSize: targetSize,
170
+ },
171
+ hints: {
172
+ ...response.hints,
173
+ warnings: [
174
+ ...(response.hints?.warnings || []),
175
+ `Response truncated to fit token budget. Use pagination to see more.`,
176
+ ],
177
+ },
178
+ meta: {
179
+ ...response.meta,
180
+ tokenEstimate: this.tokenEstimator.estimate(JSON.stringify({
181
+ ...response,
182
+ data: reducedData,
183
+ })),
184
+ },
185
+ };
186
+ }
187
+ // Strategy 2: Add truncation warning
188
+ return {
189
+ ...response,
190
+ hints: {
191
+ ...response.hints,
192
+ warnings: [
193
+ ...(response.hints?.warnings || []),
194
+ `Response is large (${response.meta.tokenEstimate} tokens). Consider using more specific filters.`,
195
+ ],
196
+ },
197
+ };
198
+ }
199
+ }
200
+ /**
201
+ * Factory function for creating response builders
202
+ */
203
+ export function createResponseBuilder(requestId, config) {
204
+ const id = requestId || `req_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
205
+ return new ResponseBuilder(id, config);
206
+ }
207
+ //# sourceMappingURL=response-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-builder.js","sourceRoot":"","sources":["../../src/infrastructure/response-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Token Estimator
3
+ *
4
+ * Estimates token count for responses to stay within context budgets.
5
+ * Uses heuristics based on typical tokenization patterns.
6
+ */
7
+ export interface TokenEstimate {
8
+ tokens: number;
9
+ confidence: 'high' | 'medium' | 'low';
10
+ breakdown?: {
11
+ text: number;
12
+ structure: number;
13
+ whitespace: number;
14
+ };
15
+ }
16
+ export declare class TokenEstimator {
17
+ private static readonly CHARS_PER_TOKEN;
18
+ private static readonly JSON_OVERHEAD;
19
+ /**
20
+ * Estimate tokens for a string
21
+ */
22
+ estimate(text: string): number;
23
+ /**
24
+ * Estimate with detailed breakdown
25
+ */
26
+ estimateDetailed(text: string): TokenEstimate;
27
+ /**
28
+ * Estimate tokens for an object (will be JSON serialized)
29
+ */
30
+ estimateObject(obj: unknown): number;
31
+ /**
32
+ * Check if content fits within a token budget
33
+ */
34
+ fitsInBudget(text: string, budget: number): boolean;
35
+ /**
36
+ * Truncate text to fit within token budget
37
+ */
38
+ truncateToFit(text: string, budget: number, suffix?: string): string;
39
+ /**
40
+ * Detect content type for better estimation
41
+ */
42
+ private detectContentType;
43
+ }
44
+ /**
45
+ * Singleton instance for convenience
46
+ */
47
+ export declare const tokenEstimator: TokenEstimator;
48
+ //# sourceMappingURL=token-estimator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-estimator.d.ts","sourceRoot":"","sources":["../../src/infrastructure/token-estimator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACtC,SAAS,CAAC,EAAE;QACV,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED,qBAAa,cAAc;IAEzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAKrC;IAGF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAQ;IAE7C;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAiB9B;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa;IAmC7C;;OAEG;IACH,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM;IAIpC;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAInD;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,MAAyB,GAAG,MAAM;IAetF;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAqC1B;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,gBAAuB,CAAC"}