@spotlightjs/spotlight 4.6.0 → 4.7.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 (665) hide show
  1. package/dist/_virtual/_commonjsHelpers.js +9 -0
  2. package/dist/_virtual/_commonjsHelpers.js.map +1 -1
  3. package/dist/_virtual/_sentry-release-injection-file.js +11 -0
  4. package/dist/_virtual/_sentry-release-injection-file.js.map +1 -0
  5. package/dist/_virtual/cache.js +8 -0
  6. package/dist/_virtual/cache.js.map +1 -1
  7. package/dist/_virtual/index.js +8 -0
  8. package/dist/_virtual/index.js.map +1 -1
  9. package/dist/_virtual/uri.all.js +8 -0
  10. package/dist/_virtual/uri.all.js.map +1 -1
  11. package/dist/instrument.js +9 -0
  12. package/dist/instrument.js.map +1 -1
  13. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.16.0/node_modules/@modelcontextprotocol/sdk/dist/esm/client/index.js +8 -0
  14. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.16.0/node_modules/@modelcontextprotocol/sdk/dist/esm/client/index.js.map +1 -1
  15. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.16.0/node_modules/@modelcontextprotocol/sdk/dist/esm/server/completable.js +8 -0
  16. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.16.0/node_modules/@modelcontextprotocol/sdk/dist/esm/server/completable.js.map +1 -1
  17. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.16.0/node_modules/@modelcontextprotocol/sdk/dist/esm/server/index.js +8 -0
  18. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.16.0/node_modules/@modelcontextprotocol/sdk/dist/esm/server/index.js.map +1 -1
  19. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.16.0/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js +8 -0
  20. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.16.0/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js.map +1 -1
  21. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.16.0/node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js +8 -0
  22. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.16.0/node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js.map +1 -1
  23. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.16.0/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/protocol.js +8 -0
  24. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.16.0/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/protocol.js.map +1 -1
  25. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.16.0/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/stdio.js +8 -0
  26. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.16.0/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/stdio.js.map +1 -1
  27. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.16.0/node_modules/@modelcontextprotocol/sdk/dist/esm/types.js +8 -0
  28. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.16.0/node_modules/@modelcontextprotocol/sdk/dist/esm/types.js.map +1 -1
  29. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/ajv.js +47 -39
  30. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/ajv.js.map +1 -1
  31. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/cache.js +9 -0
  32. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/cache.js.map +1 -1
  33. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/async.js +18 -9
  34. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/async.js.map +1 -1
  35. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/error_classes.js +9 -0
  36. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/error_classes.js.map +1 -1
  37. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/formats.js +9 -0
  38. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/formats.js.map +1 -1
  39. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/index.js +24 -15
  40. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/index.js.map +1 -1
  41. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/resolve.js +14 -5
  42. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/resolve.js.map +1 -1
  43. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/rules.js +9 -0
  44. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/rules.js.map +1 -1
  45. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/schema_obj.js +9 -0
  46. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/schema_obj.js.map +1 -1
  47. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/ucs2length.js +9 -0
  48. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/ucs2length.js.map +1 -1
  49. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/util.js +9 -0
  50. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/util.js.map +1 -1
  51. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/data.js +9 -0
  52. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/data.js.map +1 -1
  53. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/definition_schema.js +9 -0
  54. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/definition_schema.js.map +1 -1
  55. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/_limit.js +9 -0
  56. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/_limit.js.map +1 -1
  57. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/_limitItems.js +9 -0
  58. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/_limitItems.js.map +1 -1
  59. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/_limitLength.js +9 -0
  60. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/_limitLength.js.map +1 -1
  61. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/_limitProperties.js +9 -0
  62. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/_limitProperties.js.map +1 -1
  63. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/allOf.js +9 -0
  64. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/allOf.js.map +1 -1
  65. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/anyOf.js +9 -0
  66. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/anyOf.js.map +1 -1
  67. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/comment.js +9 -0
  68. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/comment.js.map +1 -1
  69. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/const.js +9 -0
  70. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/const.js.map +1 -1
  71. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/contains.js +9 -0
  72. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/contains.js.map +1 -1
  73. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/custom.js +9 -0
  74. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/custom.js.map +1 -1
  75. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/dependencies.js +9 -0
  76. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/dependencies.js.map +1 -1
  77. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/enum.js +9 -0
  78. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/enum.js.map +1 -1
  79. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/format.js +9 -0
  80. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/format.js.map +1 -1
  81. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/if.js +9 -0
  82. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/if.js.map +1 -1
  83. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/index.js +9 -0
  84. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/index.js.map +1 -1
  85. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/items.js +9 -0
  86. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/items.js.map +1 -1
  87. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/multipleOf.js +9 -0
  88. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/multipleOf.js.map +1 -1
  89. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/not.js +9 -0
  90. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/not.js.map +1 -1
  91. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/oneOf.js +9 -0
  92. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/oneOf.js.map +1 -1
  93. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/pattern.js +9 -0
  94. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/pattern.js.map +1 -1
  95. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/properties.js +9 -0
  96. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/properties.js.map +1 -1
  97. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/propertyNames.js +9 -0
  98. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/propertyNames.js.map +1 -1
  99. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/ref.js +9 -0
  100. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/ref.js.map +1 -1
  101. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/required.js +9 -0
  102. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/required.js.map +1 -1
  103. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/uniqueItems.js +9 -0
  104. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/uniqueItems.js.map +1 -1
  105. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/validate.js +9 -0
  106. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/validate.js.map +1 -1
  107. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/keyword.js +9 -0
  108. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/keyword.js.map +1 -1
  109. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/refs/data.json.js +8 -0
  110. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/refs/data.json.js.map +1 -1
  111. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/refs/json-schema-draft-07.json.js +8 -0
  112. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/refs/json-schema-draft-07.json.js.map +1 -1
  113. package/dist/node_modules/.pnpm/fast-deep-equal@3.1.3/node_modules/fast-deep-equal/index.js +9 -0
  114. package/dist/node_modules/.pnpm/fast-deep-equal@3.1.3/node_modules/fast-deep-equal/index.js.map +1 -1
  115. package/dist/node_modules/.pnpm/fast-json-stable-stringify@2.1.0/node_modules/fast-json-stable-stringify/index.js +9 -0
  116. package/dist/node_modules/.pnpm/fast-json-stable-stringify@2.1.0/node_modules/fast-json-stable-stringify/index.js.map +1 -1
  117. package/dist/node_modules/.pnpm/hono@4.10.3/node_modules/hono/dist/helper/streaming/sse.js +8 -0
  118. package/dist/node_modules/.pnpm/hono@4.10.3/node_modules/hono/dist/helper/streaming/sse.js.map +1 -1
  119. package/dist/node_modules/.pnpm/hono@4.10.3/node_modules/hono/dist/middleware/cors/index.js +8 -0
  120. package/dist/node_modules/.pnpm/hono@4.10.3/node_modules/hono/dist/middleware/cors/index.js.map +1 -1
  121. package/dist/node_modules/.pnpm/hono@4.10.3/node_modules/hono/dist/utils/html.js +8 -0
  122. package/dist/node_modules/.pnpm/hono@4.10.3/node_modules/hono/dist/utils/html.js.map +1 -1
  123. package/dist/node_modules/.pnpm/hono@4.10.3/node_modules/hono/dist/utils/stream.js +8 -0
  124. package/dist/node_modules/.pnpm/hono@4.10.3/node_modules/hono/dist/utils/stream.js.map +1 -1
  125. package/dist/node_modules/.pnpm/json-schema-traverse@0.4.1/node_modules/json-schema-traverse/index.js +9 -0
  126. package/dist/node_modules/.pnpm/json-schema-traverse@0.4.1/node_modules/json-schema-traverse/index.js.map +1 -1
  127. package/dist/node_modules/.pnpm/uri-js@4.4.1/node_modules/uri-js/dist/es5/uri.all.js +9 -1
  128. package/dist/node_modules/.pnpm/uri-js@4.4.1/node_modules/uri-js/dist/es5/uri.all.js.map +1 -1
  129. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/Options.js +8 -0
  130. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/Options.js.map +1 -1
  131. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/Refs.js +8 -0
  132. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/Refs.js.map +1 -1
  133. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/errorMessages.js +8 -0
  134. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/errorMessages.js.map +1 -1
  135. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/getRelativePath.js +8 -0
  136. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/getRelativePath.js.map +1 -1
  137. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parseDef.js +8 -0
  138. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parseDef.js.map +1 -1
  139. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/any.js +8 -0
  140. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/any.js.map +1 -1
  141. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/array.js +8 -0
  142. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/array.js.map +1 -1
  143. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/bigint.js +8 -0
  144. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/bigint.js.map +1 -1
  145. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/boolean.js +8 -0
  146. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/boolean.js.map +1 -1
  147. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/branded.js +8 -0
  148. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/branded.js.map +1 -1
  149. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/catch.js +8 -0
  150. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/catch.js.map +1 -1
  151. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/date.js +8 -0
  152. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/date.js.map +1 -1
  153. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/default.js +8 -0
  154. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/default.js.map +1 -1
  155. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/effects.js +8 -0
  156. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/effects.js.map +1 -1
  157. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/enum.js +8 -0
  158. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/enum.js.map +1 -1
  159. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/intersection.js +8 -0
  160. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/intersection.js.map +1 -1
  161. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/literal.js +8 -0
  162. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/literal.js.map +1 -1
  163. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/map.js +8 -0
  164. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/map.js.map +1 -1
  165. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/nativeEnum.js +8 -0
  166. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/nativeEnum.js.map +1 -1
  167. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/never.js +8 -0
  168. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/never.js.map +1 -1
  169. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/null.js +8 -0
  170. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/null.js.map +1 -1
  171. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/nullable.js +8 -0
  172. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/nullable.js.map +1 -1
  173. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/number.js +8 -0
  174. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/number.js.map +1 -1
  175. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/object.js +8 -0
  176. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/object.js.map +1 -1
  177. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/optional.js +8 -0
  178. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/optional.js.map +1 -1
  179. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/pipeline.js +8 -0
  180. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/pipeline.js.map +1 -1
  181. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/promise.js +8 -0
  182. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/promise.js.map +1 -1
  183. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/readonly.js +8 -0
  184. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/readonly.js.map +1 -1
  185. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/record.js +8 -0
  186. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/record.js.map +1 -1
  187. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/set.js +8 -0
  188. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/set.js.map +1 -1
  189. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/string.js +8 -0
  190. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/string.js.map +1 -1
  191. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/tuple.js +8 -0
  192. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/tuple.js.map +1 -1
  193. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/undefined.js +8 -0
  194. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/undefined.js.map +1 -1
  195. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/union.js +8 -0
  196. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/union.js.map +1 -1
  197. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/unknown.js +8 -0
  198. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/unknown.js.map +1 -1
  199. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/selectParser.js +8 -0
  200. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/selectParser.js.map +1 -1
  201. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/zodToJsonSchema.js +8 -0
  202. package/dist/node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/zodToJsonSchema.js.map +1 -1
  203. package/dist/run.js +10 -0
  204. package/dist/run.js.map +1 -1
  205. package/dist/sentry-config.js +12 -2
  206. package/dist/sentry-config.js.map +1 -1
  207. package/dist/server/cli/help.js +17 -0
  208. package/dist/server/cli/help.js.map +1 -1
  209. package/dist/server/cli/mcp.d.ts +1 -1
  210. package/dist/server/cli/mcp.js +21 -9
  211. package/dist/server/cli/mcp.js.map +1 -1
  212. package/dist/server/cli/run.d.ts +1 -1
  213. package/dist/server/cli/run.js +28 -3
  214. package/dist/server/cli/run.js.map +1 -1
  215. package/dist/server/cli/server.d.ts +1 -1
  216. package/dist/server/cli/server.js +12 -2
  217. package/dist/server/cli/server.js.map +1 -1
  218. package/dist/server/cli/tail.d.ts +1 -1
  219. package/dist/server/cli/tail.js +18 -2
  220. package/dist/server/cli/tail.js.map +1 -1
  221. package/dist/server/cli.d.ts +1 -0
  222. package/dist/server/cli.js +30 -4
  223. package/dist/server/cli.js.map +1 -1
  224. package/dist/server/constants.js +9 -0
  225. package/dist/server/constants.js.map +1 -1
  226. package/dist/server/formatters/human/errors.js +9 -0
  227. package/dist/server/formatters/human/errors.js.map +1 -1
  228. package/dist/server/formatters/human/index.js +9 -0
  229. package/dist/server/formatters/human/index.js.map +1 -1
  230. package/dist/server/formatters/human/logs.js +9 -0
  231. package/dist/server/formatters/human/logs.js.map +1 -1
  232. package/dist/server/formatters/human/traces.js +9 -0
  233. package/dist/server/formatters/human/traces.js.map +1 -1
  234. package/dist/server/formatters/human/utils.js +9 -0
  235. package/dist/server/formatters/human/utils.js.map +1 -1
  236. package/dist/server/formatters/index.js +9 -0
  237. package/dist/server/formatters/index.js.map +1 -1
  238. package/dist/server/formatters/json/errors.js +9 -0
  239. package/dist/server/formatters/json/errors.js.map +1 -1
  240. package/dist/server/formatters/json/index.js +9 -0
  241. package/dist/server/formatters/json/index.js.map +1 -1
  242. package/dist/server/formatters/json/logs.js +9 -0
  243. package/dist/server/formatters/json/logs.js.map +1 -1
  244. package/dist/server/formatters/json/traces.js +9 -0
  245. package/dist/server/formatters/json/traces.js.map +1 -1
  246. package/dist/server/formatters/logfmt/errors.js +9 -0
  247. package/dist/server/formatters/logfmt/errors.js.map +1 -1
  248. package/dist/server/formatters/logfmt/index.js +9 -0
  249. package/dist/server/formatters/logfmt/index.js.map +1 -1
  250. package/dist/server/formatters/logfmt/logs.js +9 -0
  251. package/dist/server/formatters/logfmt/logs.js.map +1 -1
  252. package/dist/server/formatters/logfmt/traces.js +9 -0
  253. package/dist/server/formatters/logfmt/traces.js.map +1 -1
  254. package/dist/server/formatters/md/errors.js +9 -0
  255. package/dist/server/formatters/md/errors.js.map +1 -1
  256. package/dist/server/formatters/md/event.js +9 -0
  257. package/dist/server/formatters/md/event.js.map +1 -1
  258. package/dist/server/formatters/md/index.js +9 -0
  259. package/dist/server/formatters/md/index.js.map +1 -1
  260. package/dist/server/formatters/md/logs.js +9 -0
  261. package/dist/server/formatters/md/logs.js.map +1 -1
  262. package/dist/server/formatters/md/traces.js +9 -0
  263. package/dist/server/formatters/md/traces.js.map +1 -1
  264. package/dist/server/formatters/shared/data-builders.js +9 -0
  265. package/dist/server/formatters/shared/data-builders.js.map +1 -1
  266. package/dist/server/formatters/types.js +9 -0
  267. package/dist/server/formatters/types.js.map +1 -1
  268. package/dist/server/formatters/utils.js +9 -0
  269. package/dist/server/formatters/utils.js.map +1 -1
  270. package/dist/server/handlers/fileToServe.js +9 -0
  271. package/dist/server/handlers/fileToServe.js.map +1 -1
  272. package/dist/server/logger.js +9 -0
  273. package/dist/server/logger.js.map +1 -1
  274. package/dist/server/main.d.ts +1 -1
  275. package/dist/server/main.js +22 -4
  276. package/dist/server/main.js.map +1 -1
  277. package/dist/server/mcp/constants.js +9 -0
  278. package/dist/server/mcp/constants.js.map +1 -1
  279. package/dist/server/mcp/mcp.js +13 -1
  280. package/dist/server/mcp/mcp.js.map +1 -1
  281. package/dist/server/messageBuffer.js +9 -0
  282. package/dist/server/messageBuffer.js.map +1 -1
  283. package/dist/server/parser/helpers.js +9 -0
  284. package/dist/server/parser/helpers.js.map +1 -1
  285. package/dist/server/parser/processEnvelope.js +9 -0
  286. package/dist/server/parser/processEnvelope.js.map +1 -1
  287. package/dist/server/routes/clear.js +12 -0
  288. package/dist/server/routes/clear.js.map +1 -1
  289. package/dist/server/routes/contextlines/index.js +9 -0
  290. package/dist/server/routes/contextlines/index.js.map +1 -1
  291. package/dist/server/routes/contextlines/utils.js +9 -0
  292. package/dist/server/routes/contextlines/utils.js.map +1 -1
  293. package/dist/server/routes/health.js +9 -0
  294. package/dist/server/routes/health.js.map +1 -1
  295. package/dist/server/routes/index.js +9 -0
  296. package/dist/server/routes/index.js.map +1 -1
  297. package/dist/server/routes/mcp.js +9 -0
  298. package/dist/server/routes/mcp.js.map +1 -1
  299. package/dist/server/routes/open.js +9 -0
  300. package/dist/server/routes/open.js.map +1 -1
  301. package/dist/server/routes/stream/debugLogging.js +9 -0
  302. package/dist/server/routes/stream/debugLogging.js.map +1 -1
  303. package/dist/server/routes/stream/index.js +18 -3
  304. package/dist/server/routes/stream/index.js.map +1 -1
  305. package/dist/server/routes/stream/streaming.js +9 -0
  306. package/dist/server/routes/stream/streaming.js.map +1 -1
  307. package/dist/server/routes/stream/userAgent.js +9 -0
  308. package/dist/server/routes/stream/userAgent.js.map +1 -1
  309. package/dist/server/sdk.d.ts +1 -1
  310. package/dist/server/sdk.js +9 -0
  311. package/dist/server/sdk.js.map +1 -1
  312. package/dist/server/types/cli.d.ts +1 -0
  313. package/dist/server/types/utils.d.ts +12 -0
  314. package/dist/server/utils/cors.d.ts +35 -5
  315. package/dist/server/utils/cors.js +179 -6
  316. package/dist/server/utils/cors.js.map +1 -1
  317. package/dist/server/utils/docker-compose-parser.js +9 -0
  318. package/dist/server/utils/docker-compose-parser.js.map +1 -1
  319. package/dist/server/utils/docker-compose.js +10 -1
  320. package/dist/server/utils/docker-compose.js.map +1 -1
  321. package/dist/server/utils/eventContainer.js +9 -0
  322. package/dist/server/utils/eventContainer.js.map +1 -1
  323. package/dist/server/utils/extras.js +9 -0
  324. package/dist/server/utils/extras.js.map +1 -1
  325. package/dist/server/utils/getBuffer.js +9 -0
  326. package/dist/server/utils/getBuffer.js.map +1 -1
  327. package/dist/shared/constants.js +9 -0
  328. package/dist/shared/constants.js.map +1 -1
  329. package/dist/ui/assets/andromeeda.js +2 -1
  330. package/dist/ui/assets/andromeeda.js.map +1 -0
  331. package/dist/ui/assets/angular-html.js +2 -1
  332. package/dist/ui/assets/angular-html.js.map +1 -0
  333. package/dist/ui/assets/angular-ts.js +2 -1
  334. package/dist/ui/assets/angular-ts.js.map +1 -0
  335. package/dist/ui/assets/astro.js +2 -1
  336. package/dist/ui/assets/astro.js.map +1 -0
  337. package/dist/ui/assets/aurora-x.js +2 -1
  338. package/dist/ui/assets/aurora-x.js.map +1 -0
  339. package/dist/ui/assets/ayu-dark.js +2 -1
  340. package/dist/ui/assets/ayu-dark.js.map +1 -0
  341. package/dist/ui/assets/blade.js +2 -1
  342. package/dist/ui/assets/blade.js.map +1 -0
  343. package/dist/ui/assets/c.js +2 -1
  344. package/dist/ui/assets/c.js.map +1 -0
  345. package/dist/ui/assets/catppuccin-frappe.js +2 -1
  346. package/dist/ui/assets/catppuccin-frappe.js.map +1 -0
  347. package/dist/ui/assets/catppuccin-latte.js +2 -1
  348. package/dist/ui/assets/catppuccin-latte.js.map +1 -0
  349. package/dist/ui/assets/catppuccin-macchiato.js +2 -1
  350. package/dist/ui/assets/catppuccin-macchiato.js.map +1 -0
  351. package/dist/ui/assets/catppuccin-mocha.js +2 -1
  352. package/dist/ui/assets/catppuccin-mocha.js.map +1 -0
  353. package/dist/ui/assets/coffee.js +2 -1
  354. package/dist/ui/assets/coffee.js.map +1 -0
  355. package/dist/ui/assets/cpp.js +2 -1
  356. package/dist/ui/assets/cpp.js.map +1 -0
  357. package/dist/ui/assets/css.js +2 -1
  358. package/dist/ui/assets/css.js.map +1 -0
  359. package/dist/ui/assets/dark-plus.js +2 -1
  360. package/dist/ui/assets/dark-plus.js.map +1 -0
  361. package/dist/ui/assets/dracula-soft.js +2 -1
  362. package/dist/ui/assets/dracula-soft.js.map +1 -0
  363. package/dist/ui/assets/dracula.js +2 -1
  364. package/dist/ui/assets/dracula.js.map +1 -0
  365. package/dist/ui/assets/everforest-dark.js +2 -1
  366. package/dist/ui/assets/everforest-dark.js.map +1 -0
  367. package/dist/ui/assets/everforest-light.js +2 -1
  368. package/dist/ui/assets/everforest-light.js.map +1 -0
  369. package/dist/ui/assets/github-dark-default.js +2 -1
  370. package/dist/ui/assets/github-dark-default.js.map +1 -0
  371. package/dist/ui/assets/github-dark-dimmed.js +2 -1
  372. package/dist/ui/assets/github-dark-dimmed.js.map +1 -0
  373. package/dist/ui/assets/github-dark-high-contrast.js +2 -1
  374. package/dist/ui/assets/github-dark-high-contrast.js.map +1 -0
  375. package/dist/ui/assets/github-dark.js +2 -1
  376. package/dist/ui/assets/github-dark.js.map +1 -0
  377. package/dist/ui/assets/github-light-default.js +2 -1
  378. package/dist/ui/assets/github-light-default.js.map +1 -0
  379. package/dist/ui/assets/github-light-high-contrast.js +2 -1
  380. package/dist/ui/assets/github-light-high-contrast.js.map +1 -0
  381. package/dist/ui/assets/github-light.js +2 -1
  382. package/dist/ui/assets/github-light.js.map +1 -0
  383. package/dist/ui/assets/glsl.js +2 -1
  384. package/dist/ui/assets/glsl.js.map +1 -0
  385. package/dist/ui/assets/graphql.js +2 -1
  386. package/dist/ui/assets/graphql.js.map +1 -0
  387. package/dist/ui/assets/gruvbox-dark-hard.js +2 -1
  388. package/dist/ui/assets/gruvbox-dark-hard.js.map +1 -0
  389. package/dist/ui/assets/gruvbox-dark-medium.js +2 -1
  390. package/dist/ui/assets/gruvbox-dark-medium.js.map +1 -0
  391. package/dist/ui/assets/gruvbox-dark-soft.js +2 -1
  392. package/dist/ui/assets/gruvbox-dark-soft.js.map +1 -0
  393. package/dist/ui/assets/gruvbox-light-hard.js +2 -1
  394. package/dist/ui/assets/gruvbox-light-hard.js.map +1 -0
  395. package/dist/ui/assets/gruvbox-light-medium.js +2 -1
  396. package/dist/ui/assets/gruvbox-light-medium.js.map +1 -0
  397. package/dist/ui/assets/gruvbox-light-soft.js +2 -1
  398. package/dist/ui/assets/gruvbox-light-soft.js.map +1 -0
  399. package/dist/ui/assets/haml.js +2 -1
  400. package/dist/ui/assets/haml.js.map +1 -0
  401. package/dist/ui/assets/handlebars.js +2 -1
  402. package/dist/ui/assets/handlebars.js.map +1 -0
  403. package/dist/ui/assets/houston.js +2 -1
  404. package/dist/ui/assets/houston.js.map +1 -0
  405. package/dist/ui/assets/html-derivative.js +2 -1
  406. package/dist/ui/assets/html-derivative.js.map +1 -0
  407. package/dist/ui/assets/html.js +2 -1
  408. package/dist/ui/assets/html.js.map +1 -0
  409. package/dist/ui/assets/http.js +2 -1
  410. package/dist/ui/assets/http.js.map +1 -0
  411. package/dist/ui/assets/imba.js +2 -1
  412. package/dist/ui/assets/imba.js.map +1 -0
  413. package/dist/ui/assets/index.js +46 -45
  414. package/dist/ui/assets/index.js.map +1 -0
  415. package/dist/ui/assets/index2.js +2 -1
  416. package/dist/ui/assets/index2.js.map +1 -0
  417. package/dist/ui/assets/instrumentation.js +12 -11
  418. package/dist/ui/assets/instrumentation.js.map +1 -0
  419. package/dist/ui/assets/java.js +2 -1
  420. package/dist/ui/assets/java.js.map +1 -0
  421. package/dist/ui/assets/javascript.js +2 -1
  422. package/dist/ui/assets/javascript.js.map +1 -0
  423. package/dist/ui/assets/jinja.js +2 -1
  424. package/dist/ui/assets/jinja.js.map +1 -0
  425. package/dist/ui/assets/jison.js +2 -1
  426. package/dist/ui/assets/jison.js.map +1 -0
  427. package/dist/ui/assets/json.js +2 -1
  428. package/dist/ui/assets/json.js.map +1 -0
  429. package/dist/ui/assets/json5.js +2 -1
  430. package/dist/ui/assets/json5.js.map +1 -0
  431. package/dist/ui/assets/jsonc.js +2 -1
  432. package/dist/ui/assets/jsonc.js.map +1 -0
  433. package/dist/ui/assets/jsonl.js +2 -1
  434. package/dist/ui/assets/jsonl.js.map +1 -0
  435. package/dist/ui/assets/jsx.js +2 -1
  436. package/dist/ui/assets/jsx.js.map +1 -0
  437. package/dist/ui/assets/julia.js +2 -1
  438. package/dist/ui/assets/julia.js.map +1 -0
  439. package/dist/ui/assets/kanagawa-dragon.js +2 -1
  440. package/dist/ui/assets/kanagawa-dragon.js.map +1 -0
  441. package/dist/ui/assets/kanagawa-lotus.js +2 -1
  442. package/dist/ui/assets/kanagawa-lotus.js.map +1 -0
  443. package/dist/ui/assets/kanagawa-wave.js +2 -1
  444. package/dist/ui/assets/kanagawa-wave.js.map +1 -0
  445. package/dist/ui/assets/laserwave.js +2 -1
  446. package/dist/ui/assets/laserwave.js.map +1 -0
  447. package/dist/ui/assets/less.js +2 -1
  448. package/dist/ui/assets/less.js.map +1 -0
  449. package/dist/ui/assets/light-plus.js +2 -1
  450. package/dist/ui/assets/light-plus.js.map +1 -0
  451. package/dist/ui/assets/main.css +1 -1
  452. package/dist/ui/assets/main.js +3 -2
  453. package/dist/ui/assets/main.js.map +1 -0
  454. package/dist/ui/assets/markdown.js +2 -1
  455. package/dist/ui/assets/markdown.js.map +1 -0
  456. package/dist/ui/assets/marko.js +2 -1
  457. package/dist/ui/assets/marko.js.map +1 -0
  458. package/dist/ui/assets/material-theme-darker.js +2 -1
  459. package/dist/ui/assets/material-theme-darker.js.map +1 -0
  460. package/dist/ui/assets/material-theme-lighter.js +2 -1
  461. package/dist/ui/assets/material-theme-lighter.js.map +1 -0
  462. package/dist/ui/assets/material-theme-ocean.js +2 -1
  463. package/dist/ui/assets/material-theme-ocean.js.map +1 -0
  464. package/dist/ui/assets/material-theme-palenight.js +2 -1
  465. package/dist/ui/assets/material-theme-palenight.js.map +1 -0
  466. package/dist/ui/assets/material-theme.js +2 -1
  467. package/dist/ui/assets/material-theme.js.map +1 -0
  468. package/dist/ui/assets/mdc.js +2 -1
  469. package/dist/ui/assets/mdc.js.map +1 -0
  470. package/dist/ui/assets/mdx.js +2 -1
  471. package/dist/ui/assets/mdx.js.map +1 -0
  472. package/dist/ui/assets/min-dark.js +2 -1
  473. package/dist/ui/assets/min-dark.js.map +1 -0
  474. package/dist/ui/assets/min-light.js +2 -1
  475. package/dist/ui/assets/min-light.js.map +1 -0
  476. package/dist/ui/assets/monokai.js +2 -1
  477. package/dist/ui/assets/monokai.js.map +1 -0
  478. package/dist/ui/assets/night-owl.js +2 -1
  479. package/dist/ui/assets/night-owl.js.map +1 -0
  480. package/dist/ui/assets/nord.js +2 -1
  481. package/dist/ui/assets/nord.js.map +1 -0
  482. package/dist/ui/assets/one-dark-pro.js +2 -1
  483. package/dist/ui/assets/one-dark-pro.js.map +1 -0
  484. package/dist/ui/assets/one-light.js +2 -1
  485. package/dist/ui/assets/one-light.js.map +1 -0
  486. package/dist/ui/assets/php.js +2 -1
  487. package/dist/ui/assets/php.js.map +1 -0
  488. package/dist/ui/assets/plastic.js +2 -1
  489. package/dist/ui/assets/plastic.js.map +1 -0
  490. package/dist/ui/assets/poimandres.js +2 -1
  491. package/dist/ui/assets/poimandres.js.map +1 -0
  492. package/dist/ui/assets/postcss.js +2 -1
  493. package/dist/ui/assets/postcss.js.map +1 -0
  494. package/dist/ui/assets/pug.js +2 -1
  495. package/dist/ui/assets/pug.js.map +1 -0
  496. package/dist/ui/assets/python.js +2 -1
  497. package/dist/ui/assets/python.js.map +1 -0
  498. package/dist/ui/assets/r.js +2 -1
  499. package/dist/ui/assets/r.js.map +1 -0
  500. package/dist/ui/assets/red.js +2 -1
  501. package/dist/ui/assets/red.js.map +1 -0
  502. package/dist/ui/assets/regexp.js +2 -1
  503. package/dist/ui/assets/regexp.js.map +1 -0
  504. package/dist/ui/assets/rose-pine-dawn.js +2 -1
  505. package/dist/ui/assets/rose-pine-dawn.js.map +1 -0
  506. package/dist/ui/assets/rose-pine-moon.js +2 -1
  507. package/dist/ui/assets/rose-pine-moon.js.map +1 -0
  508. package/dist/ui/assets/rose-pine.js +2 -1
  509. package/dist/ui/assets/rose-pine.js.map +1 -0
  510. package/dist/ui/assets/sass.js +2 -1
  511. package/dist/ui/assets/sass.js.map +1 -0
  512. package/dist/ui/assets/scss.js +2 -1
  513. package/dist/ui/assets/scss.js.map +1 -0
  514. package/dist/ui/assets/serverTimingMeta.js +51 -0
  515. package/dist/ui/assets/serverTimingMeta.js.map +1 -0
  516. package/dist/ui/assets/shellscript.js +2 -1
  517. package/dist/ui/assets/shellscript.js.map +1 -0
  518. package/dist/ui/assets/slack-dark.js +2 -1
  519. package/dist/ui/assets/slack-dark.js.map +1 -0
  520. package/dist/ui/assets/slack-ochin.js +2 -1
  521. package/dist/ui/assets/slack-ochin.js.map +1 -0
  522. package/dist/ui/assets/snazzy-light.js +2 -1
  523. package/dist/ui/assets/snazzy-light.js.map +1 -0
  524. package/dist/ui/assets/solarized-dark.js +2 -1
  525. package/dist/ui/assets/solarized-dark.js.map +1 -0
  526. package/dist/ui/assets/solarized-light.js +2 -1
  527. package/dist/ui/assets/solarized-light.js.map +1 -0
  528. package/dist/ui/assets/sql.js +2 -1
  529. package/dist/ui/assets/sql.js.map +1 -0
  530. package/dist/ui/assets/stylus.js +2 -1
  531. package/dist/ui/assets/stylus.js.map +1 -0
  532. package/dist/ui/assets/svelte.js +2 -1
  533. package/dist/ui/assets/svelte.js.map +1 -0
  534. package/dist/ui/assets/synthwave-84.js +2 -1
  535. package/dist/ui/assets/synthwave-84.js.map +1 -0
  536. package/dist/ui/assets/tokyo-night.js +2 -1
  537. package/dist/ui/assets/tokyo-night.js.map +1 -0
  538. package/dist/ui/assets/ts-tags.js +2 -1
  539. package/dist/ui/assets/ts-tags.js.map +1 -0
  540. package/dist/ui/assets/tsx.js +2 -1
  541. package/dist/ui/assets/tsx.js.map +1 -0
  542. package/dist/ui/assets/typescript.js +2 -1
  543. package/dist/ui/assets/typescript.js.map +1 -0
  544. package/dist/ui/assets/vesper.js +2 -1
  545. package/dist/ui/assets/vesper.js.map +1 -0
  546. package/dist/ui/assets/vitesse-black.js +2 -1
  547. package/dist/ui/assets/vitesse-black.js.map +1 -0
  548. package/dist/ui/assets/vitesse-dark.js +2 -1
  549. package/dist/ui/assets/vitesse-dark.js.map +1 -0
  550. package/dist/ui/assets/vitesse-light.js +2 -1
  551. package/dist/ui/assets/vitesse-light.js.map +1 -0
  552. package/dist/ui/assets/vue-html.js +2 -1
  553. package/dist/ui/assets/vue-html.js.map +1 -0
  554. package/dist/ui/assets/vue-vine.js +2 -1
  555. package/dist/ui/assets/vue-vine.js.map +1 -0
  556. package/dist/ui/assets/vue.js +2 -1
  557. package/dist/ui/assets/vue.js.map +1 -0
  558. package/dist/ui/assets/wasm.js +2 -1
  559. package/dist/ui/assets/wasm.js.map +1 -0
  560. package/dist/ui/assets/wasm2.js +2 -1
  561. package/dist/ui/assets/wasm2.js.map +1 -0
  562. package/dist/ui/assets/wgsl.js +2 -1
  563. package/dist/ui/assets/wgsl.js.map +1 -0
  564. package/dist/ui/assets/wit.js +2 -1
  565. package/dist/ui/assets/wit.js.map +1 -0
  566. package/dist/ui/assets/xml.js +2 -1
  567. package/dist/ui/assets/xml.js.map +1 -0
  568. package/dist/ui/assets/yaml.js +2 -1
  569. package/dist/ui/assets/yaml.js.map +1 -0
  570. package/dist/ui/manifest.json +17 -25
  571. package/package.json +3 -3
  572. package/dist/_virtual/re.js +0 -5
  573. package/dist/_virtual/re.js.map +0 -1
  574. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/classes/comparator.js +0 -123
  575. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/classes/comparator.js.map +0 -1
  576. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/classes/range.js +0 -388
  577. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/classes/range.js.map +0 -1
  578. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/classes/semver.js +0 -277
  579. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/classes/semver.js.map +0 -1
  580. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/clean.js +0 -11
  581. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/clean.js.map +0 -1
  582. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/cmp.js +0 -53
  583. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/cmp.js.map +0 -1
  584. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/coerce.js +0 -46
  585. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/coerce.js.map +0 -1
  586. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/compare-build.js +0 -12
  587. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/compare-build.js.map +0 -1
  588. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/compare-loose.js +0 -8
  589. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/compare-loose.js.map +0 -1
  590. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/compare.js +0 -8
  591. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/compare.js.map +0 -1
  592. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/diff.js +0 -42
  593. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/diff.js.map +0 -1
  594. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/eq.js +0 -8
  595. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/eq.js.map +0 -1
  596. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/gt.js +0 -8
  597. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/gt.js.map +0 -1
  598. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/gte.js +0 -8
  599. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/gte.js.map +0 -1
  600. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/inc.js +0 -22
  601. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/inc.js.map +0 -1
  602. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/lt.js +0 -8
  603. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/lt.js.map +0 -1
  604. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/lte.js +0 -8
  605. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/lte.js.map +0 -1
  606. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/major.js +0 -8
  607. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/major.js.map +0 -1
  608. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/minor.js +0 -8
  609. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/minor.js.map +0 -1
  610. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/neq.js +0 -8
  611. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/neq.js.map +0 -1
  612. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/parse.js +0 -20
  613. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/parse.js.map +0 -1
  614. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/patch.js +0 -8
  615. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/patch.js.map +0 -1
  616. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/prerelease.js +0 -11
  617. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/prerelease.js.map +0 -1
  618. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/rcompare.js +0 -8
  619. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/rcompare.js.map +0 -1
  620. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/rsort.js +0 -8
  621. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/rsort.js.map +0 -1
  622. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/satisfies.js +0 -15
  623. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/satisfies.js.map +0 -1
  624. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/sort.js +0 -8
  625. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/sort.js.map +0 -1
  626. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/valid.js +0 -11
  627. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/functions/valid.js.map +0 -1
  628. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/index.js +0 -135
  629. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/index.js.map +0 -1
  630. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/internal/constants.js +0 -29
  631. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/internal/constants.js.map +0 -1
  632. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/internal/debug.js +0 -7
  633. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/internal/debug.js.map +0 -1
  634. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/internal/identifiers.js +0 -22
  635. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/internal/identifiers.js.map +0 -1
  636. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/internal/lrucache.js +0 -35
  637. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/internal/lrucache.js.map +0 -1
  638. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/internal/parse-options.js +0 -16
  639. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/internal/parse-options.js.map +0 -1
  640. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/internal/re.js +0 -91
  641. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/internal/re.js.map +0 -1
  642. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/ranges/gtr.js +0 -8
  643. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/ranges/gtr.js.map +0 -1
  644. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/ranges/intersects.js +0 -12
  645. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/ranges/intersects.js.map +0 -1
  646. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/ranges/ltr.js +0 -8
  647. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/ranges/ltr.js.map +0 -1
  648. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/ranges/max-satisfying.js +0 -28
  649. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/ranges/max-satisfying.js.map +0 -1
  650. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/ranges/min-satisfying.js +0 -28
  651. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/ranges/min-satisfying.js.map +0 -1
  652. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/ranges/min-version.js +0 -57
  653. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/ranges/min-version.js.map +0 -1
  654. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/ranges/outside.js +0 -74
  655. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/ranges/outside.js.map +0 -1
  656. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/ranges/simplify.js +0 -49
  657. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/ranges/simplify.js.map +0 -1
  658. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/ranges/subset.js +0 -163
  659. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/ranges/subset.js.map +0 -1
  660. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/ranges/to-comparators.js +0 -8
  661. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/ranges/to-comparators.js.map +0 -1
  662. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/ranges/valid.js +0 -14
  663. package/dist/node_modules/.pnpm/semver@7.7.3/node_modules/semver/ranges/valid.js.map +0 -1
  664. package/dist/ui/assets/client.js +0 -50
  665. package/dist/ui/assets/electron-index.js +0 -6
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sources":["../../src/server/main.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport type { Server } from \"node:http\";\nimport type { AddressInfo } from \"node:net\";\nimport { join } from \"node:path\";\nimport { serve } from \"@hono/node-server\";\nimport { addEventProcessor, captureException, getTraceData, startSpan } from \"@sentry/node\";\nimport { Hono } from \"hono\";\nimport { cors } from \"hono/cors\";\nimport { DEFAULT_PORT, SERVER_IDENTIFIER } from \"./constants.ts\";\nimport { serveFilesHandler } from \"./handlers/index.ts\";\nimport { activateLogger, logger } from \"./logger.ts\";\nimport routes from \"./routes/index.ts\";\nimport type { HonoEnv, SideCarOptions, StartServerOptions } from \"./types/index.ts\";\nimport { getBuffer, isAllowedOrigin, isSidecarRunning, isValidPort, logSpotlightUrl } from \"./utils/index.ts\";\n\nlet portInUseRetryTimeout: NodeJS.Timeout | null = null;\n\nconst MAX_RETRIES = 3;\nexport async function startServer(options: StartServerOptions): Promise<Server> {\n const { port, basePath } = options;\n let filesToServe = options.filesToServe;\n if (!filesToServe && basePath) {\n try {\n filesToServe = {\n \"index.html\": readFileSync(join(basePath, \"index.html\")),\n \"assets/main.js\": readFileSync(join(basePath, \"assets/main.js\")),\n };\n } catch {\n // pass -- no UI\n }\n }\n\n const app = new Hono<HonoEnv>().use(\n cors({\n origin: origin => (isAllowedOrigin(origin) ? origin : null),\n }),\n );\n\n app\n .use(async (ctx, next) => {\n ctx.header(\"X-Powered-By\", SERVER_IDENTIFIER);\n\n ctx.set(\"basePath\", options.basePath);\n ctx.set(\"incomingPayload\", options.incomingPayload);\n\n const host = ctx.req.header(\"Host\") || \"localhost\";\n const path = ctx.req.path;\n await startSpan(\n {\n name: `HTTP ${ctx.req.method} ${path}`,\n op: `sidecar.http.${ctx.req.method?.toLowerCase()}`,\n forceTransaction: true,\n attributes: {\n \"http.request.method\": ctx.req.method,\n \"http.request.url\": ctx.req.url,\n \"http.request.query\": ctx.req.query().toString(),\n \"server.address\": host,\n \"server.port\": ctx.env.incoming.socket.localPort,\n },\n },\n async span => {\n const traceData = getTraceData();\n ctx.header(\n \"server-timing\",\n [\n `sentryTrace;desc=\"${traceData[\"sentry-trace\"]}\"`,\n `baggage;desc=\"${traceData.baggage}\"`,\n `sentrySpotlightPort;desc=${ctx.env.incoming.socket.localPort}`,\n ].join(\", \"),\n );\n\n if (path === \"/mcp\" || path === \"/health\") {\n await next();\n } else {\n await startSpan({ name: \"enableCORS\", op: \"sidecar.http.middleware.cors\" }, () => next());\n }\n\n span.setAttribute(\"http.response.status_code\", ctx.res.status);\n },\n );\n })\n .route(\"/\", routes);\n\n if (filesToServe) {\n app.get(\"/*\", serveFilesHandler(filesToServe));\n }\n\n let resolve: (value: Server) => void;\n let reject!: (err: Error) => void;\n const promise = new Promise<Server>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n const server = serve(\n {\n fetch: app.fetch,\n port,\n },\n () => {\n const realPort = (server.address() as AddressInfo).port;\n logger.info(`Spotlight listening on ${realPort}`);\n if (basePath) {\n logSpotlightUrl(realPort);\n }\n resolve(server as Server);\n },\n );\n server.addListener(\"error\", handleServerError);\n\n let retries = 0;\n function handleServerError(err: { code?: string }): void {\n if (\"code\" in err && err.code === \"EADDRINUSE\") {\n logger.info(`Port ${options.port} in use, retrying...`);\n server.close();\n\n retries++;\n if (retries > MAX_RETRIES) {\n reject(err as Error);\n return;\n }\n\n if (portInUseRetryTimeout) {\n clearTimeout(portInUseRetryTimeout);\n }\n portInUseRetryTimeout = setTimeout(() => {\n server.listen(options.port);\n }, 5000);\n portInUseRetryTimeout.unref();\n } else {\n captureException(err);\n reject(err as Error);\n }\n }\n\n return promise;\n}\n\nexport async function setupSpotlight(\n { port, logger: customLogger, basePath, filesToServe, incomingPayload, isStandalone }: SideCarOptions = {\n port: DEFAULT_PORT,\n },\n): Promise<Server | undefined> {\n if (!isStandalone) {\n addEventProcessor(event => (event.spans?.some(span => span.op?.startsWith(\"sidecar.\")) ? null : event));\n }\n\n if (customLogger) {\n activateLogger(customLogger);\n }\n\n if (port && !isValidPort(port)) {\n throw new Error(`Invalid port number: ${port}. Must be between 1 and 65535, or 0 for automatic assignment.`);\n }\n\n if (port > 0 && (await isSidecarRunning(port))) {\n logger.info(`Spotlight is already running on port ${port}`);\n const hasSpotlightUI = (filesToServe && \"index.html\" in filesToServe) || (!filesToServe && basePath);\n if (hasSpotlightUI) {\n logSpotlightUrl(port);\n }\n return;\n }\n const serverInstance = await startServer({\n port,\n basePath,\n filesToServe,\n incomingPayload,\n });\n setShutdownHandlers(serverInstance);\n return serverInstance;\n}\n\nexport function clearBuffer(): void {\n getBuffer().reset();\n}\n\nexport function setShutdownHandlers(server: Server): void {\n let forceShutdown = false;\n const shutdown = () => {\n if (forceShutdown) {\n logger.info(\"Bye.\");\n process.exit(0);\n }\n\n forceShutdown = true;\n logger.info(\"Shutting down server gracefully...\");\n server.close();\n server.closeAllConnections();\n server.unref();\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n}\n"],"names":["routes"],"mappings":"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"}
1
+ {"version":3,"file":"main.js","sources":["../../src/server/main.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport type { Server } from \"node:http\";\nimport type { AddressInfo } from \"node:net\";\nimport { join } from \"node:path\";\nimport { serve } from \"@hono/node-server\";\nimport { addEventProcessor, captureException, getTraceData, startSpan } from \"@sentry/node\";\nimport { Hono } from \"hono\";\nimport { cors } from \"hono/cors\";\nimport { DEFAULT_PORT, SERVER_IDENTIFIER } from \"./constants.ts\";\nimport { serveFilesHandler } from \"./handlers/index.ts\";\nimport { activateLogger, logger } from \"./logger.ts\";\nimport routes from \"./routes/index.ts\";\nimport type { HonoEnv, SideCarOptions, StartServerOptions } from \"./types/index.ts\";\nimport {\n getBuffer,\n isAllowedOrigin,\n isSidecarRunning,\n isValidPort,\n logSpotlightUrl,\n normalizeAllowedOrigins,\n} from \"./utils/index.ts\";\n\nlet portInUseRetryTimeout: NodeJS.Timeout | null = null;\n\nconst MAX_RETRIES = 3;\nexport async function startServer(options: StartServerOptions): Promise<Server> {\n const { port, basePath } = options;\n let filesToServe = options.filesToServe;\n if (!filesToServe && basePath) {\n try {\n filesToServe = {\n \"index.html\": readFileSync(join(basePath, \"index.html\")),\n \"assets/main.js\": readFileSync(join(basePath, \"assets/main.js\")),\n };\n } catch {\n // pass -- no UI\n }\n }\n\n const app = new Hono<HonoEnv>().use(\n cors({\n origin: async origin => ((await isAllowedOrigin(origin, options.normalizedAllowedOrigins)) ? origin : null),\n }),\n );\n\n app\n .use(async (ctx, next) => {\n ctx.header(\"X-Powered-By\", SERVER_IDENTIFIER);\n\n ctx.set(\"basePath\", options.basePath);\n ctx.set(\"incomingPayload\", options.incomingPayload);\n\n const host = ctx.req.header(\"Host\") || \"localhost\";\n const path = ctx.req.path;\n await startSpan(\n {\n name: `HTTP ${ctx.req.method} ${path}`,\n op: `sidecar.http.${ctx.req.method?.toLowerCase()}`,\n forceTransaction: true,\n attributes: {\n \"http.request.method\": ctx.req.method,\n \"http.request.url\": ctx.req.url,\n \"http.request.query\": ctx.req.query().toString(),\n \"server.address\": host,\n \"server.port\": ctx.env.incoming.socket.localPort,\n },\n },\n async span => {\n const traceData = getTraceData();\n ctx.header(\n \"server-timing\",\n [\n `sentryTrace;desc=\"${traceData[\"sentry-trace\"]}\"`,\n `baggage;desc=\"${traceData.baggage}\"`,\n `sentrySpotlightPort;desc=${ctx.env.incoming.socket.localPort}`,\n ].join(\", \"),\n );\n\n if (path === \"/mcp\" || path === \"/health\") {\n await next();\n } else {\n await startSpan({ name: \"enableCORS\", op: \"sidecar.http.middleware.cors\" }, () => next());\n }\n\n span.setAttribute(\"http.response.status_code\", ctx.res.status);\n },\n );\n })\n .route(\"/\", routes);\n\n if (filesToServe) {\n app.get(\"/*\", serveFilesHandler(filesToServe));\n }\n\n let resolve: (value: Server) => void;\n let reject!: (err: Error) => void;\n const promise = new Promise<Server>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n const server = serve(\n {\n fetch: app.fetch,\n port,\n },\n () => {\n const realPort = (server.address() as AddressInfo).port;\n logger.info(`Spotlight listening on ${realPort}`);\n if (basePath) {\n logSpotlightUrl(realPort);\n }\n resolve(server as Server);\n },\n );\n server.addListener(\"error\", handleServerError);\n\n let retries = 0;\n function handleServerError(err: { code?: string }): void {\n if (\"code\" in err && err.code === \"EADDRINUSE\") {\n logger.info(`Port ${options.port} in use, retrying...`);\n server.close();\n\n retries++;\n if (retries > MAX_RETRIES) {\n reject(err as Error);\n return;\n }\n\n if (portInUseRetryTimeout) {\n clearTimeout(portInUseRetryTimeout);\n }\n portInUseRetryTimeout = setTimeout(() => {\n server.listen(options.port);\n }, 5000);\n portInUseRetryTimeout.unref();\n } else {\n captureException(err);\n reject(err as Error);\n }\n }\n\n return promise;\n}\n\nexport async function setupSpotlight(\n {\n port,\n logger: customLogger,\n basePath,\n filesToServe,\n incomingPayload,\n isStandalone,\n allowedOrigins,\n }: SideCarOptions = {\n port: DEFAULT_PORT,\n },\n): Promise<Server | undefined> {\n if (!isStandalone) {\n addEventProcessor(event => (event.spans?.some(span => span.op?.startsWith(\"sidecar.\")) ? null : event));\n }\n\n if (customLogger) {\n activateLogger(customLogger);\n }\n\n if (port && !isValidPort(port)) {\n throw new Error(`Invalid port number: ${port}. Must be between 1 and 65535, or 0 for automatic assignment.`);\n }\n\n if (port > 0 && (await isSidecarRunning(port))) {\n logger.info(`Spotlight is already running on port ${port}`);\n const hasSpotlightUI = (filesToServe && \"index.html\" in filesToServe) || (!filesToServe && basePath);\n if (hasSpotlightUI) {\n logSpotlightUrl(port);\n }\n return;\n }\n const serverInstance = await startServer({\n port,\n basePath,\n filesToServe,\n incomingPayload,\n normalizedAllowedOrigins: allowedOrigins ? normalizeAllowedOrigins(allowedOrigins) : undefined,\n });\n setShutdownHandlers(serverInstance);\n return serverInstance;\n}\n\nexport function clearBuffer(): void {\n getBuffer().reset();\n}\n\nexport function setShutdownHandlers(server: Server): void {\n let forceShutdown = false;\n const shutdown = () => {\n if (forceShutdown) {\n logger.info(\"Bye.\");\n process.exit(0);\n }\n\n forceShutdown = true;\n logger.info(\"Shutting down server gracefully...\");\n server.close();\n server.closeAllConnections();\n server.unref();\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n}\n"],"names":["routes"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAsBA,IAAI,wBAA+C;AAEnD,MAAM,cAAc;AACpB,eAAsB,YAAY,SAA8C;AAC9E,QAAM,EAAE,MAAM,SAAA,IAAa;AAC3B,MAAI,eAAe,QAAQ;AAC3B,MAAI,CAAC,gBAAgB,UAAU;AAC7B,QAAI;AACF,qBAAe;AAAA,QACb,cAAc,aAAa,KAAK,UAAU,YAAY,CAAC;AAAA,QACvD,kBAAkB,aAAa,KAAK,UAAU,gBAAgB,CAAC;AAAA,MAAA;AAAA,IAEnE,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,QAAM,MAAM,IAAI,KAAA,EAAgB;AAAA,IAC9B,KAAK;AAAA,MACH,QAAQ,OAAM,WAAY,MAAM,gBAAgB,QAAQ,QAAQ,wBAAwB,IAAK,SAAS;AAAA,IAAA,CACvG;AAAA,EAAA;AAGH,MACG,IAAI,OAAO,KAAK,SAAS;AACxB,QAAI,OAAO,gBAAgB,iBAAiB;AAE5C,QAAI,IAAI,YAAY,QAAQ,QAAQ;AACpC,QAAI,IAAI,mBAAmB,QAAQ,eAAe;AAElD,UAAM,OAAO,IAAI,IAAI,OAAO,MAAM,KAAK;AACvC,UAAM,OAAO,IAAI,IAAI;AACrB,UAAM;AAAA,MACJ;AAAA,QACE,MAAM,QAAQ,IAAI,IAAI,MAAM,IAAI,IAAI;AAAA,QACpC,IAAI,gBAAgB,IAAI,IAAI,QAAQ,aAAa;AAAA,QACjD,kBAAkB;AAAA,QAClB,YAAY;AAAA,UACV,uBAAuB,IAAI,IAAI;AAAA,UAC/B,oBAAoB,IAAI,IAAI;AAAA,UAC5B,sBAAsB,IAAI,IAAI,MAAA,EAAQ,SAAA;AAAA,UACtC,kBAAkB;AAAA,UAClB,eAAe,IAAI,IAAI,SAAS,OAAO;AAAA,QAAA;AAAA,MACzC;AAAA,MAEF,OAAM,SAAQ;AACZ,cAAM,YAAY,aAAA;AAClB,YAAI;AAAA,UACF;AAAA,UACA;AAAA,YACE,qBAAqB,UAAU,cAAc,CAAC;AAAA,YAC9C,iBAAiB,UAAU,OAAO;AAAA,YAClC,4BAA4B,IAAI,IAAI,SAAS,OAAO,SAAS;AAAA,UAAA,EAC7D,KAAK,IAAI;AAAA,QAAA;AAGb,YAAI,SAAS,UAAU,SAAS,WAAW;AACzC,gBAAM,KAAA;AAAA,QACR,OAAO;AACL,gBAAM,UAAU,EAAE,MAAM,cAAc,IAAI,+BAAA,GAAkC,MAAM,MAAM;AAAA,QAC1F;AAEA,aAAK,aAAa,6BAA6B,IAAI,IAAI,MAAM;AAAA,MAC/D;AAAA,IAAA;AAAA,EAEJ,CAAC,EACA,MAAM,KAAKA,MAAM;AAEpB,MAAI,cAAc;AAChB,QAAI,IAAI,MAAM,kBAAkB,YAAY,CAAC;AAAA,EAC/C;AAEA,MAAI;AACJ,MAAI;AACJ,QAAM,UAAU,IAAI,QAAgB,CAAC,KAAK,QAAQ;AAChD,cAAU;AACV,aAAS;AAAA,EACX,CAAC;AACD,QAAM,SAAS;AAAA,IACb;AAAA,MACE,OAAO,IAAI;AAAA,MACX;AAAA,IAAA;AAAA,IAEF,MAAM;AACJ,YAAM,WAAY,OAAO,QAAA,EAA0B;AACnD,aAAO,KAAK,0BAA0B,QAAQ,EAAE;AAChD,UAAI,UAAU;AACZ,wBAAgB,QAAQ;AAAA,MAC1B;AACA,cAAQ,MAAgB;AAAA,IAC1B;AAAA,EAAA;AAEF,SAAO,YAAY,SAAS,iBAAiB;AAE7C,MAAI,UAAU;AACd,WAAS,kBAAkB,KAA8B;AACvD,QAAI,UAAU,OAAO,IAAI,SAAS,cAAc;AAC9C,aAAO,KAAK,QAAQ,QAAQ,IAAI,sBAAsB;AACtD,aAAO,MAAA;AAEP;AACA,UAAI,UAAU,aAAa;AACzB,eAAO,GAAY;AACnB;AAAA,MACF;AAEA,UAAI,uBAAuB;AACzB,qBAAa,qBAAqB;AAAA,MACpC;AACA,8BAAwB,WAAW,MAAM;AACvC,eAAO,OAAO,QAAQ,IAAI;AAAA,MAC5B,GAAG,GAAI;AACP,4BAAsB,MAAA;AAAA,IACxB,OAAO;AACL,uBAAiB,GAAG;AACpB,aAAO,GAAY;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,eACpB;AAAA,EACE;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,IAAoB;AAAA,EAClB,MAAM;AACR,GAC6B;AAC7B,MAAI,CAAC,cAAc;AACjB,sBAAkB,CAAA,UAAU,MAAM,OAAO,KAAK,CAAA,SAAQ,KAAK,IAAI,WAAW,UAAU,CAAC,IAAI,OAAO,KAAM;AAAA,EACxG;AAEA,MAAI,cAAc;AAChB,mBAAe,YAAY;AAAA,EAC7B;AAEA,MAAI,QAAQ,CAAC,YAAY,IAAI,GAAG;AAC9B,UAAM,IAAI,MAAM,wBAAwB,IAAI,+DAA+D;AAAA,EAC7G;AAEA,MAAI,OAAO,KAAM,MAAM,iBAAiB,IAAI,GAAI;AAC9C,WAAO,KAAK,wCAAwC,IAAI,EAAE;AAC1D,UAAM,iBAAkB,gBAAgB,gBAAgB,gBAAkB,CAAC,gBAAgB;AAC3F,QAAI,gBAAgB;AAClB,sBAAgB,IAAI;AAAA,IACtB;AACA;AAAA,EACF;AACA,QAAM,iBAAiB,MAAM,YAAY;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,0BAA0B,iBAAiB,wBAAwB,cAAc,IAAI;AAAA,EAAA,CACtF;AACD,sBAAoB,cAAc;AAClC,SAAO;AACT;AAEO,SAAS,cAAoB;AAClC,YAAA,EAAY,MAAA;AACd;AAEO,SAAS,oBAAoB,QAAsB;AACxD,MAAI,gBAAgB;AACpB,QAAM,WAAW,MAAM;AACrB,QAAI,eAAe;AACjB,aAAO,KAAK,MAAM;AAClB,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,oBAAgB;AAChB,WAAO,KAAK,oCAAoC;AAChD,WAAO,MAAA;AACP,WAAO,oBAAA;AACP,WAAO,MAAA;AAAA,EACT;AAEA,UAAQ,GAAG,UAAU,QAAQ;AAC7B,UAAQ,GAAG,WAAW,QAAQ;AAChC;"}
@@ -1,3 +1,12 @@
1
+ ;
2
+ !function() {
3
+ try {
4
+ var e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : {}, n = new e.Error().stack;
5
+ n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "d56711ce-621c-4da7-8671-45010c8362ec", e._sentryDebugIdIdentifier = "sentry-dbid-d56711ce-621c-4da7-8671-45010c8362ec");
6
+ } catch (e2) {
7
+ }
8
+ }();
9
+ import "../../_virtual/_sentry-release-injection-file.js";
1
10
  const NO_ERRORS_CONTENT = {
2
11
  content: [
3
12
  {
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sources":["../../../src/server/mcp/constants.ts"],"sourcesContent":["import type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\n\nexport const NO_ERRORS_CONTENT: CallToolResult = {\n content: [\n {\n type: \"text\",\n text: `**No errors detected in Spotlight**\n\n**This means:**\n- Application is currently running without runtime failures\n- No crashes, exceptions, or critical issues in the recent timeframe\n- System appears stable at the moment\n\n**Next debugging steps:**\n\n1. **If user reports a specific issue:**\n - Ask them to reproduce the problem (click the button, submit the form, navigate to the page)\n - Run this tool again immediately after they reproduce it\n - Errors will appear in real-time as they happen\n\n2. **If investigating existing code:**\n - Check application logs separately\n - Look for TODO comments, error handling gaps, or potential edge cases in the code\n - Consider testing error scenarios (invalid inputs, network failures, etc.)\n\n3. **Proactive error detection:**\n - Have user interact with recently changed features\n - Test API endpoints or database operations that might be fragile\n - Check pages/features mentioned in recent commits\n\n** Pro tip:** Absence of errors doesn't mean absence of bugs - it just means no runtime failures occurred recently. The issue might be logical errors, UI problems, or dormant bugs waiting for specific conditions.`,\n },\n ],\n};\n\nexport const NO_LOGS_CONTENT: CallToolResult = {\n content: [\n {\n type: \"text\",\n text: `**No logs detected in Spotlight**\n\n**This means:**\n- Application hasn't generated any log messages in the recent timeframe\n- No debug, info, warning, or trace messages were captured\n- Application might be idle or not actively processing requests\n\n**Next debugging steps:**\n\n1. **If investigating application behavior:**\n - Have user interact with the application (navigate pages, submit forms, trigger features)\n - Run this tool again after user activity to capture runtime logs\n - Logs appear in real-time as your application executes\n\n2. **If checking for specific functionality:**\n - Trigger the feature or workflow you're investigating\n - Look for custom logging statements in your code\n - Consider adding more logging to critical paths if needed\n\n3. **If monitoring general health:**\n - Check that logging is properly configured in your application\n - Verify that Spotlight is correctly capturing your log output\n - Test with known log-generating actions (API calls, database operations)\n\n4. **Expand search timeframe:**\n - Use a longer duration (300+ seconds) to capture older log entries\n - Consider that some operations might generate logs less frequently\n\n**Log Levels to expect:**\n- **INFO**: General application flow and significant events\n- **WARN**: Potential issues or important notices\n- **DEBUG**: Detailed execution information\n- **ERROR**: Failures (also check search_errors tool)\n\n**Pro tip:** Absence of logs doesn't mean your application isn't working - it might just be running quietly. Many applications only log during significant events, errors, or when explicitly configured for verbose logging.`,\n },\n ],\n};\n"],"names":[],"mappings":"AAEO,MAAM,oBAAoC;AAAA,EAC/C,SAAS;AAAA,IACP;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,EAyBR;AAEJ;AAEO,MAAM,kBAAkC;AAAA,EAC7C,SAAS;AAAA,IACP;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,EAmCR;AAEJ;"}
1
+ {"version":3,"file":"constants.js","sources":["../../../src/server/mcp/constants.ts"],"sourcesContent":["import type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\n\nexport const NO_ERRORS_CONTENT: CallToolResult = {\n content: [\n {\n type: \"text\",\n text: `**No errors detected in Spotlight**\n\n**This means:**\n- Application is currently running without runtime failures\n- No crashes, exceptions, or critical issues in the recent timeframe\n- System appears stable at the moment\n\n**Next debugging steps:**\n\n1. **If user reports a specific issue:**\n - Ask them to reproduce the problem (click the button, submit the form, navigate to the page)\n - Run this tool again immediately after they reproduce it\n - Errors will appear in real-time as they happen\n\n2. **If investigating existing code:**\n - Check application logs separately\n - Look for TODO comments, error handling gaps, or potential edge cases in the code\n - Consider testing error scenarios (invalid inputs, network failures, etc.)\n\n3. **Proactive error detection:**\n - Have user interact with recently changed features\n - Test API endpoints or database operations that might be fragile\n - Check pages/features mentioned in recent commits\n\n** Pro tip:** Absence of errors doesn't mean absence of bugs - it just means no runtime failures occurred recently. The issue might be logical errors, UI problems, or dormant bugs waiting for specific conditions.`,\n },\n ],\n};\n\nexport const NO_LOGS_CONTENT: CallToolResult = {\n content: [\n {\n type: \"text\",\n text: `**No logs detected in Spotlight**\n\n**This means:**\n- Application hasn't generated any log messages in the recent timeframe\n- No debug, info, warning, or trace messages were captured\n- Application might be idle or not actively processing requests\n\n**Next debugging steps:**\n\n1. **If investigating application behavior:**\n - Have user interact with the application (navigate pages, submit forms, trigger features)\n - Run this tool again after user activity to capture runtime logs\n - Logs appear in real-time as your application executes\n\n2. **If checking for specific functionality:**\n - Trigger the feature or workflow you're investigating\n - Look for custom logging statements in your code\n - Consider adding more logging to critical paths if needed\n\n3. **If monitoring general health:**\n - Check that logging is properly configured in your application\n - Verify that Spotlight is correctly capturing your log output\n - Test with known log-generating actions (API calls, database operations)\n\n4. **Expand search timeframe:**\n - Use a longer duration (300+ seconds) to capture older log entries\n - Consider that some operations might generate logs less frequently\n\n**Log Levels to expect:**\n- **INFO**: General application flow and significant events\n- **WARN**: Potential issues or important notices\n- **DEBUG**: Detailed execution information\n- **ERROR**: Failures (also check search_errors tool)\n\n**Pro tip:** Absence of logs doesn't mean your application isn't working - it might just be running quietly. Many applications only log during significant events, errors, or when explicitly configured for verbose logging.`,\n },\n ],\n};\n"],"names":[],"mappings":";;;;;;;;;AAEO,MAAM,oBAAoC;AAAA,EAC/C,SAAS;AAAA,IACP;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,EAyBR;AAEJ;AAEO,MAAM,kBAAkC;AAAA,EAC7C,SAAS;AAAA,IACP;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,EAmCR;AAEJ;"}
@@ -1,3 +1,11 @@
1
+ ;
2
+ !function() {
3
+ try {
4
+ var e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : {}, n = new e.Error().stack;
5
+ n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "4dfd1d6f-cad0-48a4-80aa-d3a87152e8ba", e._sentryDebugIdIdentifier = "sentry-dbid-4dfd1d6f-cad0-48a4-80aa-d3a87152e8ba");
6
+ } catch (e2) {
7
+ }
8
+ }();
1
9
  import { McpServer } from "../../node_modules/.pnpm/@modelcontextprotocol_sdk@1.16.0/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js";
2
10
  import { wrapMcpServerWithSentry, captureException } from "@sentry/node";
3
11
  import { z } from "zod";
@@ -7,7 +15,11 @@ import { extractTracesFromEnvelopes, formatTraceSummary, buildSpanTree, renderSp
7
15
  import { getBuffer } from "../utils/getBuffer.js";
8
16
  import "../parser/helpers.js";
9
17
  import "uuidv7";
18
+ import "../../_virtual/_sentry-release-injection-file.js";
10
19
  import "node:http";
20
+ import "node:dns/promises";
21
+ import "node:net";
22
+ import "node:os";
11
23
  import { NO_ERRORS_CONTENT, NO_LOGS_CONTENT } from "./constants.js";
12
24
  const inputSchema = {
13
25
  filters: z.union([
@@ -46,7 +58,7 @@ function createMCPInstance() {
46
58
  const mcp = wrapMcpServerWithSentry(
47
59
  new McpServer({
48
60
  name: "spotlight-mcp",
49
- version: String("4.6.0")
61
+ version: String("4.7.1")
50
62
  })
51
63
  );
52
64
  mcp.registerTool(
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.js","sources":["../../../src/server/mcp/mcp.ts"],"sourcesContent":["import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { TextContent } from \"@modelcontextprotocol/sdk/types.js\";\nimport { captureException, wrapMcpServerWithSentry } from \"@sentry/node\";\nimport { z } from \"zod\";\nimport { formatErrorEnvelope } from \"../formatters/md/errors.ts\";\nimport { formatLogEnvelope } from \"../formatters/md/logs.ts\";\nimport {\n buildSpanTree,\n extractTracesFromEnvelopes,\n formatTraceSummary,\n renderSpanTree,\n} from \"../formatters/md/traces.ts\";\nimport { getBuffer } from \"../utils/index.ts\";\nimport { NO_ERRORS_CONTENT, NO_LOGS_CONTENT } from \"./constants.ts\";\n\nconst inputSchema = {\n filters: z.union([\n z.object({\n timeWindow: z\n .number()\n .describe(\n \"Number of seconds to look back from now. Examples: 60 = last minute, 300 = last 5 minutes, 3600 = last hour. Default: 60\",\n ),\n }),\n z.object({\n filename: z\n .string()\n .describe(\n \"Exact filename to search in stack traces or logs. Examples: 'Button.tsx', 'auth.js', 'api/routes.ts'. Case-sensitive.\",\n ),\n }),\n /**\n * TODO: Need to check, if this approach is better then a cursor based approach,\n * where the user can pass `events since [event_id]` as \"last N events\" is a\n * moving target as events keep coming in.\n *\n * https://github.com/getsentry/spotlight/pull/968#discussion_r2391587907\n */\n z\n .object({\n limit: z.number().describe(\"Maximum number of results to return. Examples: 10, 20, 50. Default: no limit\"),\n offset: z\n .number()\n .default(0)\n .describe(\n \"Number of results to skip from the beginning. Examples: 0 = start from first, 10 = skip first 10. Default: 0\",\n ),\n })\n .optional()\n .describe(\"Pagination: Use when timeWindow doesn't work or for browsing through many results\"),\n ]),\n};\n\nexport type InputSchema = { [K in keyof typeof inputSchema]: z.infer<(typeof inputSchema)[K]> };\n\nfunction applyPagination<T>(envelopes: T[], pagination: InputSchema[\"filters\"]) {\n if (pagination == null || !(\"limit\" in pagination)) {\n return envelopes;\n }\n\n return envelopes.slice(pagination.offset, pagination.offset + pagination.limit);\n}\n\nexport function createMCPInstance() {\n const mcp = wrapMcpServerWithSentry(\n new McpServer({\n name: \"spotlight-mcp\",\n version: String(process.env.npm_package_version),\n }),\n );\n\n mcp.registerTool(\n \"search_errors\",\n {\n title: \"Search Application Errors\",\n description: `**Purpose:** Search for runtime errors, exceptions, and crashes captured by Spotlight across your entire application stack.\n\n**CRITICAL: Call this tool IMMEDIATELY when:**\n- User says \"error\", \"broken\", \"not working\", \"failing\", \"crash\", \"bug\", \"issue\"\n- You encounter errors during testing or code execution\n- Before and after making code changes to verify no regressions\n- Investigating any unexpected behavior or performance problems\n- Error messages and exception details\n- Request/response context for API failures\n- Browser/device info when available\n\n**Returns:**\n• Full stack traces with exact file:line locations\n\n**When to use:**\n- User reports \"error\", \"broken\", \"not working\", \"crash\", \"bug\"\n- After code changes to verify no regressions\n- Investigating unexpected behavior or failures\n- Debugging specific file errors\n\n**Example calls:**\n\\`\\`\\`json\n// Example 1: Check last minute for any errors\nsearch_errors({ filters: { timeWindow: 60 } })\n\n// Example 2: Find errors in specific file\nsearch_errors({ filters: { filename: \"auth.tsx\" } })\n\n// Example 3: Get last 10 errors with pagination\nsearch_errors({ filters: { limit: 10, offset: 0 } })\n\\`\\`\\`\n\n**Parameter hints:**\n• filters.timeWindow: Seconds to look back (60 = 1 min, 300 = 5 min, 3600 = 1 hour)\n• filters.filename: Exact filename in stack trace (e.g., \"Button.tsx\", \"api.js\")\n• filters.limit/offset: For pagination through many errors`,\n inputSchema,\n },\n async args => {\n const envelopes = getBuffer().read(args.filters);\n\n if (envelopes.length === 0) {\n return NO_ERRORS_CONTENT;\n }\n\n const content: TextContent[] = [];\n for (const envelope of envelopes) {\n try {\n const events = await formatErrorEnvelope(envelope);\n\n if (events?.length) {\n for (const event of events) {\n content.push({\n type: \"text\",\n text: event,\n });\n }\n }\n } catch (err) {\n captureException(err, { extra: { context: \"Error formatting error envelope in MCP\" } });\n }\n }\n\n if (content.length === 0) {\n return NO_ERRORS_CONTENT;\n }\n\n return {\n content: applyPagination(content, args.filters),\n };\n },\n );\n\n mcp.registerTool(\n \"search_logs\",\n {\n title: \"Search Application Logs\",\n description: `**Purpose:** Search for application logs to understand behavior, debug issues, and trace execution flow across your stack.\n\n**NOT for:** Error diagnostics (use search_errors for exceptions/crashes). This tool is for info, warn, debug, and trace messages.\n\n**Returns:**\n• Timestamped log entries with severity levels (info, warn, debug)\n• Custom application messages and debug output\n• API request/response logs with timing\n• Database query logs and performance metrics\n\n**When to use:**\n- Understanding application flow and behavior\n- User mentions \"logs\", \"debugging\", \"trace\"\n- Checking what the app is doing internally\n- Performance investigation and timing analysis\n\n**Example calls:**\n\\`\\`\\`json\n// Example 1: Check last 5 minutes of logs\nsearch_logs({ filters: { timeWindow: 300 } })\n\n// Example 2: Find logs from specific file\nsearch_logs({ filters: { filename: \"auth.ts\" } })\n\n// Example 3: Get recent 20 log entries\nsearch_logs({ filters: { limit: 20, offset: 0 } })\n\\`\\`\\`\n\n## Workflow Pattern:\n1. User reports behavior question → **Call search_logs** \n2. User tests new feature → **Check logs for expected output**\n3. Performance concerns → **Look for timing patterns in logs**\n4. Debugging complex flows → **Trace execution through log timeline**\n5. **Use with search_errors** for complete debugging picture\n\n**Key trigger phrases:**\n- \"How does X work?\" → See runtime execution flow\n- \"Is the app doing Y?\" → Check for specific log patterns \n- \"Performance seems off\" → Look for timing/resource logs\n- \"Debug this feature\" → Follow execution path through logs\n- \"What's happening when...\" → Real-time application behavior\n\n**Log Levels Available:**\n- **INFO**: General application flow and significant events\n- **WARN**: Potential issues that don't break functionality \n- **DEBUG**: Detailed execution information for troubleshooting\n- **ERROR**: Actual failures (also available via search_errors)\n\n**Remember:** Logs show you what your application is actually doing, not just what the code says it should do. Use this for understanding real runtime behavior, performance patterns, and verifying that features work as intended.\n\n**Parameter hints:**\n• filters.timeWindow: Seconds to look back (60 = 1 min, 300 = 5 min, 3600 = 1 hour) \n• filters.filename: Exact filename generating logs (e.g., \"api.ts\", \"database.js\")\n• filters.limit/offset: For pagination through many log entries`,\n inputSchema,\n },\n async args => {\n const envelopes = getBuffer().read(args.filters);\n\n if (envelopes.length === 0) {\n return NO_LOGS_CONTENT;\n }\n\n const content: TextContent[] = [];\n for (const envelope of envelopes) {\n try {\n const events = await formatLogEnvelope(envelope);\n\n if (events?.length) {\n for (const event of events) {\n content.push({\n type: \"text\",\n text: event,\n });\n }\n }\n } catch (err) {\n captureException(err, { extra: { context: \"Error formatting log envelope in MCP\" } });\n }\n }\n\n if (content.length === 0) {\n return NO_LOGS_CONTENT;\n }\n\n return {\n content: applyPagination(content, args.filters),\n };\n },\n );\n\n mcp.registerTool(\n \"search_traces\",\n {\n title: \"Search Performance Traces\",\n description: `**Purpose:** Search for performance traces to identify slow requests, bottlenecks, and transaction patterns across your application.\n\n**USE THIS TOOL WHEN:**\n- Investigating application performance and request flows\n- User mentions \"traces\", \"performance\", \"slow requests\", \"tracing\"\n- Looking for distributed tracing data or transaction flows\n- Need to see high-level trace patterns before diving into details\n\n**Returns:**\n• List of traces with IDs, durations, and span counts\n• Root transaction names and total execution time\n• Error counts per trace for quick identification\n• Trace start timestamps for timeline analysis\n\n**When to use:**\n- Investigating performance issues or slow requests\n- User mentions \"traces\", \"performance\", \"slow\"\n- Finding specific transactions or requests\n- Overview of recent application activity\n\n**Example calls:**\n\\`\\`\\`json\n// Example 1: Get traces from last 5 minutes\nsearch_traces({ filters: { timeWindow: 300 } })\n\n// Example 2: Get 10 most recent traces\nsearch_traces({ filters: { limit: 10, offset: 0 } })\n\n// Example 3: Find traces involving specific file\nsearch_traces({ filters: { filename: \"api.ts\" } })\n\\`\\`\\`\n\n**Parameter hints:**\n• filters.timeWindow: Seconds to look back (60 = 1 min, 300 = 5 min)\n• filters.limit: Number of traces to return (e.g., 10, 20)\n• filters.offset: Skip first N traces for pagination\n**Key trigger phrases:**\n- \"Show me recent traces\" → Get trace overview\n- \"Performance issues\" → Look for slow traces\n- \"Request flows\" → See transaction patterns\n- \"Distributed tracing\" → View trace summaries\n\n**Next step:** Use get_traces with a trace ID to see detailed span breakdown`,\n inputSchema,\n },\n async args => {\n const envelopes = getBuffer().read(args.filters);\n\n if (envelopes.length === 0) {\n return {\n content: [\n {\n type: \"text\",\n text: \"No traces found in the specified time period. Make sure your application is instrumented with Sentry performance monitoring and try triggering some requests or transactions.\",\n },\n ],\n };\n }\n\n const traces = extractTracesFromEnvelopes(envelopes);\n\n if (traces.size === 0) {\n return {\n content: [\n {\n type: \"text\",\n text: \"No traces with trace context found. Ensure your Sentry SDK has performance monitoring enabled and is generating transaction events.\",\n },\n ],\n };\n }\n\n let content: TextContent[] = [];\n\n // Sort traces by start time (most recent first)\n const sortedTraces = Array.from(traces.values()).sort(\n (a, b) => (b.start_timestamp || 0) - (a.start_timestamp || 0),\n );\n\n content.push({\n type: \"text\",\n text: `# Local Traces (${sortedTraces.length} found)\\n\\nRecent traces from your application:\\n`,\n });\n\n for (const trace of sortedTraces.slice(0, 20)) {\n // Limit to 20 most recent\n content.push({\n type: \"text\",\n text: formatTraceSummary(trace),\n });\n }\n\n content = applyPagination(content, args.filters);\n\n content.push({\n type: \"text\",\n text: \"\\n**Next Steps:**\\nUse `get_traces` with a trace ID (e.g., first 8 characters shown above) to see the full span tree and detailed timing breakdown for any specific trace.\",\n });\n\n return { content };\n },\n );\n\n mcp.registerTool(\n \"get_traces\",\n {\n title: \"Get Trace Details\",\n description: `**Purpose:** Get the complete span tree and timing breakdown for a specific trace ID to analyze performance bottlenecks.\n\n**USE THIS TOOL WHEN:**\n- User provides a specific trace ID from \\`search_traces\\`\n- Want to see detailed span hierarchy and timing for a trace\n- Investigating performance bottlenecks within a specific request flow\n- Need to understand the complete execution path of a transaction\n\n**Returns:**\n• Hierarchical span tree with parent-child relationships\n• Individual span durations and operation names\n• Database queries, API calls, and render timings\n• Error details if spans failed\n\n**When to use:**\n- After finding a trace ID with search_traces\n- Investigating specific slow request or transaction\n- Understanding detailed execution flow\n- Finding performance bottlenecks in a trace\n\n**Example calls:**\n\\`\\`\\`json\n// Example 1: Get trace using short ID (first 8 chars)\nget_traces({ traceId: \"71a8c5e4\" })\n\n// Example 2: Get trace using full 32-char ID\nget_traces({ traceId: \"71a8c5e41ae1044dee67f50a07538fe7\" })\n\\`\\`\\`\n\n**Parameter hints:**\n• traceId: Trace identifier from search_traces\n - Can use first 8 characters (e.g., \"71a8c5e4\")\n - Or full 32-character hex string\n - Case-insensitive`,\n inputSchema: {\n traceId: z\n .string()\n .describe(\n \"Trace ID to retrieve. Format: 8 or 32 hex characters. Examples: '71a8c5e4' or '71a8c5e41ae1044dee67f50a07538fe7'\",\n ),\n },\n },\n async args => {\n // Getting all the envelopes\n const envelopes = getBuffer().read({ all: true });\n const traces = extractTracesFromEnvelopes(envelopes);\n\n // Find trace by full ID or partial ID match\n let targetTrace = traces.get(args.traceId);\n\n if (!targetTrace && args.traceId.length < 32) {\n // Try to find by partial ID\n for (const [traceId, trace] of traces) {\n if (traceId.startsWith(args.traceId)) {\n targetTrace = trace;\n break;\n }\n }\n }\n\n if (!targetTrace) {\n return {\n content: [\n {\n type: \"text\",\n text: `Trace \\`${args.traceId}\\` not found. Use \\`search_traces\\` to see available traces, or try expanding the time window if the trace is older.`,\n },\n ],\n };\n }\n\n const spanTree = buildSpanTree(targetTrace);\n\n // Just render the full span tree\n const treeLines = renderSpanTree(spanTree);\n\n return {\n content: [\n {\n type: \"text\",\n text: treeLines.join(\"\\n\"),\n },\n ],\n };\n },\n );\n\n return mcp;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp.js","sources":["../../../src/server/mcp/mcp.ts"],"sourcesContent":["import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { TextContent } from \"@modelcontextprotocol/sdk/types.js\";\nimport { captureException, wrapMcpServerWithSentry } from \"@sentry/node\";\nimport { z } from \"zod\";\nimport { formatErrorEnvelope } from \"../formatters/md/errors.ts\";\nimport { formatLogEnvelope } from \"../formatters/md/logs.ts\";\nimport {\n buildSpanTree,\n extractTracesFromEnvelopes,\n formatTraceSummary,\n renderSpanTree,\n} from \"../formatters/md/traces.ts\";\nimport { getBuffer } from \"../utils/index.ts\";\nimport { NO_ERRORS_CONTENT, NO_LOGS_CONTENT } from \"./constants.ts\";\n\nconst inputSchema = {\n filters: z.union([\n z.object({\n timeWindow: z\n .number()\n .describe(\n \"Number of seconds to look back from now. Examples: 60 = last minute, 300 = last 5 minutes, 3600 = last hour. Default: 60\",\n ),\n }),\n z.object({\n filename: z\n .string()\n .describe(\n \"Exact filename to search in stack traces or logs. Examples: 'Button.tsx', 'auth.js', 'api/routes.ts'. Case-sensitive.\",\n ),\n }),\n /**\n * TODO: Need to check, if this approach is better then a cursor based approach,\n * where the user can pass `events since [event_id]` as \"last N events\" is a\n * moving target as events keep coming in.\n *\n * https://github.com/getsentry/spotlight/pull/968#discussion_r2391587907\n */\n z\n .object({\n limit: z.number().describe(\"Maximum number of results to return. Examples: 10, 20, 50. Default: no limit\"),\n offset: z\n .number()\n .default(0)\n .describe(\n \"Number of results to skip from the beginning. Examples: 0 = start from first, 10 = skip first 10. Default: 0\",\n ),\n })\n .optional()\n .describe(\"Pagination: Use when timeWindow doesn't work or for browsing through many results\"),\n ]),\n};\n\nexport type InputSchema = { [K in keyof typeof inputSchema]: z.infer<(typeof inputSchema)[K]> };\n\nfunction applyPagination<T>(envelopes: T[], pagination: InputSchema[\"filters\"]) {\n if (pagination == null || !(\"limit\" in pagination)) {\n return envelopes;\n }\n\n return envelopes.slice(pagination.offset, pagination.offset + pagination.limit);\n}\n\nexport function createMCPInstance() {\n const mcp = wrapMcpServerWithSentry(\n new McpServer({\n name: \"spotlight-mcp\",\n version: String(process.env.npm_package_version),\n }),\n );\n\n mcp.registerTool(\n \"search_errors\",\n {\n title: \"Search Application Errors\",\n description: `**Purpose:** Search for runtime errors, exceptions, and crashes captured by Spotlight across your entire application stack.\n\n**CRITICAL: Call this tool IMMEDIATELY when:**\n- User says \"error\", \"broken\", \"not working\", \"failing\", \"crash\", \"bug\", \"issue\"\n- You encounter errors during testing or code execution\n- Before and after making code changes to verify no regressions\n- Investigating any unexpected behavior or performance problems\n- Error messages and exception details\n- Request/response context for API failures\n- Browser/device info when available\n\n**Returns:**\n• Full stack traces with exact file:line locations\n\n**When to use:**\n- User reports \"error\", \"broken\", \"not working\", \"crash\", \"bug\"\n- After code changes to verify no regressions\n- Investigating unexpected behavior or failures\n- Debugging specific file errors\n\n**Example calls:**\n\\`\\`\\`json\n// Example 1: Check last minute for any errors\nsearch_errors({ filters: { timeWindow: 60 } })\n\n// Example 2: Find errors in specific file\nsearch_errors({ filters: { filename: \"auth.tsx\" } })\n\n// Example 3: Get last 10 errors with pagination\nsearch_errors({ filters: { limit: 10, offset: 0 } })\n\\`\\`\\`\n\n**Parameter hints:**\n• filters.timeWindow: Seconds to look back (60 = 1 min, 300 = 5 min, 3600 = 1 hour)\n• filters.filename: Exact filename in stack trace (e.g., \"Button.tsx\", \"api.js\")\n• filters.limit/offset: For pagination through many errors`,\n inputSchema,\n },\n async args => {\n const envelopes = getBuffer().read(args.filters);\n\n if (envelopes.length === 0) {\n return NO_ERRORS_CONTENT;\n }\n\n const content: TextContent[] = [];\n for (const envelope of envelopes) {\n try {\n const events = await formatErrorEnvelope(envelope);\n\n if (events?.length) {\n for (const event of events) {\n content.push({\n type: \"text\",\n text: event,\n });\n }\n }\n } catch (err) {\n captureException(err, { extra: { context: \"Error formatting error envelope in MCP\" } });\n }\n }\n\n if (content.length === 0) {\n return NO_ERRORS_CONTENT;\n }\n\n return {\n content: applyPagination(content, args.filters),\n };\n },\n );\n\n mcp.registerTool(\n \"search_logs\",\n {\n title: \"Search Application Logs\",\n description: `**Purpose:** Search for application logs to understand behavior, debug issues, and trace execution flow across your stack.\n\n**NOT for:** Error diagnostics (use search_errors for exceptions/crashes). This tool is for info, warn, debug, and trace messages.\n\n**Returns:**\n• Timestamped log entries with severity levels (info, warn, debug)\n• Custom application messages and debug output\n• API request/response logs with timing\n• Database query logs and performance metrics\n\n**When to use:**\n- Understanding application flow and behavior\n- User mentions \"logs\", \"debugging\", \"trace\"\n- Checking what the app is doing internally\n- Performance investigation and timing analysis\n\n**Example calls:**\n\\`\\`\\`json\n// Example 1: Check last 5 minutes of logs\nsearch_logs({ filters: { timeWindow: 300 } })\n\n// Example 2: Find logs from specific file\nsearch_logs({ filters: { filename: \"auth.ts\" } })\n\n// Example 3: Get recent 20 log entries\nsearch_logs({ filters: { limit: 20, offset: 0 } })\n\\`\\`\\`\n\n## Workflow Pattern:\n1. User reports behavior question → **Call search_logs** \n2. User tests new feature → **Check logs for expected output**\n3. Performance concerns → **Look for timing patterns in logs**\n4. Debugging complex flows → **Trace execution through log timeline**\n5. **Use with search_errors** for complete debugging picture\n\n**Key trigger phrases:**\n- \"How does X work?\" → See runtime execution flow\n- \"Is the app doing Y?\" → Check for specific log patterns \n- \"Performance seems off\" → Look for timing/resource logs\n- \"Debug this feature\" → Follow execution path through logs\n- \"What's happening when...\" → Real-time application behavior\n\n**Log Levels Available:**\n- **INFO**: General application flow and significant events\n- **WARN**: Potential issues that don't break functionality \n- **DEBUG**: Detailed execution information for troubleshooting\n- **ERROR**: Actual failures (also available via search_errors)\n\n**Remember:** Logs show you what your application is actually doing, not just what the code says it should do. Use this for understanding real runtime behavior, performance patterns, and verifying that features work as intended.\n\n**Parameter hints:**\n• filters.timeWindow: Seconds to look back (60 = 1 min, 300 = 5 min, 3600 = 1 hour) \n• filters.filename: Exact filename generating logs (e.g., \"api.ts\", \"database.js\")\n• filters.limit/offset: For pagination through many log entries`,\n inputSchema,\n },\n async args => {\n const envelopes = getBuffer().read(args.filters);\n\n if (envelopes.length === 0) {\n return NO_LOGS_CONTENT;\n }\n\n const content: TextContent[] = [];\n for (const envelope of envelopes) {\n try {\n const events = await formatLogEnvelope(envelope);\n\n if (events?.length) {\n for (const event of events) {\n content.push({\n type: \"text\",\n text: event,\n });\n }\n }\n } catch (err) {\n captureException(err, { extra: { context: \"Error formatting log envelope in MCP\" } });\n }\n }\n\n if (content.length === 0) {\n return NO_LOGS_CONTENT;\n }\n\n return {\n content: applyPagination(content, args.filters),\n };\n },\n );\n\n mcp.registerTool(\n \"search_traces\",\n {\n title: \"Search Performance Traces\",\n description: `**Purpose:** Search for performance traces to identify slow requests, bottlenecks, and transaction patterns across your application.\n\n**USE THIS TOOL WHEN:**\n- Investigating application performance and request flows\n- User mentions \"traces\", \"performance\", \"slow requests\", \"tracing\"\n- Looking for distributed tracing data or transaction flows\n- Need to see high-level trace patterns before diving into details\n\n**Returns:**\n• List of traces with IDs, durations, and span counts\n• Root transaction names and total execution time\n• Error counts per trace for quick identification\n• Trace start timestamps for timeline analysis\n\n**When to use:**\n- Investigating performance issues or slow requests\n- User mentions \"traces\", \"performance\", \"slow\"\n- Finding specific transactions or requests\n- Overview of recent application activity\n\n**Example calls:**\n\\`\\`\\`json\n// Example 1: Get traces from last 5 minutes\nsearch_traces({ filters: { timeWindow: 300 } })\n\n// Example 2: Get 10 most recent traces\nsearch_traces({ filters: { limit: 10, offset: 0 } })\n\n// Example 3: Find traces involving specific file\nsearch_traces({ filters: { filename: \"api.ts\" } })\n\\`\\`\\`\n\n**Parameter hints:**\n• filters.timeWindow: Seconds to look back (60 = 1 min, 300 = 5 min)\n• filters.limit: Number of traces to return (e.g., 10, 20)\n• filters.offset: Skip first N traces for pagination\n**Key trigger phrases:**\n- \"Show me recent traces\" → Get trace overview\n- \"Performance issues\" → Look for slow traces\n- \"Request flows\" → See transaction patterns\n- \"Distributed tracing\" → View trace summaries\n\n**Next step:** Use get_traces with a trace ID to see detailed span breakdown`,\n inputSchema,\n },\n async args => {\n const envelopes = getBuffer().read(args.filters);\n\n if (envelopes.length === 0) {\n return {\n content: [\n {\n type: \"text\",\n text: \"No traces found in the specified time period. Make sure your application is instrumented with Sentry performance monitoring and try triggering some requests or transactions.\",\n },\n ],\n };\n }\n\n const traces = extractTracesFromEnvelopes(envelopes);\n\n if (traces.size === 0) {\n return {\n content: [\n {\n type: \"text\",\n text: \"No traces with trace context found. Ensure your Sentry SDK has performance monitoring enabled and is generating transaction events.\",\n },\n ],\n };\n }\n\n let content: TextContent[] = [];\n\n // Sort traces by start time (most recent first)\n const sortedTraces = Array.from(traces.values()).sort(\n (a, b) => (b.start_timestamp || 0) - (a.start_timestamp || 0),\n );\n\n content.push({\n type: \"text\",\n text: `# Local Traces (${sortedTraces.length} found)\\n\\nRecent traces from your application:\\n`,\n });\n\n for (const trace of sortedTraces.slice(0, 20)) {\n // Limit to 20 most recent\n content.push({\n type: \"text\",\n text: formatTraceSummary(trace),\n });\n }\n\n content = applyPagination(content, args.filters);\n\n content.push({\n type: \"text\",\n text: \"\\n**Next Steps:**\\nUse `get_traces` with a trace ID (e.g., first 8 characters shown above) to see the full span tree and detailed timing breakdown for any specific trace.\",\n });\n\n return { content };\n },\n );\n\n mcp.registerTool(\n \"get_traces\",\n {\n title: \"Get Trace Details\",\n description: `**Purpose:** Get the complete span tree and timing breakdown for a specific trace ID to analyze performance bottlenecks.\n\n**USE THIS TOOL WHEN:**\n- User provides a specific trace ID from \\`search_traces\\`\n- Want to see detailed span hierarchy and timing for a trace\n- Investigating performance bottlenecks within a specific request flow\n- Need to understand the complete execution path of a transaction\n\n**Returns:**\n• Hierarchical span tree with parent-child relationships\n• Individual span durations and operation names\n• Database queries, API calls, and render timings\n• Error details if spans failed\n\n**When to use:**\n- After finding a trace ID with search_traces\n- Investigating specific slow request or transaction\n- Understanding detailed execution flow\n- Finding performance bottlenecks in a trace\n\n**Example calls:**\n\\`\\`\\`json\n// Example 1: Get trace using short ID (first 8 chars)\nget_traces({ traceId: \"71a8c5e4\" })\n\n// Example 2: Get trace using full 32-char ID\nget_traces({ traceId: \"71a8c5e41ae1044dee67f50a07538fe7\" })\n\\`\\`\\`\n\n**Parameter hints:**\n• traceId: Trace identifier from search_traces\n - Can use first 8 characters (e.g., \"71a8c5e4\")\n - Or full 32-character hex string\n - Case-insensitive`,\n inputSchema: {\n traceId: z\n .string()\n .describe(\n \"Trace ID to retrieve. Format: 8 or 32 hex characters. Examples: '71a8c5e4' or '71a8c5e41ae1044dee67f50a07538fe7'\",\n ),\n },\n },\n async args => {\n // Getting all the envelopes\n const envelopes = getBuffer().read({ all: true });\n const traces = extractTracesFromEnvelopes(envelopes);\n\n // Find trace by full ID or partial ID match\n let targetTrace = traces.get(args.traceId);\n\n if (!targetTrace && args.traceId.length < 32) {\n // Try to find by partial ID\n for (const [traceId, trace] of traces) {\n if (traceId.startsWith(args.traceId)) {\n targetTrace = trace;\n break;\n }\n }\n }\n\n if (!targetTrace) {\n return {\n content: [\n {\n type: \"text\",\n text: `Trace \\`${args.traceId}\\` not found. Use \\`search_traces\\` to see available traces, or try expanding the time window if the trace is older.`,\n },\n ],\n };\n }\n\n const spanTree = buildSpanTree(targetTrace);\n\n // Just render the full span tree\n const treeLines = renderSpanTree(spanTree);\n\n return {\n content: [\n {\n type: \"text\",\n text: treeLines.join(\"\\n\"),\n },\n ],\n };\n },\n );\n\n return mcp;\n}\n"],"names":[],"mappings":"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"}
@@ -1,5 +1,14 @@
1
+ ;
2
+ !function() {
3
+ try {
4
+ var e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : {}, n = new e.Error().stack;
5
+ n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "98dc6173-0a89-45db-b4c6-b2c437867d36", e._sentryDebugIdIdentifier = "sentry-dbid-98dc6173-0a89-45db-b4c6-b2c437867d36");
6
+ } catch (e2) {
7
+ }
8
+ }();
1
9
  import { UUID, uuidv7 } from "uuidv7";
2
10
  import { EventContainer } from "./utils/eventContainer.js";
11
+ import "../_virtual/_sentry-release-injection-file.js";
3
12
  class MessageBuffer {
4
13
  size;
5
14
  items;
@@ -1 +1 @@
1
- {"version":3,"file":"messageBuffer.js","sources":["../../src/server/messageBuffer.ts"],"sourcesContent":["import { UUID, uuidv7 } from \"uuidv7\";\nimport type { InputSchema } from \"./mcp/mcp.ts\";\nimport { EventContainer } from \"./utils/eventContainer.ts\";\n\nexport class MessageBuffer<T> {\n private size: number;\n private items: [number, T][];\n private writePos = 0;\n private head = 0;\n private readers = new Map<string, { tid?: NodeJS.Immediate; pos: number; callback: (item: T) => void }>();\n private filenameCache = new Map<string, Set<string>>();\n\n constructor(size = 500) {\n this.size = size;\n this.items = new Array(size);\n }\n\n /**\n * Binary search for an event by its envelope ID (UUIDv7).\n * Returns the position of the event, or -1 if not found.\n * Takes advantage of UUIDv7's time-ordered property.\n */\n private binarySearchEventId(targetId: string): number {\n let left = this.head;\n let right = this.writePos - 1;\n\n // Parse and validate the target UUID\n let targetUuid: UUID;\n try {\n targetUuid = UUID.parse(targetId);\n } catch {\n // Invalid UUID format, cannot find\n return -1;\n }\n\n while (left <= right) {\n const mid = Math.floor((left + right) / 2);\n const item = this.items[mid % this.size];\n\n // Skip null items or non-EventContainer items\n if (item == null || !(item[1] instanceof EventContainer)) {\n // Linear scan nearby to handle gaps\n let boundsAdjusted = false;\n\n // Check left side\n for (let i = mid - 1; i >= left; i--) {\n const leftItem = this.items[i % this.size];\n if (leftItem && leftItem[1] instanceof EventContainer) {\n const envelope = leftItem[1].getParsedEnvelope();\n if (envelope?.envelope) {\n const envelopeId = envelope.envelope[0].__spotlight_envelope_id;\n const isEqual = envelopeId.compareTo(targetUuid);\n if (isEqual === 0) {\n return i;\n }\n // Adjust search bounds based on comparison\n if (isEqual < 0) {\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n boundsAdjusted = true;\n break;\n }\n }\n }\n\n // Check right side if left didn't help\n if (!boundsAdjusted) {\n for (let i = mid + 1; i <= right; i++) {\n const rightItem = this.items[i % this.size];\n if (rightItem && rightItem[1] instanceof EventContainer) {\n const envelope = rightItem[1].getParsedEnvelope();\n if (envelope?.envelope) {\n const envelopeId = envelope.envelope[0].__spotlight_envelope_id;\n const isEqual = envelopeId.compareTo(targetUuid);\n if (isEqual === 0) {\n return i;\n }\n // Adjust search bounds\n if (isEqual < 0) {\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n boundsAdjusted = true;\n break;\n }\n }\n }\n }\n\n // If both scans failed to find a valid item, skip past this gap\n // to avoid infinite loop\n if (!boundsAdjusted) {\n left = mid + 1;\n }\n\n continue;\n }\n\n const envelope = item[1].getParsedEnvelope();\n if (!envelope?.envelope) {\n // Skip invalid envelopes, move to next\n left = mid + 1;\n continue;\n }\n\n const envelopeId = envelope.envelope[0].__spotlight_envelope_id;\n\n const isEqual = envelopeId.compareTo(targetUuid);\n if (isEqual === 0) {\n // Found exact match\n return mid;\n }\n\n if (isEqual < 0) {\n // Target is in the right half (later in time)\n left = mid + 1;\n } else {\n // Target is in the left half (earlier in time)\n right = mid - 1;\n }\n }\n\n return -1;\n }\n\n put(item: T): void {\n const curTime = new Date().getTime();\n\n // Remove old value from filename cache\n const oldValue = this.items[this.writePos % this.size];\n if (oldValue && oldValue[1] instanceof EventContainer) {\n const envelope = oldValue[1].getParsedEnvelope();\n if (envelope?.envelope) {\n const deletedEnvelopeId = envelope.envelope[0].__spotlight_envelope_id.toString();\n const goneFiles = new Set<string>();\n for (const [filename, envelopeIds] of this.filenameCache.entries()) {\n envelopeIds.delete(deletedEnvelopeId);\n if (envelopeIds.size === 0) {\n goneFiles.add(filename);\n }\n }\n\n for (const filename of goneFiles) {\n this.filenameCache.delete(filename);\n }\n }\n }\n\n this.items[this.writePos % this.size] = [curTime, item];\n this.writePos += 1;\n if (this.writePos - this.head > this.size) {\n this.head = this.writePos - this.size;\n }\n\n // Update filename cache\n if (item instanceof EventContainer) {\n const envelope = item.getParsedEnvelope();\n if (envelope?.envelope) {\n const spotlightEnvelopeId = envelope.envelope[0].__spotlight_envelope_id.toString();\n const events = envelope.envelope[1] ?? [];\n\n for (const event of events) {\n const [, payload] = event;\n const values = typeof payload === \"object\" && \"exception\" in payload && payload.exception?.values;\n if (values) {\n for (const value of values) {\n const frames = value.stacktrace?.frames;\n if (frames) {\n for (const frame of frames) {\n const filename = frame.filename;\n if (filename) {\n const envelopeIds = this.filenameCache.get(filename);\n if (envelopeIds) {\n envelopeIds.add(spotlightEnvelopeId);\n } else {\n this.filenameCache.set(filename, new Set([spotlightEnvelopeId]));\n }\n }\n }\n }\n }\n }\n }\n }\n }\n\n // Calling subscribers\n for (const [readerId, readerInfo] of this.readers.entries()) {\n if (readerInfo.tid) {\n clearImmediate(readerInfo.tid);\n }\n\n readerInfo.tid = setImmediate(() => this.stream(readerId));\n readerInfo.tid.unref();\n }\n }\n\n subscribe(callback: (item: T) => void, lastEventId?: string): string {\n const readerId = uuidv7();\n\n // Determine starting position based on lastEventId\n let startPos = this.head;\n if (lastEventId) {\n // Binary search for lastEventId (UUIDv7 is time-ordered)\n // Since buffer is chronologically ordered, we can use binary search\n const foundPos = this.binarySearchEventId(lastEventId);\n if (foundPos !== -1) {\n // Start from the position after the found event\n startPos = foundPos + 1;\n }\n // If lastEventId not found, startPos remains at this.head (normal behavior)\n }\n\n const readerInfo = {\n callback,\n pos: startPos,\n tid: setImmediate(() => this.stream(readerId)),\n };\n readerInfo.tid.unref();\n this.readers.set(readerId, readerInfo);\n\n return readerId;\n }\n\n unsubscribe(readerId: string): void {\n const readerInfo = this.readers.get(readerId);\n // Clearing any pending timeouts\n if (readerInfo?.tid) {\n clearImmediate(readerInfo.tid);\n }\n\n this.readers.delete(readerId);\n }\n\n stream(readerId: string): void {\n const readerInfo = this.readers.get(readerId);\n if (!readerInfo) return;\n const { pos, callback } = readerInfo;\n\n let atReadPos = pos < this.head ? this.head : pos;\n let item: [number, T] | undefined;\n /* eslint-disable no-constant-condition */\n while (true) {\n item = this.items[atReadPos % this.size];\n // atReadPos >= this.writePos prevents the case where we have a full buffer\n if (typeof item === \"undefined\" || atReadPos >= this.writePos) {\n break;\n }\n callback(item[1]);\n atReadPos += 1;\n }\n\n // No need to `this.readers.set` again, as `readerInfo` is a reference\n readerInfo.pos = atReadPos;\n }\n\n /**\n * hard reset: drops items and resets cursors.\n */\n clear(): void {\n this.writePos = 0;\n this.reset();\n\n for (const readerInfo of this.readers.values()) {\n if (readerInfo.tid) {\n clearImmediate(readerInfo.tid);\n }\n\n readerInfo.tid = undefined;\n readerInfo.pos = this.head;\n }\n }\n\n /**\n * soft reset: clears buffered items but preserves subscribers\n * do not set head or writePos to `0` as subscribers retain their\n * readPos which would mess things up if we suddenly reset everything\n * to 0.\n */\n reset(): void {\n this.items = new Array(this.size);\n this.head = this.writePos;\n\n // Clear filename cache\n this.filenameCache.clear();\n }\n\n read(filters: ReadFilter = { timeWindow: 60 }): T[] {\n const result: T[] = [];\n const start = this.head;\n const end = this.writePos;\n\n const filterHandlers = [];\n for (const key of Object.keys(filters)) {\n if (this.filterHandlers[key]) {\n filterHandlers.push(this.filterHandlers[key]);\n }\n }\n\n for (let i = end - 1; i >= start; i--) {\n const item = this.items[i % this.size];\n\n if (item == null) continue;\n\n // Check if the item passes all filters\n if (filterHandlers.every(handler => handler(item, filters, { filenameCache: this.filenameCache }))) {\n result.push(item[1]);\n }\n }\n\n return result;\n }\n\n filterHandlers: Record<\n keyof ReadFilter | string,\n (item: [number, T], value: NonNullable<ReadFilter>, ctx: { filenameCache: Map<string, Set<string>> }) => boolean\n > = {\n timeWindow: (item, value) => {\n if (!(\"timeWindow\" in value)) {\n return true;\n }\n\n return item[0] > Date.now() - value.timeWindow * 1000;\n },\n envelopeId: (item, value) => {\n if (!(\"envelopeId\" in value) || value.envelopeId == null) {\n return true;\n }\n\n const data = (item[1] as EventContainer).getParsedEnvelope();\n\n return data.envelope[0].__spotlight_envelope_id.equals(UUID.parse(value.envelopeId));\n },\n filename: (item, value, ctx) => {\n if (!(\"filename\" in value)) {\n return true;\n }\n\n const contents = (item[1] as EventContainer).getParsedEnvelope();\n const spotlightEnvelopeId = contents.envelope[0].__spotlight_envelope_id.toString();\n\n for (const [filename, envelopeIds] of ctx.filenameCache.entries()) {\n if (filename.endsWith(value.filename)) {\n if (envelopeIds.has(spotlightEnvelopeId)) {\n return true;\n }\n }\n }\n\n return false;\n },\n all: () => true,\n };\n}\n\nexport type ReadFilter =\n | InputSchema[\"filters\"]\n | {\n envelopeId: string;\n }\n | { all: true };\n"],"names":["envelope","envelopeId","isEqual"],"mappings":"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"}
1
+ {"version":3,"file":"messageBuffer.js","sources":["../../src/server/messageBuffer.ts"],"sourcesContent":["import { UUID, uuidv7 } from \"uuidv7\";\nimport type { InputSchema } from \"./mcp/mcp.ts\";\nimport { EventContainer } from \"./utils/eventContainer.ts\";\n\nexport class MessageBuffer<T> {\n private size: number;\n private items: [number, T][];\n private writePos = 0;\n private head = 0;\n private readers = new Map<string, { tid?: NodeJS.Immediate; pos: number; callback: (item: T) => void }>();\n private filenameCache = new Map<string, Set<string>>();\n\n constructor(size = 500) {\n this.size = size;\n this.items = new Array(size);\n }\n\n /**\n * Binary search for an event by its envelope ID (UUIDv7).\n * Returns the position of the event, or -1 if not found.\n * Takes advantage of UUIDv7's time-ordered property.\n */\n private binarySearchEventId(targetId: string): number {\n let left = this.head;\n let right = this.writePos - 1;\n\n // Parse and validate the target UUID\n let targetUuid: UUID;\n try {\n targetUuid = UUID.parse(targetId);\n } catch {\n // Invalid UUID format, cannot find\n return -1;\n }\n\n while (left <= right) {\n const mid = Math.floor((left + right) / 2);\n const item = this.items[mid % this.size];\n\n // Skip null items or non-EventContainer items\n if (item == null || !(item[1] instanceof EventContainer)) {\n // Linear scan nearby to handle gaps\n let boundsAdjusted = false;\n\n // Check left side\n for (let i = mid - 1; i >= left; i--) {\n const leftItem = this.items[i % this.size];\n if (leftItem && leftItem[1] instanceof EventContainer) {\n const envelope = leftItem[1].getParsedEnvelope();\n if (envelope?.envelope) {\n const envelopeId = envelope.envelope[0].__spotlight_envelope_id;\n const isEqual = envelopeId.compareTo(targetUuid);\n if (isEqual === 0) {\n return i;\n }\n // Adjust search bounds based on comparison\n if (isEqual < 0) {\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n boundsAdjusted = true;\n break;\n }\n }\n }\n\n // Check right side if left didn't help\n if (!boundsAdjusted) {\n for (let i = mid + 1; i <= right; i++) {\n const rightItem = this.items[i % this.size];\n if (rightItem && rightItem[1] instanceof EventContainer) {\n const envelope = rightItem[1].getParsedEnvelope();\n if (envelope?.envelope) {\n const envelopeId = envelope.envelope[0].__spotlight_envelope_id;\n const isEqual = envelopeId.compareTo(targetUuid);\n if (isEqual === 0) {\n return i;\n }\n // Adjust search bounds\n if (isEqual < 0) {\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n boundsAdjusted = true;\n break;\n }\n }\n }\n }\n\n // If both scans failed to find a valid item, skip past this gap\n // to avoid infinite loop\n if (!boundsAdjusted) {\n left = mid + 1;\n }\n\n continue;\n }\n\n const envelope = item[1].getParsedEnvelope();\n if (!envelope?.envelope) {\n // Skip invalid envelopes, move to next\n left = mid + 1;\n continue;\n }\n\n const envelopeId = envelope.envelope[0].__spotlight_envelope_id;\n\n const isEqual = envelopeId.compareTo(targetUuid);\n if (isEqual === 0) {\n // Found exact match\n return mid;\n }\n\n if (isEqual < 0) {\n // Target is in the right half (later in time)\n left = mid + 1;\n } else {\n // Target is in the left half (earlier in time)\n right = mid - 1;\n }\n }\n\n return -1;\n }\n\n put(item: T): void {\n const curTime = new Date().getTime();\n\n // Remove old value from filename cache\n const oldValue = this.items[this.writePos % this.size];\n if (oldValue && oldValue[1] instanceof EventContainer) {\n const envelope = oldValue[1].getParsedEnvelope();\n if (envelope?.envelope) {\n const deletedEnvelopeId = envelope.envelope[0].__spotlight_envelope_id.toString();\n const goneFiles = new Set<string>();\n for (const [filename, envelopeIds] of this.filenameCache.entries()) {\n envelopeIds.delete(deletedEnvelopeId);\n if (envelopeIds.size === 0) {\n goneFiles.add(filename);\n }\n }\n\n for (const filename of goneFiles) {\n this.filenameCache.delete(filename);\n }\n }\n }\n\n this.items[this.writePos % this.size] = [curTime, item];\n this.writePos += 1;\n if (this.writePos - this.head > this.size) {\n this.head = this.writePos - this.size;\n }\n\n // Update filename cache\n if (item instanceof EventContainer) {\n const envelope = item.getParsedEnvelope();\n if (envelope?.envelope) {\n const spotlightEnvelopeId = envelope.envelope[0].__spotlight_envelope_id.toString();\n const events = envelope.envelope[1] ?? [];\n\n for (const event of events) {\n const [, payload] = event;\n const values = typeof payload === \"object\" && \"exception\" in payload && payload.exception?.values;\n if (values) {\n for (const value of values) {\n const frames = value.stacktrace?.frames;\n if (frames) {\n for (const frame of frames) {\n const filename = frame.filename;\n if (filename) {\n const envelopeIds = this.filenameCache.get(filename);\n if (envelopeIds) {\n envelopeIds.add(spotlightEnvelopeId);\n } else {\n this.filenameCache.set(filename, new Set([spotlightEnvelopeId]));\n }\n }\n }\n }\n }\n }\n }\n }\n }\n\n // Calling subscribers\n for (const [readerId, readerInfo] of this.readers.entries()) {\n if (readerInfo.tid) {\n clearImmediate(readerInfo.tid);\n }\n\n readerInfo.tid = setImmediate(() => this.stream(readerId));\n readerInfo.tid.unref();\n }\n }\n\n subscribe(callback: (item: T) => void, lastEventId?: string): string {\n const readerId = uuidv7();\n\n // Determine starting position based on lastEventId\n let startPos = this.head;\n if (lastEventId) {\n // Binary search for lastEventId (UUIDv7 is time-ordered)\n // Since buffer is chronologically ordered, we can use binary search\n const foundPos = this.binarySearchEventId(lastEventId);\n if (foundPos !== -1) {\n // Start from the position after the found event\n startPos = foundPos + 1;\n }\n // If lastEventId not found, startPos remains at this.head (normal behavior)\n }\n\n const readerInfo = {\n callback,\n pos: startPos,\n tid: setImmediate(() => this.stream(readerId)),\n };\n readerInfo.tid.unref();\n this.readers.set(readerId, readerInfo);\n\n return readerId;\n }\n\n unsubscribe(readerId: string): void {\n const readerInfo = this.readers.get(readerId);\n // Clearing any pending timeouts\n if (readerInfo?.tid) {\n clearImmediate(readerInfo.tid);\n }\n\n this.readers.delete(readerId);\n }\n\n stream(readerId: string): void {\n const readerInfo = this.readers.get(readerId);\n if (!readerInfo) return;\n const { pos, callback } = readerInfo;\n\n let atReadPos = pos < this.head ? this.head : pos;\n let item: [number, T] | undefined;\n /* eslint-disable no-constant-condition */\n while (true) {\n item = this.items[atReadPos % this.size];\n // atReadPos >= this.writePos prevents the case where we have a full buffer\n if (typeof item === \"undefined\" || atReadPos >= this.writePos) {\n break;\n }\n callback(item[1]);\n atReadPos += 1;\n }\n\n // No need to `this.readers.set` again, as `readerInfo` is a reference\n readerInfo.pos = atReadPos;\n }\n\n /**\n * hard reset: drops items and resets cursors.\n */\n clear(): void {\n this.writePos = 0;\n this.reset();\n\n for (const readerInfo of this.readers.values()) {\n if (readerInfo.tid) {\n clearImmediate(readerInfo.tid);\n }\n\n readerInfo.tid = undefined;\n readerInfo.pos = this.head;\n }\n }\n\n /**\n * soft reset: clears buffered items but preserves subscribers\n * do not set head or writePos to `0` as subscribers retain their\n * readPos which would mess things up if we suddenly reset everything\n * to 0.\n */\n reset(): void {\n this.items = new Array(this.size);\n this.head = this.writePos;\n\n // Clear filename cache\n this.filenameCache.clear();\n }\n\n read(filters: ReadFilter = { timeWindow: 60 }): T[] {\n const result: T[] = [];\n const start = this.head;\n const end = this.writePos;\n\n const filterHandlers = [];\n for (const key of Object.keys(filters)) {\n if (this.filterHandlers[key]) {\n filterHandlers.push(this.filterHandlers[key]);\n }\n }\n\n for (let i = end - 1; i >= start; i--) {\n const item = this.items[i % this.size];\n\n if (item == null) continue;\n\n // Check if the item passes all filters\n if (filterHandlers.every(handler => handler(item, filters, { filenameCache: this.filenameCache }))) {\n result.push(item[1]);\n }\n }\n\n return result;\n }\n\n filterHandlers: Record<\n keyof ReadFilter | string,\n (item: [number, T], value: NonNullable<ReadFilter>, ctx: { filenameCache: Map<string, Set<string>> }) => boolean\n > = {\n timeWindow: (item, value) => {\n if (!(\"timeWindow\" in value)) {\n return true;\n }\n\n return item[0] > Date.now() - value.timeWindow * 1000;\n },\n envelopeId: (item, value) => {\n if (!(\"envelopeId\" in value) || value.envelopeId == null) {\n return true;\n }\n\n const data = (item[1] as EventContainer).getParsedEnvelope();\n\n return data.envelope[0].__spotlight_envelope_id.equals(UUID.parse(value.envelopeId));\n },\n filename: (item, value, ctx) => {\n if (!(\"filename\" in value)) {\n return true;\n }\n\n const contents = (item[1] as EventContainer).getParsedEnvelope();\n const spotlightEnvelopeId = contents.envelope[0].__spotlight_envelope_id.toString();\n\n for (const [filename, envelopeIds] of ctx.filenameCache.entries()) {\n if (filename.endsWith(value.filename)) {\n if (envelopeIds.has(spotlightEnvelopeId)) {\n return true;\n }\n }\n }\n\n return false;\n },\n all: () => true,\n };\n}\n\nexport type ReadFilter =\n | InputSchema[\"filters\"]\n | {\n envelopeId: string;\n }\n | { all: true };\n"],"names":["envelope","envelopeId","isEqual"],"mappings":"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"}
@@ -1,3 +1,12 @@
1
+ ;
2
+ !function() {
3
+ try {
4
+ var e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : {}, n = new e.Error().stack;
5
+ n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "534430d2-5700-41fb-8f22-854ff87aa672", e._sentryDebugIdIdentifier = "sentry-dbid-534430d2-5700-41fb-8f22-854ff87aa672");
6
+ } catch (e2) {
7
+ }
8
+ }();
9
+ import "../../_virtual/_sentry-release-injection-file.js";
1
10
  const ERROR_EVENT_TYPES = /* @__PURE__ */ new Set(["event", "error"]);
2
11
  const TRACE_EVENT_TYPES = /* @__PURE__ */ new Set(["transaction"]);
3
12
  const PROFILE_EVENT_TYPES = /* @__PURE__ */ new Set(["profile"]);
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sources":["../../../src/server/parser/helpers.ts"],"sourcesContent":["import type {\n SentryErrorEvent,\n SentryEvent,\n SentryLogEvent,\n SentryProfileV1Event,\n SentryTransactionEvent,\n} from \"./types.ts\";\n\nexport const ERROR_EVENT_TYPES = new Set([\"event\", \"error\"]);\nexport const TRACE_EVENT_TYPES = new Set([\"transaction\"]);\nexport const PROFILE_EVENT_TYPES = new Set([\"profile\"]);\nexport const LOG_EVENT_TYPES = new Set([\"log\"]);\nexport const SUPPORTED_EVENT_TYPES = new Set([\n ...ERROR_EVENT_TYPES,\n ...TRACE_EVENT_TYPES,\n ...PROFILE_EVENT_TYPES,\n ...LOG_EVENT_TYPES,\n]);\n\nexport function isErrorEvent(event: SentryEvent): event is SentryErrorEvent {\n const hasValidType = !event.type || ERROR_EVENT_TYPES.has(event.type);\n const hasException = Boolean((event as SentryErrorEvent).exception);\n const hasMessage = Boolean((event as SentryErrorEvent).message);\n return hasValidType && (hasException || hasMessage);\n}\n\nexport function isProfileEvent(event: SentryEvent): event is SentryProfileV1Event {\n return !!event.type && PROFILE_EVENT_TYPES.has(event.type) && (event as SentryProfileV1Event).version === \"1\";\n}\n\nexport function isTraceEvent(event: SentryEvent): event is SentryTransactionEvent {\n return !!event.type && TRACE_EVENT_TYPES.has(event.type);\n}\n\nexport function isLogEvent(event: SentryEvent): event is SentryLogEvent {\n return !!event.type && LOG_EVENT_TYPES.has(event.type);\n}\n"],"names":[],"mappings":"AAQO,MAAM,oBAAoB,oBAAI,IAAI,CAAC,SAAS,OAAO,CAAC;AACpD,MAAM,oBAAoB,oBAAI,IAAI,CAAC,aAAa,CAAC;AACjD,MAAM,sBAAsB,oBAAI,IAAI,CAAC,SAAS,CAAC;AAC/C,MAAM,kBAAkB,oBAAI,IAAI,CAAC,KAAK,CAAC;oBACL,IAAI;AAAA,EAC3C,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL,CAAC;AAEM,SAAS,aAAa,OAA+C;AAC1E,QAAM,eAAe,CAAC,MAAM,QAAQ,kBAAkB,IAAI,MAAM,IAAI;AACpE,QAAM,eAAe,QAAS,MAA2B,SAAS;AAClE,QAAM,aAAa,QAAS,MAA2B,OAAO;AAC9D,SAAO,iBAAiB,gBAAgB;AAC1C;AAMO,SAAS,aAAa,OAAqD;AAChF,SAAO,CAAC,CAAC,MAAM,QAAQ,kBAAkB,IAAI,MAAM,IAAI;AACzD;AAEO,SAAS,WAAW,OAA6C;AACtE,SAAO,CAAC,CAAC,MAAM,QAAQ,gBAAgB,IAAI,MAAM,IAAI;AACvD;"}
1
+ {"version":3,"file":"helpers.js","sources":["../../../src/server/parser/helpers.ts"],"sourcesContent":["import type {\n SentryErrorEvent,\n SentryEvent,\n SentryLogEvent,\n SentryProfileV1Event,\n SentryTransactionEvent,\n} from \"./types.ts\";\n\nexport const ERROR_EVENT_TYPES = new Set([\"event\", \"error\"]);\nexport const TRACE_EVENT_TYPES = new Set([\"transaction\"]);\nexport const PROFILE_EVENT_TYPES = new Set([\"profile\"]);\nexport const LOG_EVENT_TYPES = new Set([\"log\"]);\nexport const SUPPORTED_EVENT_TYPES = new Set([\n ...ERROR_EVENT_TYPES,\n ...TRACE_EVENT_TYPES,\n ...PROFILE_EVENT_TYPES,\n ...LOG_EVENT_TYPES,\n]);\n\nexport function isErrorEvent(event: SentryEvent): event is SentryErrorEvent {\n const hasValidType = !event.type || ERROR_EVENT_TYPES.has(event.type);\n const hasException = Boolean((event as SentryErrorEvent).exception);\n const hasMessage = Boolean((event as SentryErrorEvent).message);\n return hasValidType && (hasException || hasMessage);\n}\n\nexport function isProfileEvent(event: SentryEvent): event is SentryProfileV1Event {\n return !!event.type && PROFILE_EVENT_TYPES.has(event.type) && (event as SentryProfileV1Event).version === \"1\";\n}\n\nexport function isTraceEvent(event: SentryEvent): event is SentryTransactionEvent {\n return !!event.type && TRACE_EVENT_TYPES.has(event.type);\n}\n\nexport function isLogEvent(event: SentryEvent): event is SentryLogEvent {\n return !!event.type && LOG_EVENT_TYPES.has(event.type);\n}\n"],"names":[],"mappings":";;;;;;;;;AAQO,MAAM,oBAAoB,oBAAI,IAAI,CAAC,SAAS,OAAO,CAAC;AACpD,MAAM,oBAAoB,oBAAI,IAAI,CAAC,aAAa,CAAC;AACjD,MAAM,sBAAsB,oBAAI,IAAI,CAAC,SAAS,CAAC;AAC/C,MAAM,kBAAkB,oBAAI,IAAI,CAAC,KAAK,CAAC;oBACL,IAAI;AAAA,EAC3C,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL,CAAC;AAEM,SAAS,aAAa,OAA+C;AAC1E,QAAM,eAAe,CAAC,MAAM,QAAQ,kBAAkB,IAAI,MAAM,IAAI;AACpE,QAAM,eAAe,QAAS,MAA2B,SAAS;AAClE,QAAM,aAAa,QAAS,MAA2B,OAAO;AAC9D,SAAO,iBAAiB,gBAAgB;AAC1C;AAMO,SAAS,aAAa,OAAqD;AAChF,SAAO,CAAC,CAAC,MAAM,QAAQ,kBAAkB,IAAI,MAAM,IAAI;AACzD;AAEO,SAAS,WAAW,OAA6C;AACtE,SAAO,CAAC,CAAC,MAAM,QAAQ,gBAAgB,IAAI,MAAM,IAAI;AACvD;"}
@@ -1,5 +1,14 @@
1
+ ;
2
+ !function() {
3
+ try {
4
+ var e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : {}, n = new e.Error().stack;
5
+ n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "d55f5c02-7ecb-47d7-a83a-9d33687e2bd7", e._sentryDebugIdIdentifier = "sentry-dbid-d55f5c02-7ecb-47d7-a83a-9d33687e2bd7");
6
+ } catch (e2) {
7
+ }
8
+ }();
1
9
  import { uuidv7obj } from "uuidv7";
2
10
  import { RAW_TYPES } from "../../shared/constants.js";
11
+ import "../../_virtual/_sentry-release-injection-file.js";
3
12
  import { logger } from "../logger.js";
4
13
  const TEXT_CONTENT_TYPES = /* @__PURE__ */ new Set([
5
14
  "text/plain",
@@ -1 +1 @@
1
- {"version":3,"file":"processEnvelope.js","sources":["../../../src/server/parser/processEnvelope.ts"],"sourcesContent":["import type { Envelope, EnvelopeItem } from \"@sentry/core\";\nimport { type UUID, uuidv7obj } from \"uuidv7\";\nimport { RAW_TYPES } from \"../constants.ts\";\nimport { logger } from \"../logger.ts\";\nimport type { RawEventContext } from \"./types.ts\";\n\nexport type ParsedEnvelope = {\n envelope: [Envelope[0] & { __spotlight_envelope_id: UUID }, Envelope[1]];\n rawEnvelope: RawEventContext;\n};\n\nconst TEXT_CONTENT_TYPES = new Set([\n \"text/plain\",\n \"text/css\",\n \"text/csv\",\n \"text/html\",\n \"text/javascript\",\n \"text/json\",\n \"text/x-json\",\n \"application/json\",\n \"application/ld+json\",\n \"application/json\",\n]);\n\n/**\n * Implements parser for\n * @see https://develop.sentry.dev/sdk/envelopes/#serialization-format\n * @param rawEvent Envelope data\n * @param senderUserAgent Optional User-Agent header from the HTTP request sending the envelope\n * @returns parsed envelope\n */\nexport function processEnvelope(rawEvent: RawEventContext, senderUserAgent?: string): ParsedEnvelope | null {\n let buffer = typeof rawEvent.data === \"string\" ? Uint8Array.from(rawEvent.data, c => c.charCodeAt(0)) : rawEvent.data;\n\n function readLine(length?: number) {\n const cursor = length ?? getLineEnd(buffer);\n const line = buffer.subarray(0, cursor);\n buffer = buffer.subarray(cursor + 1);\n return line;\n }\n\n const envelopeHeader = parseJSONFromBuffer(readLine()) as Envelope[0];\n if (!envelopeHeader) {\n logger.error(\"Malformed envelope header, skipping...\");\n return null;\n }\n\n envelopeHeader.__spotlight_envelope_id = uuidv7obj();\n\n // Store sender User-Agent for improved SDK categorization\n if (senderUserAgent) {\n envelopeHeader.__spotlight_sender_user_agent = senderUserAgent;\n }\n\n const items: EnvelopeItem[] = [];\n while (buffer.length) {\n const itemHeader = parseJSONFromBuffer(readLine()) as EnvelopeItem[0];\n const payloadLength = itemHeader.length;\n const itemPayloadRaw = readLine(payloadLength);\n\n let itemPayload: EnvelopeItem[1];\n try {\n if (RAW_TYPES.has(itemHeader.type)) {\n const rawPayload = itemPayloadRaw as Buffer;\n if (\n !itemHeader.content_type &&\n // @ts-expect-error -- statsd is an old and deprecated event type but have envelopes for that\n itemHeader.type === \"statsd\"\n ) {\n // @ts-expect-error -- same as above\n itemHeader.content_type = \"text/plain\";\n }\n itemPayload = {\n data: rawPayload.toString(TEXT_CONTENT_TYPES.has(itemHeader.content_type as string) ? \"utf-8\" : \"base64\"),\n } as EnvelopeItem[1];\n } else {\n itemPayload = parseJSONFromBuffer(itemPayloadRaw);\n if (!itemPayload) {\n logger.error(itemHeader);\n } else if (itemHeader.type) {\n // data sanitization\n // @ts-expect-error ts(2339) -- We should really stop adding type to payloads\n itemPayload.type = itemHeader.type;\n }\n }\n } catch (err) {\n itemPayload = itemPayloadRaw;\n logger.error(err);\n }\n\n items.push([itemHeader, itemPayload] as EnvelopeItem);\n }\n\n return {\n envelope: [envelopeHeader, items] as ParsedEnvelope[\"envelope\"],\n rawEnvelope: rawEvent,\n };\n}\n\nfunction getLineEnd(data: Uint8Array): number {\n let end = data.indexOf(0xa);\n if (end === -1) {\n end = data.length;\n }\n\n return end;\n}\n\nfunction parseJSONFromBuffer<T = unknown>(data: Uint8Array): T {\n try {\n return JSON.parse(new TextDecoder().decode(data)) as T;\n } catch (err) {\n logger.error(err);\n return null as T;\n }\n}\n"],"names":[],"mappings":";;;AAWA,MAAM,yCAAyB,IAAI;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AASM,SAAS,gBAAgB,UAA2B,iBAAiD;AAC1G,MAAI,SAAS,OAAO,SAAS,SAAS,WAAW,WAAW,KAAK,SAAS,MAAM,OAAK,EAAE,WAAW,CAAC,CAAC,IAAI,SAAS;AAEjH,WAAS,SAAS,QAAiB;AACjC,UAAM,SAAS,UAAU,WAAW,MAAM;AAC1C,UAAM,OAAO,OAAO,SAAS,GAAG,MAAM;AACtC,aAAS,OAAO,SAAS,SAAS,CAAC;AACnC,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,oBAAoB,UAAU;AACrD,MAAI,CAAC,gBAAgB;AACnB,WAAO,MAAM,wCAAwC;AACrD,WAAO;AAAA,EACT;AAEA,iBAAe,0BAA0B,UAAA;AAGzC,MAAI,iBAAiB;AACnB,mBAAe,gCAAgC;AAAA,EACjD;AAEA,QAAM,QAAwB,CAAA;AAC9B,SAAO,OAAO,QAAQ;AACpB,UAAM,aAAa,oBAAoB,UAAU;AACjD,UAAM,gBAAgB,WAAW;AACjC,UAAM,iBAAiB,SAAS,aAAa;AAE7C,QAAI;AACJ,QAAI;AACF,UAAI,UAAU,IAAI,WAAW,IAAI,GAAG;AAClC,cAAM,aAAa;AACnB,YACE,CAAC,WAAW;AAAA,QAEZ,WAAW,SAAS,UACpB;AAEA,qBAAW,eAAe;AAAA,QAC5B;AACA,sBAAc;AAAA,UACZ,MAAM,WAAW,SAAS,mBAAmB,IAAI,WAAW,YAAsB,IAAI,UAAU,QAAQ;AAAA,QAAA;AAAA,MAE5G,OAAO;AACL,sBAAc,oBAAoB,cAAc;AAChD,YAAI,CAAC,aAAa;AAChB,iBAAO,MAAM,UAAU;AAAA,QACzB,WAAW,WAAW,MAAM;AAG1B,sBAAY,OAAO,WAAW;AAAA,QAChC;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,oBAAc;AACd,aAAO,MAAM,GAAG;AAAA,IAClB;AAEA,UAAM,KAAK,CAAC,YAAY,WAAW,CAAiB;AAAA,EACtD;AAEA,SAAO;AAAA,IACL,UAAU,CAAC,gBAAgB,KAAK;AAAA,IAChC,aAAa;AAAA,EAAA;AAEjB;AAEA,SAAS,WAAW,MAA0B;AAC5C,MAAI,MAAM,KAAK,QAAQ,EAAG;AAC1B,MAAI,QAAQ,IAAI;AACd,UAAM,KAAK;AAAA,EACb;AAEA,SAAO;AACT;AAEA,SAAS,oBAAiC,MAAqB;AAC7D,MAAI;AACF,WAAO,KAAK,MAAM,IAAI,cAAc,OAAO,IAAI,CAAC;AAAA,EAClD,SAAS,KAAK;AACZ,WAAO,MAAM,GAAG;AAChB,WAAO;AAAA,EACT;AACF;"}
1
+ {"version":3,"file":"processEnvelope.js","sources":["../../../src/server/parser/processEnvelope.ts"],"sourcesContent":["import type { Envelope, EnvelopeItem } from \"@sentry/core\";\nimport { type UUID, uuidv7obj } from \"uuidv7\";\nimport { RAW_TYPES } from \"../constants.ts\";\nimport { logger } from \"../logger.ts\";\nimport type { RawEventContext } from \"./types.ts\";\n\nexport type ParsedEnvelope = {\n envelope: [Envelope[0] & { __spotlight_envelope_id: UUID }, Envelope[1]];\n rawEnvelope: RawEventContext;\n};\n\nconst TEXT_CONTENT_TYPES = new Set([\n \"text/plain\",\n \"text/css\",\n \"text/csv\",\n \"text/html\",\n \"text/javascript\",\n \"text/json\",\n \"text/x-json\",\n \"application/json\",\n \"application/ld+json\",\n \"application/json\",\n]);\n\n/**\n * Implements parser for\n * @see https://develop.sentry.dev/sdk/envelopes/#serialization-format\n * @param rawEvent Envelope data\n * @param senderUserAgent Optional User-Agent header from the HTTP request sending the envelope\n * @returns parsed envelope\n */\nexport function processEnvelope(rawEvent: RawEventContext, senderUserAgent?: string): ParsedEnvelope | null {\n let buffer = typeof rawEvent.data === \"string\" ? Uint8Array.from(rawEvent.data, c => c.charCodeAt(0)) : rawEvent.data;\n\n function readLine(length?: number) {\n const cursor = length ?? getLineEnd(buffer);\n const line = buffer.subarray(0, cursor);\n buffer = buffer.subarray(cursor + 1);\n return line;\n }\n\n const envelopeHeader = parseJSONFromBuffer(readLine()) as Envelope[0];\n if (!envelopeHeader) {\n logger.error(\"Malformed envelope header, skipping...\");\n return null;\n }\n\n envelopeHeader.__spotlight_envelope_id = uuidv7obj();\n\n // Store sender User-Agent for improved SDK categorization\n if (senderUserAgent) {\n envelopeHeader.__spotlight_sender_user_agent = senderUserAgent;\n }\n\n const items: EnvelopeItem[] = [];\n while (buffer.length) {\n const itemHeader = parseJSONFromBuffer(readLine()) as EnvelopeItem[0];\n const payloadLength = itemHeader.length;\n const itemPayloadRaw = readLine(payloadLength);\n\n let itemPayload: EnvelopeItem[1];\n try {\n if (RAW_TYPES.has(itemHeader.type)) {\n const rawPayload = itemPayloadRaw as Buffer;\n if (\n !itemHeader.content_type &&\n // @ts-expect-error -- statsd is an old and deprecated event type but have envelopes for that\n itemHeader.type === \"statsd\"\n ) {\n // @ts-expect-error -- same as above\n itemHeader.content_type = \"text/plain\";\n }\n itemPayload = {\n data: rawPayload.toString(TEXT_CONTENT_TYPES.has(itemHeader.content_type as string) ? \"utf-8\" : \"base64\"),\n } as EnvelopeItem[1];\n } else {\n itemPayload = parseJSONFromBuffer(itemPayloadRaw);\n if (!itemPayload) {\n logger.error(itemHeader);\n } else if (itemHeader.type) {\n // data sanitization\n // @ts-expect-error ts(2339) -- We should really stop adding type to payloads\n itemPayload.type = itemHeader.type;\n }\n }\n } catch (err) {\n itemPayload = itemPayloadRaw;\n logger.error(err);\n }\n\n items.push([itemHeader, itemPayload] as EnvelopeItem);\n }\n\n return {\n envelope: [envelopeHeader, items] as ParsedEnvelope[\"envelope\"],\n rawEnvelope: rawEvent,\n };\n}\n\nfunction getLineEnd(data: Uint8Array): number {\n let end = data.indexOf(0xa);\n if (end === -1) {\n end = data.length;\n }\n\n return end;\n}\n\nfunction parseJSONFromBuffer<T = unknown>(data: Uint8Array): T {\n try {\n return JSON.parse(new TextDecoder().decode(data)) as T;\n } catch (err) {\n logger.error(err);\n return null as T;\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAWA,MAAM,yCAAyB,IAAI;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AASM,SAAS,gBAAgB,UAA2B,iBAAiD;AAC1G,MAAI,SAAS,OAAO,SAAS,SAAS,WAAW,WAAW,KAAK,SAAS,MAAM,OAAK,EAAE,WAAW,CAAC,CAAC,IAAI,SAAS;AAEjH,WAAS,SAAS,QAAiB;AACjC,UAAM,SAAS,UAAU,WAAW,MAAM;AAC1C,UAAM,OAAO,OAAO,SAAS,GAAG,MAAM;AACtC,aAAS,OAAO,SAAS,SAAS,CAAC;AACnC,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,oBAAoB,UAAU;AACrD,MAAI,CAAC,gBAAgB;AACnB,WAAO,MAAM,wCAAwC;AACrD,WAAO;AAAA,EACT;AAEA,iBAAe,0BAA0B,UAAA;AAGzC,MAAI,iBAAiB;AACnB,mBAAe,gCAAgC;AAAA,EACjD;AAEA,QAAM,QAAwB,CAAA;AAC9B,SAAO,OAAO,QAAQ;AACpB,UAAM,aAAa,oBAAoB,UAAU;AACjD,UAAM,gBAAgB,WAAW;AACjC,UAAM,iBAAiB,SAAS,aAAa;AAE7C,QAAI;AACJ,QAAI;AACF,UAAI,UAAU,IAAI,WAAW,IAAI,GAAG;AAClC,cAAM,aAAa;AACnB,YACE,CAAC,WAAW;AAAA,QAEZ,WAAW,SAAS,UACpB;AAEA,qBAAW,eAAe;AAAA,QAC5B;AACA,sBAAc;AAAA,UACZ,MAAM,WAAW,SAAS,mBAAmB,IAAI,WAAW,YAAsB,IAAI,UAAU,QAAQ;AAAA,QAAA;AAAA,MAE5G,OAAO;AACL,sBAAc,oBAAoB,cAAc;AAChD,YAAI,CAAC,aAAa;AAChB,iBAAO,MAAM,UAAU;AAAA,QACzB,WAAW,WAAW,MAAM;AAG1B,sBAAY,OAAO,WAAW;AAAA,QAChC;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,oBAAc;AACd,aAAO,MAAM,GAAG;AAAA,IAClB;AAEA,UAAM,KAAK,CAAC,YAAY,WAAW,CAAiB;AAAA,EACtD;AAEA,SAAO;AAAA,IACL,UAAU,CAAC,gBAAgB,KAAK;AAAA,IAChC,aAAa;AAAA,EAAA;AAEjB;AAEA,SAAS,WAAW,MAA0B;AAC5C,MAAI,MAAM,KAAK,QAAQ,EAAG;AAC1B,MAAI,QAAQ,IAAI;AACd,UAAM,KAAK;AAAA,EACb;AAEA,SAAO;AACT;AAEA,SAAS,oBAAiC,MAAqB;AAC7D,MAAI;AACF,WAAO,KAAK,MAAM,IAAI,cAAc,OAAO,IAAI,CAAC;AAAA,EAClD,SAAS,KAAK;AACZ,WAAO,MAAM,GAAG;AAChB,WAAO;AAAA,EACT;AACF;"}
@@ -1,9 +1,21 @@
1
+ ;
2
+ !function() {
3
+ try {
4
+ var e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : {}, n = new e.Error().stack;
5
+ n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "df2b59d9-0e2c-4abe-8147-c0e94d351512", e._sentryDebugIdIdentifier = "sentry-dbid-df2b59d9-0e2c-4abe-8147-c0e94d351512");
6
+ } catch (e2) {
7
+ }
8
+ }();
1
9
  import { Hono } from "hono";
2
10
  import { getBuffer } from "../utils/getBuffer.js";
3
11
  import "../parser/helpers.js";
4
12
  import "uuidv7";
13
+ import "../../_virtual/_sentry-release-injection-file.js";
5
14
  import "node:http";
6
15
  import "@sentry/node";
16
+ import "node:dns/promises";
17
+ import "node:net";
18
+ import "node:os";
7
19
  const router = new Hono();
8
20
  router.delete("/", (ctx) => {
9
21
  getBuffer().clear();
@@ -1 +1 @@
1
- {"version":3,"file":"clear.js","sources":["../../../src/server/routes/clear.ts"],"sourcesContent":["import { Hono } from \"hono\";\nimport { getBuffer } from \"../utils/index.ts\";\n\nconst router = new Hono();\n\nrouter.delete(\"/\", ctx => {\n getBuffer().clear();\n return ctx.text(\"Cleared\");\n});\n\nexport default router;\n"],"names":[],"mappings":";;;;;;AAGA,MAAM,SAAS,IAAI,KAAA;AAEnB,OAAO,OAAO,KAAK,CAAA,QAAO;AACxB,YAAA,EAAY,MAAA;AACZ,SAAO,IAAI,KAAK,SAAS;AAC3B,CAAC;"}
1
+ {"version":3,"file":"clear.js","sources":["../../../src/server/routes/clear.ts"],"sourcesContent":["import { Hono } from \"hono\";\nimport { getBuffer } from \"../utils/index.ts\";\n\nconst router = new Hono();\n\nrouter.delete(\"/\", ctx => {\n getBuffer().clear();\n return ctx.text(\"Cleared\");\n});\n\nexport default router;\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAGA,MAAM,SAAS,IAAI,KAAA;AAEnB,OAAO,OAAO,KAAK,CAAA,QAAO;AACxB,YAAA,EAAY,MAAA;AACZ,SAAO,IAAI,KAAK,SAAS;AAC3B,CAAC;"}
@@ -1,6 +1,15 @@
1
+ ;
2
+ !function() {
3
+ try {
4
+ var e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : {}, n = new e.Error().stack;
5
+ n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "82388776-53c5-4b2b-92e3-0f926106cbef", e._sentryDebugIdIdentifier = "sentry-dbid-82388776-53c5-4b2b-92e3-0f926106cbef");
6
+ } catch (e2) {
7
+ }
8
+ }();
1
9
  import { readFileSync } from "node:fs";
2
10
  import { Hono } from "hono";
3
11
  import { parseStackTrace, isValidSentryStackFrame, getGeneratedCodeFromServer, applySourceContextToFrame, addContextLinesToFrame } from "./utils.js";
12
+ import "../../../_virtual/_sentry-release-injection-file.js";
4
13
  const router = new Hono();
5
14
  router.put("/", async (ctx) => {
6
15
  const requestBody = await ctx.req.text();
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/server/routes/contextlines/index.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { Hono } from \"hono\";\nimport {\n addContextLinesToFrame,\n applySourceContextToFrame,\n getGeneratedCodeFromServer,\n isValidSentryStackFrame,\n parseStackTrace,\n} from \"./utils.ts\";\n\nconst router = new Hono();\n\nrouter.put(\"/\", async ctx => {\n const requestBody = await ctx.req.text();\n\n const stacktrace = parseStackTrace(requestBody);\n\n if (!stacktrace) {\n return ctx.body(null, 500);\n }\n\n for (const frame of stacktrace.frames ?? []) {\n if (\n !isValidSentryStackFrame(frame) ||\n // let's ignore dependencies for now with this naive check\n frame.filename.includes(\"/node_modules/\")\n ) {\n continue;\n }\n const { filename } = frame;\n // Dirty check to see if this looks like a regular file path or a URL\n if (filename.includes(\"://\")) {\n const generatedCode = await getGeneratedCodeFromServer(frame.filename);\n if (!generatedCode) {\n continue;\n }\n\n // Extract the inline source map from the minified code\n const inlineSourceMapMatch = generatedCode.match(/\\/\\/# sourceMappingURL=data:application\\/json;base64,(.*)/);\n\n if (inlineSourceMapMatch?.[1]) {\n const sourceMapBase64 = inlineSourceMapMatch[1];\n const sourceMapContent = Buffer.from(sourceMapBase64, \"base64\").toString(\"utf-8\");\n applySourceContextToFrame(sourceMapContent, frame);\n }\n } else if (!filename.includes(\":\")) {\n try {\n const lines = readFileSync(filename, { encoding: \"utf-8\" }).split(/\\r?\\n/);\n addContextLinesToFrame(lines, frame);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw err;\n }\n }\n }\n }\n\n return ctx.json(stacktrace);\n});\n\nexport default router;\n"],"names":[],"mappings":";;;AAUA,MAAM,SAAS,IAAI,KAAA;AAEnB,OAAO,IAAI,KAAK,OAAM,QAAO;AAC3B,QAAM,cAAc,MAAM,IAAI,IAAI,KAAA;AAElC,QAAM,aAAa,gBAAgB,WAAW;AAE9C,MAAI,CAAC,YAAY;AACf,WAAO,IAAI,KAAK,MAAM,GAAG;AAAA,EAC3B;AAEA,aAAW,SAAS,WAAW,UAAU,CAAA,GAAI;AAC3C,QACE,CAAC,wBAAwB,KAAK;AAAA,IAE9B,MAAM,SAAS,SAAS,gBAAgB,GACxC;AACA;AAAA,IACF;AACA,UAAM,EAAE,aAAa;AAErB,QAAI,SAAS,SAAS,KAAK,GAAG;AAC5B,YAAM,gBAAgB,MAAM,2BAA2B,MAAM,QAAQ;AACrE,UAAI,CAAC,eAAe;AAClB;AAAA,MACF;AAGA,YAAM,uBAAuB,cAAc,MAAM,2DAA2D;AAE5G,UAAI,uBAAuB,CAAC,GAAG;AAC7B,cAAM,kBAAkB,qBAAqB,CAAC;AAC9C,cAAM,mBAAmB,OAAO,KAAK,iBAAiB,QAAQ,EAAE,SAAS,OAAO;AAChF,kCAA0B,kBAAkB,KAAK;AAAA,MACnD;AAAA,IACF,WAAW,CAAC,SAAS,SAAS,GAAG,GAAG;AAClC,UAAI;AACF,cAAM,QAAQ,aAAa,UAAU,EAAE,UAAU,QAAA,CAAS,EAAE,MAAM,OAAO;AACzE,+BAAuB,OAAO,KAAK;AAAA,MACrC,SAAS,KAAK;AACZ,YAAK,IAA8B,SAAS,UAAU;AACpD,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,IAAI,KAAK,UAAU;AAC5B,CAAC;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/server/routes/contextlines/index.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { Hono } from \"hono\";\nimport {\n addContextLinesToFrame,\n applySourceContextToFrame,\n getGeneratedCodeFromServer,\n isValidSentryStackFrame,\n parseStackTrace,\n} from \"./utils.ts\";\n\nconst router = new Hono();\n\nrouter.put(\"/\", async ctx => {\n const requestBody = await ctx.req.text();\n\n const stacktrace = parseStackTrace(requestBody);\n\n if (!stacktrace) {\n return ctx.body(null, 500);\n }\n\n for (const frame of stacktrace.frames ?? []) {\n if (\n !isValidSentryStackFrame(frame) ||\n // let's ignore dependencies for now with this naive check\n frame.filename.includes(\"/node_modules/\")\n ) {\n continue;\n }\n const { filename } = frame;\n // Dirty check to see if this looks like a regular file path or a URL\n if (filename.includes(\"://\")) {\n const generatedCode = await getGeneratedCodeFromServer(frame.filename);\n if (!generatedCode) {\n continue;\n }\n\n // Extract the inline source map from the minified code\n const inlineSourceMapMatch = generatedCode.match(/\\/\\/# sourceMappingURL=data:application\\/json;base64,(.*)/);\n\n if (inlineSourceMapMatch?.[1]) {\n const sourceMapBase64 = inlineSourceMapMatch[1];\n const sourceMapContent = Buffer.from(sourceMapBase64, \"base64\").toString(\"utf-8\");\n applySourceContextToFrame(sourceMapContent, frame);\n }\n } else if (!filename.includes(\":\")) {\n try {\n const lines = readFileSync(filename, { encoding: \"utf-8\" }).split(/\\r?\\n/);\n addContextLinesToFrame(lines, frame);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw err;\n }\n }\n }\n }\n\n return ctx.json(stacktrace);\n});\n\nexport default router;\n"],"names":[],"mappings":";;;;;;;;;;;;AAUA,MAAM,SAAS,IAAI,KAAA;AAEnB,OAAO,IAAI,KAAK,OAAM,QAAO;AAC3B,QAAM,cAAc,MAAM,IAAI,IAAI,KAAA;AAElC,QAAM,aAAa,gBAAgB,WAAW;AAE9C,MAAI,CAAC,YAAY;AACf,WAAO,IAAI,KAAK,MAAM,GAAG;AAAA,EAC3B;AAEA,aAAW,SAAS,WAAW,UAAU,CAAA,GAAI;AAC3C,QACE,CAAC,wBAAwB,KAAK;AAAA,IAE9B,MAAM,SAAS,SAAS,gBAAgB,GACxC;AACA;AAAA,IACF;AACA,UAAM,EAAE,aAAa;AAErB,QAAI,SAAS,SAAS,KAAK,GAAG;AAC5B,YAAM,gBAAgB,MAAM,2BAA2B,MAAM,QAAQ;AACrE,UAAI,CAAC,eAAe;AAClB;AAAA,MACF;AAGA,YAAM,uBAAuB,cAAc,MAAM,2DAA2D;AAE5G,UAAI,uBAAuB,CAAC,GAAG;AAC7B,cAAM,kBAAkB,qBAAqB,CAAC;AAC9C,cAAM,mBAAmB,OAAO,KAAK,iBAAiB,QAAQ,EAAE,SAAS,OAAO;AAChF,kCAA0B,kBAAkB,KAAK;AAAA,MACnD;AAAA,IACF,WAAW,CAAC,SAAS,SAAS,GAAG,GAAG;AAClC,UAAI;AACF,cAAM,QAAQ,aAAa,UAAU,EAAE,UAAU,QAAA,CAAS,EAAE,MAAM,OAAO;AACzE,+BAAuB,OAAO,KAAK;AAAA,MACrC,SAAS,KAAK;AACZ,YAAK,IAA8B,SAAS,UAAU;AACpD,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,IAAI,KAAK,UAAU;AAC5B,CAAC;"}
@@ -1,6 +1,15 @@
1
+ ;
2
+ !function() {
3
+ try {
4
+ var e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : {}, n = new e.Error().stack;
5
+ n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "a89df77e-d568-4a5a-b7ed-b401f74aa610", e._sentryDebugIdIdentifier = "sentry-dbid-a89df77e-d568-4a5a-b7ed-b401f74aa610");
6
+ } catch (e2) {
7
+ }
8
+ }();
1
9
  import * as os from "node:os";
2
10
  import * as path from "node:path";
3
11
  import { TraceMap, originalPositionFor, LEAST_UPPER_BOUND, sourceContentFor } from "@jridgewell/trace-mapping";
12
+ import "../../../_virtual/_sentry-release-injection-file.js";
4
13
  async function getGeneratedCodeFromServer(filename) {
5
14
  try {
6
15
  const generatedCodeResponse = await fetch(filename);
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../../src/server/routes/contextlines/utils.ts"],"sourcesContent":["import * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { LEAST_UPPER_BOUND, TraceMap, originalPositionFor, sourceContentFor } from \"@jridgewell/trace-mapping\";\n\ntype SourceContext = {\n pre_context?: string[];\n context_line?: string;\n post_context?: string[];\n};\n\ntype SentryStackFrame = {\n filename?: string;\n lineno?: number;\n colno?: number;\n} & SourceContext;\n\ntype ValidSentryStackFrame = Required<SentryStackFrame>;\n\ntype SentryStackTrace = {\n frames?: SentryStackFrame[];\n};\n\nexport async function getGeneratedCodeFromServer(filename: string): Promise<string | undefined> {\n try {\n const generatedCodeResponse = await fetch(filename);\n return generatedCodeResponse.text();\n } catch {\n return undefined;\n }\n}\n\nexport function parseStackTrace(requestBody: string): SentryStackTrace | undefined {\n try {\n return JSON.parse(requestBody) as SentryStackTrace;\n } catch {\n return undefined;\n }\n}\n\nexport function applySourceContextToFrame(sourceMapContent: string, frame: ValidSentryStackFrame) {\n const tracer = new TraceMap(JSON.parse(sourceMapContent));\n\n const originalPosition = originalPositionFor(tracer, {\n line: frame.lineno,\n column: frame.colno,\n bias: LEAST_UPPER_BOUND,\n });\n\n if (originalPosition.source && originalPosition.line && originalPosition.column) {\n frame.lineno = originalPosition.line;\n frame.colno = originalPosition.column;\n const filePath = new URL(frame.filename).pathname.slice(1); // slice(1) is to not make it absolute path\n frame.filename = path.resolve(path.join(path.dirname(filePath), originalPosition.source));\n\n const content = sourceContentFor(tracer, originalPosition.source);\n const lines = content?.split(os.EOL) ?? [];\n addContextLinesToFrame(lines, frame);\n }\n\n return originalPosition;\n}\n\nexport function addContextLinesToFrame(lines: string[], frame: ValidSentryStackFrame, linesOfContext = 5): void {\n const maxLines = lines.length;\n const sourceLine = Math.max(Math.min(maxLines - 1, frame.lineno - 1), 0);\n\n frame.pre_context = lines\n .slice(Math.max(0, sourceLine - linesOfContext), sourceLine)\n .map((line: string) => snipLine(line, 0));\n\n frame.context_line = snipLine(lines[Math.min(maxLines - 1, sourceLine)], frame.colno || 0);\n\n frame.post_context = lines\n .slice(Math.min(sourceLine + 1, maxLines), sourceLine + 1 + linesOfContext)\n .map((line: string) => snipLine(line, 0));\n}\n\n/**\n * This is basically just `trim_line` from\n * https://github.com/getsentry/sentry/blob/master/src/sentry/lang/javascript/processor.py#L67\n *\n * @param str An object that contains serializable values\n * @param max Maximum number of characters in truncated string\n * @returns string Encoded\n */\nfunction snipLine(line: string, colno: number): string {\n let newLine = line;\n const lineLength = newLine.length;\n if (lineLength <= 150) {\n return newLine;\n }\n if (colno > lineLength) {\n // eslint-disable-next-line no-param-reassign\n colno = lineLength;\n }\n\n let start = Math.max(colno - 60, 0);\n if (start < 5) {\n start = 0;\n }\n\n let end = Math.min(start + 140, lineLength);\n if (end > lineLength - 5) {\n end = lineLength;\n }\n if (end === lineLength) {\n start = Math.max(end - 140, 0);\n }\n\n newLine = newLine.slice(start, end);\n if (start > 0) {\n newLine = `'{snip} ${newLine}`;\n }\n if (end < lineLength) {\n newLine += \" {snip}\";\n }\n\n return newLine;\n}\n\nexport function isValidSentryStackFrame(frame: SentryStackFrame): frame is ValidSentryStackFrame {\n return !!frame.filename && !!frame.lineno && !!frame.colno;\n}\n"],"names":[],"mappings":";;;AAsBA,eAAsB,2BAA2B,UAA+C;AAC9F,MAAI;AACF,UAAM,wBAAwB,MAAM,MAAM,QAAQ;AAClD,WAAO,sBAAsB,KAAA;AAAA,EAC/B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,gBAAgB,aAAmD;AACjF,MAAI;AACF,WAAO,KAAK,MAAM,WAAW;AAAA,EAC/B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,0BAA0B,kBAA0B,OAA8B;AAChG,QAAM,SAAS,IAAI,SAAS,KAAK,MAAM,gBAAgB,CAAC;AAExD,QAAM,mBAAmB,oBAAoB,QAAQ;AAAA,IACnD,MAAM,MAAM;AAAA,IACZ,QAAQ,MAAM;AAAA,IACd,MAAM;AAAA,EAAA,CACP;AAED,MAAI,iBAAiB,UAAU,iBAAiB,QAAQ,iBAAiB,QAAQ;AAC/E,UAAM,SAAS,iBAAiB;AAChC,UAAM,QAAQ,iBAAiB;AAC/B,UAAM,WAAW,IAAI,IAAI,MAAM,QAAQ,EAAE,SAAS,MAAM,CAAC;AACzD,UAAM,WAAW,KAAK,QAAQ,KAAK,KAAK,KAAK,QAAQ,QAAQ,GAAG,iBAAiB,MAAM,CAAC;AAExF,UAAM,UAAU,iBAAiB,QAAQ,iBAAiB,MAAM;AAChE,UAAM,QAAQ,SAAS,MAAM,GAAG,GAAG,KAAK,CAAA;AACxC,2BAAuB,OAAO,KAAK;AAAA,EACrC;AAEA,SAAO;AACT;AAEO,SAAS,uBAAuB,OAAiB,OAA8B,iBAAiB,GAAS;AAC9G,QAAM,WAAW,MAAM;AACvB,QAAM,aAAa,KAAK,IAAI,KAAK,IAAI,WAAW,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC;AAEvE,QAAM,cAAc,MACjB,MAAM,KAAK,IAAI,GAAG,aAAa,cAAc,GAAG,UAAU,EAC1D,IAAI,CAAC,SAAiB,SAAS,MAAM,CAAC,CAAC;AAE1C,QAAM,eAAe,SAAS,MAAM,KAAK,IAAI,WAAW,GAAG,UAAU,CAAC,GAAG,MAAM,SAAS,CAAC;AAEzF,QAAM,eAAe,MAClB,MAAM,KAAK,IAAI,aAAa,GAAG,QAAQ,GAAG,aAAa,IAAI,cAAc,EACzE,IAAI,CAAC,SAAiB,SAAS,MAAM,CAAC,CAAC;AAC5C;AAUA,SAAS,SAAS,MAAc,OAAuB;AACrD,MAAI,UAAU;AACd,QAAM,aAAa,QAAQ;AAC3B,MAAI,cAAc,KAAK;AACrB,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,YAAY;AAEtB,YAAQ;AAAA,EACV;AAEA,MAAI,QAAQ,KAAK,IAAI,QAAQ,IAAI,CAAC;AAClC,MAAI,QAAQ,GAAG;AACb,YAAQ;AAAA,EACV;AAEA,MAAI,MAAM,KAAK,IAAI,QAAQ,KAAK,UAAU;AAC1C,MAAI,MAAM,aAAa,GAAG;AACxB,UAAM;AAAA,EACR;AACA,MAAI,QAAQ,YAAY;AACtB,YAAQ,KAAK,IAAI,MAAM,KAAK,CAAC;AAAA,EAC/B;AAEA,YAAU,QAAQ,MAAM,OAAO,GAAG;AAClC,MAAI,QAAQ,GAAG;AACb,cAAU,WAAW,OAAO;AAAA,EAC9B;AACA,MAAI,MAAM,YAAY;AACpB,eAAW;AAAA,EACb;AAEA,SAAO;AACT;AAEO,SAAS,wBAAwB,OAAyD;AAC/F,SAAO,CAAC,CAAC,MAAM,YAAY,CAAC,CAAC,MAAM,UAAU,CAAC,CAAC,MAAM;AACvD;"}
1
+ {"version":3,"file":"utils.js","sources":["../../../../src/server/routes/contextlines/utils.ts"],"sourcesContent":["import * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { LEAST_UPPER_BOUND, TraceMap, originalPositionFor, sourceContentFor } from \"@jridgewell/trace-mapping\";\n\ntype SourceContext = {\n pre_context?: string[];\n context_line?: string;\n post_context?: string[];\n};\n\ntype SentryStackFrame = {\n filename?: string;\n lineno?: number;\n colno?: number;\n} & SourceContext;\n\ntype ValidSentryStackFrame = Required<SentryStackFrame>;\n\ntype SentryStackTrace = {\n frames?: SentryStackFrame[];\n};\n\nexport async function getGeneratedCodeFromServer(filename: string): Promise<string | undefined> {\n try {\n const generatedCodeResponse = await fetch(filename);\n return generatedCodeResponse.text();\n } catch {\n return undefined;\n }\n}\n\nexport function parseStackTrace(requestBody: string): SentryStackTrace | undefined {\n try {\n return JSON.parse(requestBody) as SentryStackTrace;\n } catch {\n return undefined;\n }\n}\n\nexport function applySourceContextToFrame(sourceMapContent: string, frame: ValidSentryStackFrame) {\n const tracer = new TraceMap(JSON.parse(sourceMapContent));\n\n const originalPosition = originalPositionFor(tracer, {\n line: frame.lineno,\n column: frame.colno,\n bias: LEAST_UPPER_BOUND,\n });\n\n if (originalPosition.source && originalPosition.line && originalPosition.column) {\n frame.lineno = originalPosition.line;\n frame.colno = originalPosition.column;\n const filePath = new URL(frame.filename).pathname.slice(1); // slice(1) is to not make it absolute path\n frame.filename = path.resolve(path.join(path.dirname(filePath), originalPosition.source));\n\n const content = sourceContentFor(tracer, originalPosition.source);\n const lines = content?.split(os.EOL) ?? [];\n addContextLinesToFrame(lines, frame);\n }\n\n return originalPosition;\n}\n\nexport function addContextLinesToFrame(lines: string[], frame: ValidSentryStackFrame, linesOfContext = 5): void {\n const maxLines = lines.length;\n const sourceLine = Math.max(Math.min(maxLines - 1, frame.lineno - 1), 0);\n\n frame.pre_context = lines\n .slice(Math.max(0, sourceLine - linesOfContext), sourceLine)\n .map((line: string) => snipLine(line, 0));\n\n frame.context_line = snipLine(lines[Math.min(maxLines - 1, sourceLine)], frame.colno || 0);\n\n frame.post_context = lines\n .slice(Math.min(sourceLine + 1, maxLines), sourceLine + 1 + linesOfContext)\n .map((line: string) => snipLine(line, 0));\n}\n\n/**\n * This is basically just `trim_line` from\n * https://github.com/getsentry/sentry/blob/master/src/sentry/lang/javascript/processor.py#L67\n *\n * @param str An object that contains serializable values\n * @param max Maximum number of characters in truncated string\n * @returns string Encoded\n */\nfunction snipLine(line: string, colno: number): string {\n let newLine = line;\n const lineLength = newLine.length;\n if (lineLength <= 150) {\n return newLine;\n }\n if (colno > lineLength) {\n // eslint-disable-next-line no-param-reassign\n colno = lineLength;\n }\n\n let start = Math.max(colno - 60, 0);\n if (start < 5) {\n start = 0;\n }\n\n let end = Math.min(start + 140, lineLength);\n if (end > lineLength - 5) {\n end = lineLength;\n }\n if (end === lineLength) {\n start = Math.max(end - 140, 0);\n }\n\n newLine = newLine.slice(start, end);\n if (start > 0) {\n newLine = `'{snip} ${newLine}`;\n }\n if (end < lineLength) {\n newLine += \" {snip}\";\n }\n\n return newLine;\n}\n\nexport function isValidSentryStackFrame(frame: SentryStackFrame): frame is ValidSentryStackFrame {\n return !!frame.filename && !!frame.lineno && !!frame.colno;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAsBA,eAAsB,2BAA2B,UAA+C;AAC9F,MAAI;AACF,UAAM,wBAAwB,MAAM,MAAM,QAAQ;AAClD,WAAO,sBAAsB,KAAA;AAAA,EAC/B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,gBAAgB,aAAmD;AACjF,MAAI;AACF,WAAO,KAAK,MAAM,WAAW;AAAA,EAC/B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,0BAA0B,kBAA0B,OAA8B;AAChG,QAAM,SAAS,IAAI,SAAS,KAAK,MAAM,gBAAgB,CAAC;AAExD,QAAM,mBAAmB,oBAAoB,QAAQ;AAAA,IACnD,MAAM,MAAM;AAAA,IACZ,QAAQ,MAAM;AAAA,IACd,MAAM;AAAA,EAAA,CACP;AAED,MAAI,iBAAiB,UAAU,iBAAiB,QAAQ,iBAAiB,QAAQ;AAC/E,UAAM,SAAS,iBAAiB;AAChC,UAAM,QAAQ,iBAAiB;AAC/B,UAAM,WAAW,IAAI,IAAI,MAAM,QAAQ,EAAE,SAAS,MAAM,CAAC;AACzD,UAAM,WAAW,KAAK,QAAQ,KAAK,KAAK,KAAK,QAAQ,QAAQ,GAAG,iBAAiB,MAAM,CAAC;AAExF,UAAM,UAAU,iBAAiB,QAAQ,iBAAiB,MAAM;AAChE,UAAM,QAAQ,SAAS,MAAM,GAAG,GAAG,KAAK,CAAA;AACxC,2BAAuB,OAAO,KAAK;AAAA,EACrC;AAEA,SAAO;AACT;AAEO,SAAS,uBAAuB,OAAiB,OAA8B,iBAAiB,GAAS;AAC9G,QAAM,WAAW,MAAM;AACvB,QAAM,aAAa,KAAK,IAAI,KAAK,IAAI,WAAW,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC;AAEvE,QAAM,cAAc,MACjB,MAAM,KAAK,IAAI,GAAG,aAAa,cAAc,GAAG,UAAU,EAC1D,IAAI,CAAC,SAAiB,SAAS,MAAM,CAAC,CAAC;AAE1C,QAAM,eAAe,SAAS,MAAM,KAAK,IAAI,WAAW,GAAG,UAAU,CAAC,GAAG,MAAM,SAAS,CAAC;AAEzF,QAAM,eAAe,MAClB,MAAM,KAAK,IAAI,aAAa,GAAG,QAAQ,GAAG,aAAa,IAAI,cAAc,EACzE,IAAI,CAAC,SAAiB,SAAS,MAAM,CAAC,CAAC;AAC5C;AAUA,SAAS,SAAS,MAAc,OAAuB;AACrD,MAAI,UAAU;AACd,QAAM,aAAa,QAAQ;AAC3B,MAAI,cAAc,KAAK;AACrB,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,YAAY;AAEtB,YAAQ;AAAA,EACV;AAEA,MAAI,QAAQ,KAAK,IAAI,QAAQ,IAAI,CAAC;AAClC,MAAI,QAAQ,GAAG;AACb,YAAQ;AAAA,EACV;AAEA,MAAI,MAAM,KAAK,IAAI,QAAQ,KAAK,UAAU;AAC1C,MAAI,MAAM,aAAa,GAAG;AACxB,UAAM;AAAA,EACR;AACA,MAAI,QAAQ,YAAY;AACtB,YAAQ,KAAK,IAAI,MAAM,KAAK,CAAC;AAAA,EAC/B;AAEA,YAAU,QAAQ,MAAM,OAAO,GAAG;AAClC,MAAI,QAAQ,GAAG;AACb,cAAU,WAAW,OAAO;AAAA,EAC9B;AACA,MAAI,MAAM,YAAY;AACpB,eAAW;AAAA,EACb;AAEA,SAAO;AACT;AAEO,SAAS,wBAAwB,OAAyD;AAC/F,SAAO,CAAC,CAAC,MAAM,YAAY,CAAC,CAAC,MAAM,UAAU,CAAC,CAAC,MAAM;AACvD;"}
@@ -1,4 +1,13 @@
1
+ ;
2
+ !function() {
3
+ try {
4
+ var e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : {}, n = new e.Error().stack;
5
+ n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "ac2436aa-2c00-4a9d-96d2-9ec7f6f567ca", e._sentryDebugIdIdentifier = "sentry-dbid-ac2436aa-2c00-4a9d-96d2-9ec7f6f567ca");
6
+ } catch (e2) {
7
+ }
8
+ }();
1
9
  import { Hono } from "hono";
10
+ import "../../_virtual/_sentry-release-injection-file.js";
2
11
  const router = new Hono();
3
12
  router.get("/", (ctx) => ctx.text("OK"));
4
13
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"health.js","sources":["../../../src/server/routes/health.ts"],"sourcesContent":["import { Hono } from \"hono\";\n\nconst router = new Hono();\n\nrouter.get(\"/\", ctx => ctx.text(\"OK\"));\n\nexport default router;\n"],"names":[],"mappings":";AAEA,MAAM,SAAS,IAAI,KAAA;AAEnB,OAAO,IAAI,KAAK,CAAA,QAAO,IAAI,KAAK,IAAI,CAAC;"}
1
+ {"version":3,"file":"health.js","sources":["../../../src/server/routes/health.ts"],"sourcesContent":["import { Hono } from \"hono\";\n\nconst router = new Hono();\n\nrouter.get(\"/\", ctx => ctx.text(\"OK\"));\n\nexport default router;\n"],"names":[],"mappings":";;;;;;;;;;AAEA,MAAM,SAAS,IAAI,KAAA;AAEnB,OAAO,IAAI,KAAK,CAAA,QAAO,IAAI,KAAK,IAAI,CAAC;"}
@@ -1,5 +1,14 @@
1
+ ;
2
+ !function() {
3
+ try {
4
+ var e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : {}, n = new e.Error().stack;
5
+ n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "856e24a9-8f6d-42d2-9229-e8637e96ffaf", e._sentryDebugIdIdentifier = "sentry-dbid-856e24a9-8f6d-42d2-9229-e8637e96ffaf");
6
+ } catch (e2) {
7
+ }
8
+ }();
1
9
  import { Hono } from "hono";
2
10
  import { CONTEXT_LINES_ENDPOINT } from "../../shared/constants.js";
11
+ import "../../_virtual/_sentry-release-injection-file.js";
3
12
  import router$3 from "./clear.js";
4
13
  import router$6 from "./contextlines/index.js";
5
14
  import router$2 from "./health.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/server/routes/index.ts"],"sourcesContent":["import { Hono } from \"hono\";\nimport { CONTEXT_LINES_ENDPOINT } from \"../constants.ts\";\nimport clearRouter from \"./clear.ts\";\nimport contextLinesRouter from \"./contextlines/index.ts\";\nimport healthRouter from \"./health.ts\";\nimport mcpRouter from \"./mcp.ts\";\nimport openRouter from \"./open.ts\";\nimport streamRouter from \"./stream/index.ts\";\n\nconst router = new Hono();\nrouter.route(\"/mcp\", mcpRouter);\nrouter.route(\"/health\", healthRouter);\nrouter.route(\"/clear\", clearRouter);\nrouter.route(\"/\", streamRouter);\nrouter.route(\"/open\", openRouter);\nrouter.route(CONTEXT_LINES_ENDPOINT, contextLinesRouter);\n\nexport default router;\n"],"names":["mcpRouter","healthRouter","clearRouter","streamRouter","openRouter","contextLinesRouter"],"mappings":";;;;;;;;AASA,MAAM,SAAS,IAAI,KAAA;AACnB,OAAO,MAAM,QAAQA,QAAS;AAC9B,OAAO,MAAM,WAAWC,QAAY;AACpC,OAAO,MAAM,UAAUC,QAAW;AAClC,OAAO,MAAM,KAAKC,QAAY;AAC9B,OAAO,MAAM,SAASC,QAAU;AAChC,OAAO,MAAM,wBAAwBC,QAAkB;"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/server/routes/index.ts"],"sourcesContent":["import { Hono } from \"hono\";\nimport { CONTEXT_LINES_ENDPOINT } from \"../constants.ts\";\nimport clearRouter from \"./clear.ts\";\nimport contextLinesRouter from \"./contextlines/index.ts\";\nimport healthRouter from \"./health.ts\";\nimport mcpRouter from \"./mcp.ts\";\nimport openRouter from \"./open.ts\";\nimport streamRouter from \"./stream/index.ts\";\n\nconst router = new Hono();\nrouter.route(\"/mcp\", mcpRouter);\nrouter.route(\"/health\", healthRouter);\nrouter.route(\"/clear\", clearRouter);\nrouter.route(\"/\", streamRouter);\nrouter.route(\"/open\", openRouter);\nrouter.route(CONTEXT_LINES_ENDPOINT, contextLinesRouter);\n\nexport default router;\n"],"names":["mcpRouter","healthRouter","clearRouter","streamRouter","openRouter","contextLinesRouter"],"mappings":";;;;;;;;;;;;;;;;;AASA,MAAM,SAAS,IAAI,KAAA;AACnB,OAAO,MAAM,QAAQA,QAAS;AAC9B,OAAO,MAAM,WAAWC,QAAY;AACpC,OAAO,MAAM,UAAUC,QAAW;AAClC,OAAO,MAAM,KAAKC,QAAY;AAC9B,OAAO,MAAM,SAASC,QAAU;AAChC,OAAO,MAAM,wBAAwBC,QAAkB;"}
@@ -1,6 +1,15 @@
1
+ ;
2
+ !function() {
3
+ try {
4
+ var e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : {}, n = new e.Error().stack;
5
+ n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "c6044788-a9e4-43bc-889c-2ad6a3388706", e._sentryDebugIdIdentifier = "sentry-dbid-c6044788-a9e4-43bc-889c-2ad6a3388706");
6
+ } catch (e2) {
7
+ }
8
+ }();
1
9
  import { StreamableHTTPTransport } from "@hono/mcp";
2
10
  import { Hono } from "hono";
3
11
  import { createMCPInstance } from "../mcp/mcp.js";
12
+ import "../../_virtual/_sentry-release-injection-file.js";
4
13
  const transport = new StreamableHTTPTransport();
5
14
  const mcp = createMCPInstance();
6
15
  const router = new Hono();
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.js","sources":["../../../src/server/routes/mcp.ts"],"sourcesContent":["import { StreamableHTTPTransport } from \"@hono/mcp\";\nimport { Hono } from \"hono\";\nimport { createMCPInstance } from \"../mcp/mcp.ts\";\n\nconst transport = new StreamableHTTPTransport();\nconst mcp = createMCPInstance();\n\nconst router = new Hono();\n\nrouter.all(\n \"/\",\n async (_ctx, next) => {\n if (!mcp.isConnected()) {\n // Connecting the MCP with the transport\n await mcp.connect(transport);\n }\n\n await next();\n },\n ctx => transport.handleRequest(ctx),\n);\n\nexport default router;\n"],"names":[],"mappings":";;;AAIA,MAAM,YAAY,IAAI,wBAAA;AACtB,MAAM,MAAM,kBAAA;AAEZ,MAAM,SAAS,IAAI,KAAA;AAEnB,OAAO;AAAA,EACL;AAAA,EACA,OAAO,MAAM,SAAS;AACpB,QAAI,CAAC,IAAI,eAAe;AAEtB,YAAM,IAAI,QAAQ,SAAS;AAAA,IAC7B;AAEA,UAAM,KAAA;AAAA,EACR;AAAA,EACA,CAAA,QAAO,UAAU,cAAc,GAAG;AACpC;"}
1
+ {"version":3,"file":"mcp.js","sources":["../../../src/server/routes/mcp.ts"],"sourcesContent":["import { StreamableHTTPTransport } from \"@hono/mcp\";\nimport { Hono } from \"hono\";\nimport { createMCPInstance } from \"../mcp/mcp.ts\";\n\nconst transport = new StreamableHTTPTransport();\nconst mcp = createMCPInstance();\n\nconst router = new Hono();\n\nrouter.all(\n \"/\",\n async (_ctx, next) => {\n if (!mcp.isConnected()) {\n // Connecting the MCP with the transport\n await mcp.connect(transport);\n }\n\n await next();\n },\n ctx => transport.handleRequest(ctx),\n);\n\nexport default router;\n"],"names":[],"mappings":";;;;;;;;;;;;AAIA,MAAM,YAAY,IAAI,wBAAA;AACtB,MAAM,MAAM,kBAAA;AAEZ,MAAM,SAAS,IAAI,KAAA;AAEnB,OAAO;AAAA,EACL;AAAA,EACA,OAAO,MAAM,SAAS;AACpB,QAAI,CAAC,IAAI,eAAe;AAEtB,YAAM,IAAI,QAAQ,SAAS;AAAA,IAC7B;AAEA,UAAM,KAAA;AAAA,EACR;AAAA,EACA,CAAA,QAAO,UAAU,cAAc,GAAG;AACpC;"}
@@ -1,7 +1,16 @@
1
+ ;
2
+ !function() {
3
+ try {
4
+ var e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : {}, n = new e.Error().stack;
5
+ n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "a96f3513-bf22-4042-9737-acc8779fc460", e._sentryDebugIdIdentifier = "sentry-dbid-a96f3513-bf22-4042-9737-acc8779fc460");
6
+ } catch (e2) {
7
+ }
8
+ }();
1
9
  import { resolve } from "node:path";
2
10
  import { Hono } from "hono";
3
11
  import launchEditor from "launch-editor";
4
12
  import { logger } from "../logger.js";
13
+ import "../../_virtual/_sentry-release-injection-file.js";
5
14
  const router = new Hono();
6
15
  router.post("/", async (ctx) => {
7
16
  const basePath = ctx.get("basePath") ?? process.cwd();