@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,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] = "e9690808-fca0-4d98-bfa6-5a55512c8693", e._sentryDebugIdIdentifier = "sentry-dbid-e9690808-fca0-4d98-bfa6-5a55512c8693");
6
+ } catch (e2) {
7
+ }
8
+ }();
1
9
  import { EVERYTHING_MAGIC_WORDS, NAME_TO_TYPE_MAPPING } from "./tail.js";
2
10
  import { AVAILABLE_FORMATTERS } from "../formatters/types.js";
11
+ import "../../_virtual/_sentry-release-injection-file.js";
3
12
  function showHelp() {
4
13
  console.log(`
5
14
  Spotlight Sidecar - Development proxy server for Spotlight
@@ -18,6 +27,12 @@ Options:
18
27
  -d, --debug Enable debug logging
19
28
  -f, --format <format> Output format for tail command (default: human)
20
29
  Available formats: ${[...AVAILABLE_FORMATTERS].join(", ")}
30
+ -A, --allowed-origin <origin>
31
+ Additional origins to allow for CORS requests.
32
+ Can be specified multiple times or comma-separated.
33
+ Accepts full origins (https://example.com:443) for
34
+ strict matching or plain domains (myapp.local) to
35
+ allow any protocol/port.
21
36
  -h, --help Show this help message
22
37
 
23
38
  Examples:
@@ -29,6 +44,8 @@ Examples:
29
44
  spotlight mcp # Start in MCP mode
30
45
  spotlight --port 3000 # Start on port 3000
31
46
  spotlight -p 3000 -d # Start on port 3000 with debug logging
47
+ spotlight -A myapp.local # Allow requests from myapp.local
48
+ spotlight -A https://tunnel.ngrok.io -A dev.local # Multiple origins
32
49
  `);
33
50
  process.exit(0);
34
51
  }
@@ -1 +1 @@
1
- {"version":3,"file":"help.js","sources":["../../../src/server/cli/help.ts"],"sourcesContent":["import { EVERYTHING_MAGIC_WORDS, NAME_TO_TYPE_MAPPING } from \"../cli/tail.ts\";\nimport { AVAILABLE_FORMATTERS } from \"../formatters/types.ts\";\n\nexport default function showHelp() {\n console.log(`\nSpotlight Sidecar - Development proxy server for Spotlight\n\nUsage: spotlight [command] [options]\n\nCommands:\n tail [types...] Tail Sentry events (default: everything)\n Available types: ${[...Object.keys(NAME_TO_TYPE_MAPPING)].join(\", \")}\n Magic words: ${[...EVERYTHING_MAGIC_WORDS].join(\", \")}\n mcp Start in MCP (Model Context Protocol) mode\n help Show this help message\n\nOptions:\n -p, --port <port> Port to listen on (default: 8969, or 0 for random)\n -d, --debug Enable debug logging\n -f, --format <format> Output format for tail command (default: human)\n Available formats: ${[...AVAILABLE_FORMATTERS].join(\", \")}\n -h, --help Show this help message\n\nExamples:\n spotlight # Start on default port 8969\n spotlight tail # Tail all event types (human format)\n spotlight tail errors # Tail only errors\n spotlight tail errors logs # Tail errors and logs\n spotlight tail --format json # Explicitly use json format\n spotlight mcp # Start in MCP mode\n spotlight --port 3000 # Start on port 3000\n spotlight -p 3000 -d # Start on port 3000 with debug logging\n`);\n process.exit(0);\n}\n"],"names":[],"mappings":";;AAGA,SAAwB,WAAW;AACjC,UAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0CAO4B,CAAC,GAAG,OAAO,KAAK,oBAAoB,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,sCACrD,CAAC,GAAG,sBAAsB,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8CAQ9B,CAAC,GAAG,oBAAoB,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAYjF;AACC,UAAQ,KAAK,CAAC;AAChB;"}
1
+ {"version":3,"file":"help.js","sources":["../../../src/server/cli/help.ts"],"sourcesContent":["import { EVERYTHING_MAGIC_WORDS, NAME_TO_TYPE_MAPPING } from \"../cli/tail.ts\";\nimport { AVAILABLE_FORMATTERS } from \"../formatters/types.ts\";\n\nexport default function showHelp() {\n console.log(`\nSpotlight Sidecar - Development proxy server for Spotlight\n\nUsage: spotlight [command] [options]\n\nCommands:\n tail [types...] Tail Sentry events (default: everything)\n Available types: ${[...Object.keys(NAME_TO_TYPE_MAPPING)].join(\", \")}\n Magic words: ${[...EVERYTHING_MAGIC_WORDS].join(\", \")}\n mcp Start in MCP (Model Context Protocol) mode\n help Show this help message\n\nOptions:\n -p, --port <port> Port to listen on (default: 8969, or 0 for random)\n -d, --debug Enable debug logging\n -f, --format <format> Output format for tail command (default: human)\n Available formats: ${[...AVAILABLE_FORMATTERS].join(\", \")}\n -A, --allowed-origin <origin>\n Additional origins to allow for CORS requests.\n Can be specified multiple times or comma-separated.\n Accepts full origins (https://example.com:443) for\n strict matching or plain domains (myapp.local) to\n allow any protocol/port.\n -h, --help Show this help message\n\nExamples:\n spotlight # Start on default port 8969\n spotlight tail # Tail all event types (human format)\n spotlight tail errors # Tail only errors\n spotlight tail errors logs # Tail errors and logs\n spotlight tail --format json # Explicitly use json format\n spotlight mcp # Start in MCP mode\n spotlight --port 3000 # Start on port 3000\n spotlight -p 3000 -d # Start on port 3000 with debug logging\n spotlight -A myapp.local # Allow requests from myapp.local\n spotlight -A https://tunnel.ngrok.io -A dev.local # Multiple origins\n`);\n process.exit(0);\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAGA,SAAwB,WAAW;AACjC,UAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0CAO4B,CAAC,GAAG,OAAO,KAAK,oBAAoB,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,sCACrD,CAAC,GAAG,sBAAsB,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8CAQ9B,CAAC,GAAG,oBAAoB,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAoBjF;AACC,UAAQ,KAAK,CAAC;AAChB;"}
@@ -1,2 +1,2 @@
1
1
  import { CLIHandlerOptions } from '../types/cli.ts';
2
- export default function mcp({ port, basePath, filesToServe }: CLIHandlerOptions): Promise<import('http').Server<typeof import('http').IncomingMessage, typeof import('http').ServerResponse> | undefined>;
2
+ export default function mcp({ port, basePath, filesToServe, allowedOrigins }: CLIHandlerOptions): Promise<import('http').Server<typeof import('http').IncomingMessage, typeof import('http').ServerResponse> | undefined>;
@@ -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] = "76ae9be3-3fab-4851-89d6-2ad159f12870", e._sentryDebugIdIdentifier = "sentry-dbid-76ae9be3-3fab-4851-89d6-2ad159f12870");
6
+ } catch (e2) {
7
+ }
8
+ }();
1
9
  import { Client } from "../../node_modules/.pnpm/@modelcontextprotocol_sdk@1.16.0/node_modules/@modelcontextprotocol/sdk/dist/esm/client/index.js";
2
10
  import { StdioServerTransport } from "../../node_modules/.pnpm/@modelcontextprotocol_sdk@1.16.0/node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js";
3
11
  import { captureException } from "@sentry/node";
@@ -5,12 +13,15 @@ import { startStdioServer, ServerType } from "mcp-proxy";
5
13
  import { logger } from "../logger.js";
6
14
  import { startServer, setShutdownHandlers } from "../main.js";
7
15
  import { createMCPInstance } from "../mcp/mcp.js";
16
+ import { normalizeAllowedOrigins } from "../utils/cors.js";
8
17
  import { isSidecarRunning } from "../utils/extras.js";
9
- async function startServerWithStdioMCP(port, basePath, filesToServe) {
18
+ import "../../_virtual/_sentry-release-injection-file.js";
19
+ async function startServerWithStdioMCP(port, basePath, filesToServe, normalizedAllowedOrigins) {
10
20
  const serverInstance = await startServer({
11
21
  port,
12
22
  basePath,
13
- filesToServe
23
+ filesToServe,
24
+ normalizedAllowedOrigins
14
25
  });
15
26
  setShutdownHandlers(serverInstance);
16
27
  logger.info("Starting MCP over stdio too...");
@@ -23,7 +34,7 @@ async function startServerWithStdioMCP(port, basePath, filesToServe) {
23
34
  process.on("SIGTERM", shutdownMcp);
24
35
  return serverInstance;
25
36
  }
26
- async function startMCPStdioHTTPProxy(port, basePath, filesToServe) {
37
+ async function startMCPStdioHTTPProxy(port, basePath, filesToServe, normalizedAllowedOrigins) {
27
38
  let intentionalShutdown = false;
28
39
  let client = null;
29
40
  let server = null;
@@ -77,26 +88,27 @@ async function startMCPStdioHTTPProxy(port, basePath, filesToServe) {
77
88
  process.off("SIGTERM", shutdown);
78
89
  process.stdin.resume();
79
90
  try {
80
- await startMCPStdioHTTPProxy(port, basePath, filesToServe);
91
+ await startMCPStdioHTTPProxy(port, basePath, filesToServe, normalizedAllowedOrigins);
81
92
  logger.info("Connection restored");
82
93
  } catch (_err) {
83
94
  try {
84
- return await startServerWithStdioMCP(port, basePath, filesToServe);
95
+ return await startServerWithStdioMCP(port, basePath, filesToServe, normalizedAllowedOrigins);
85
96
  } catch (_err2) {
86
97
  logger.error("Failed to restart sidecar server after MCP stdio proxy closed.");
87
98
  captureException(_err2);
88
- await startMCPStdioHTTPProxy(port, basePath, filesToServe);
99
+ await startMCPStdioHTTPProxy(port, basePath, filesToServe, normalizedAllowedOrigins);
89
100
  }
90
101
  }
91
102
  };
92
103
  }
93
- async function mcp({ port, basePath, filesToServe }) {
104
+ async function mcp({ port, basePath, filesToServe, allowedOrigins }) {
105
+ const normalizedAllowedOrigins = allowedOrigins ? normalizeAllowedOrigins(allowedOrigins) : void 0;
94
106
  if (port > 0 && await isSidecarRunning(port)) {
95
107
  logger.info("Connecting to existing MCP instance with stdio proxy...");
96
- await startMCPStdioHTTPProxy(port, basePath, filesToServe);
108
+ await startMCPStdioHTTPProxy(port, basePath, filesToServe, normalizedAllowedOrigins);
97
109
  logger.info(`Connected to existing MCP instance on port ${port}`);
98
110
  } else {
99
- return await startServerWithStdioMCP(port, basePath, filesToServe);
111
+ return await startServerWithStdioMCP(port, basePath, filesToServe, normalizedAllowedOrigins);
100
112
  }
101
113
  }
102
114
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.js","sources":["../../../src/server/cli/mcp.ts"],"sourcesContent":["import { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { captureException } from \"@sentry/node\";\nimport { ServerType as ProxyServerType, startStdioServer } from \"mcp-proxy\";\nimport { logger } from \"../logger.ts\";\nimport { setShutdownHandlers, startServer } from \"../main.ts\";\nimport { createMCPInstance } from \"../mcp/mcp.ts\";\nimport type { CLIHandlerOptions } from \"../types/cli.ts\";\nimport { isSidecarRunning } from \"../utils/extras.ts\";\n\nasync function startServerWithStdioMCP(\n port: CLIHandlerOptions[\"port\"],\n basePath: CLIHandlerOptions[\"basePath\"],\n filesToServe: CLIHandlerOptions[\"filesToServe\"],\n) {\n const serverInstance = await startServer({\n port,\n basePath,\n filesToServe,\n });\n setShutdownHandlers(serverInstance);\n\n logger.info(\"Starting MCP over stdio too...\");\n const mcpInstance = createMCPInstance();\n await mcpInstance.connect(new StdioServerTransport());\n\n const shutdownMcp = () => {\n mcpInstance.close();\n };\n\n process.on(\"SIGINT\", shutdownMcp);\n process.on(\"SIGTERM\", shutdownMcp);\n\n return serverInstance;\n}\n\nasync function startMCPStdioHTTPProxy(\n port: CLIHandlerOptions[\"port\"],\n basePath: CLIHandlerOptions[\"basePath\"],\n filesToServe: CLIHandlerOptions[\"filesToServe\"],\n) {\n let intentionalShutdown = false;\n let client: Client | null = null;\n let server: Awaited<ReturnType<typeof startStdioServer>> | null = null;\n\n const shutdown = async () => {\n if (intentionalShutdown) {\n // If we get the signal again, exit immediately\n logger.info(\"Bye.\");\n process.exit(0);\n }\n\n intentionalShutdown = true;\n logger.info(\"Shutting down MCP stdio proxy...\");\n\n if (client) {\n await client.close();\n }\n if (server) {\n await server.close();\n }\n };\n\n // Set up signal handlers for graceful shutdown\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n server = await startStdioServer({\n // We need to hook into `initStreamClient` as the returned object from startStdioServer\n // is not a meta proxy object giving access to both the server and the client. It just\n // returns the StdioServerTransport instance without a way to access the client or its errors.\n // TODO: We should probably upstream a fix for this to close the server or bubble the errors\n initStreamClient: () => {\n client = new Client({\n name: \"Spotlight Sidecar (stdio proxy)\",\n version: \"1.0.0\",\n });\n client.onerror = async (err: Error) => {\n if (\n err.message.startsWith(\"Maximum reconnection attempts\") ||\n /disconnected|fetch failed|connection closed/i.test(err.message)\n ) {\n if (client) await client.close();\n if (server) await server.close();\n } else if (!/conflict/i.test(err.message)) {\n captureException(err);\n logger.error(`MCP stdio proxy error: ${err.name}: ${err.message}`);\n }\n };\n return Promise.resolve(client);\n },\n serverType: ProxyServerType.HTTPStream,\n url: `http://localhost:${port}/mcp`,\n });\n server.onclose = async () => {\n // If this is an intentional shutdown, don't restart\n if (intentionalShutdown) {\n logger.info(\"MCP stdio proxy server closed.\");\n return;\n }\n\n logger.info(\"MCP stdio proxy server closed unexpectedly. Attempting to restart...\");\n process.off(\"SIGINT\", shutdown);\n process.off(\"SIGTERM\", shutdown);\n // We need to manually resume stdin as `StdioServerTransport` pauses it on\n // close but does not `resume` it when a new instance is created. Probably\n // a bug in https://github.com/modelcontextprotocol/typescript-sdk/blob/main/src/server/stdio.ts\n process.stdin.resume();\n\n try {\n await startMCPStdioHTTPProxy(port, basePath, filesToServe);\n logger.info(\"Connection restored\");\n } catch (_err) {\n try {\n return await startServerWithStdioMCP(port, basePath, filesToServe);\n } catch (_err2) {\n logger.error(\"Failed to restart sidecar server after MCP stdio proxy closed.\");\n captureException(_err2);\n await startMCPStdioHTTPProxy(port, basePath, filesToServe);\n }\n }\n };\n}\n\nexport default async function mcp({ port, basePath, filesToServe }: CLIHandlerOptions) {\n if (port > 0 && (await isSidecarRunning(port))) {\n logger.info(\"Connecting to existing MCP instance with stdio proxy...\");\n await startMCPStdioHTTPProxy(port, basePath, filesToServe);\n logger.info(`Connected to existing MCP instance on port ${port}`);\n } else {\n return await startServerWithStdioMCP(port, basePath, filesToServe);\n }\n}\n"],"names":["ProxyServerType"],"mappings":";;;;;;;;AAUA,eAAe,wBACb,MACA,UACA,cACA;AACA,QAAM,iBAAiB,MAAM,YAAY;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AACD,sBAAoB,cAAc;AAElC,SAAO,KAAK,gCAAgC;AAC5C,QAAM,cAAc,kBAAA;AACpB,QAAM,YAAY,QAAQ,IAAI,sBAAsB;AAEpD,QAAM,cAAc,MAAM;AACxB,gBAAY,MAAA;AAAA,EACd;AAEA,UAAQ,GAAG,UAAU,WAAW;AAChC,UAAQ,GAAG,WAAW,WAAW;AAEjC,SAAO;AACT;AAEA,eAAe,uBACb,MACA,UACA,cACA;AACA,MAAI,sBAAsB;AAC1B,MAAI,SAAwB;AAC5B,MAAI,SAA8D;AAElE,QAAM,WAAW,YAAY;AAC3B,QAAI,qBAAqB;AAEvB,aAAO,KAAK,MAAM;AAClB,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,0BAAsB;AACtB,WAAO,KAAK,kCAAkC;AAE9C,QAAI,QAAQ;AACV,YAAM,OAAO,MAAA;AAAA,IACf;AACA,QAAI,QAAQ;AACV,YAAM,OAAO,MAAA;AAAA,IACf;AAAA,EACF;AAGA,UAAQ,GAAG,UAAU,QAAQ;AAC7B,UAAQ,GAAG,WAAW,QAAQ;AAE9B,WAAS,MAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA,IAK9B,kBAAkB,MAAM;AACtB,eAAS,IAAI,OAAO;AAAA,QAClB,MAAM;AAAA,QACN,SAAS;AAAA,MAAA,CACV;AACD,aAAO,UAAU,OAAO,QAAe;AACrC,YACE,IAAI,QAAQ,WAAW,+BAA+B,KACtD,+CAA+C,KAAK,IAAI,OAAO,GAC/D;AACA,cAAI,OAAQ,OAAM,OAAO,MAAA;AACzB,cAAI,OAAQ,OAAM,OAAO,MAAA;AAAA,QAC3B,WAAW,CAAC,YAAY,KAAK,IAAI,OAAO,GAAG;AACzC,2BAAiB,GAAG;AACpB,iBAAO,MAAM,0BAA0B,IAAI,IAAI,KAAK,IAAI,OAAO,EAAE;AAAA,QACnE;AAAA,MACF;AACA,aAAO,QAAQ,QAAQ,MAAM;AAAA,IAC/B;AAAA,IACA,YAAYA,WAAgB;AAAA,IAC5B,KAAK,oBAAoB,IAAI;AAAA,EAAA,CAC9B;AACD,SAAO,UAAU,YAAY;AAE3B,QAAI,qBAAqB;AACvB,aAAO,KAAK,gCAAgC;AAC5C;AAAA,IACF;AAEA,WAAO,KAAK,sEAAsE;AAClF,YAAQ,IAAI,UAAU,QAAQ;AAC9B,YAAQ,IAAI,WAAW,QAAQ;AAI/B,YAAQ,MAAM,OAAA;AAEd,QAAI;AACF,YAAM,uBAAuB,MAAM,UAAU,YAAY;AACzD,aAAO,KAAK,qBAAqB;AAAA,IACnC,SAAS,MAAM;AACb,UAAI;AACF,eAAO,MAAM,wBAAwB,MAAM,UAAU,YAAY;AAAA,MACnE,SAAS,OAAO;AACd,eAAO,MAAM,gEAAgE;AAC7E,yBAAiB,KAAK;AACtB,cAAM,uBAAuB,MAAM,UAAU,YAAY;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAA8B,IAAI,EAAE,MAAM,UAAU,gBAAmC;AACrF,MAAI,OAAO,KAAM,MAAM,iBAAiB,IAAI,GAAI;AAC9C,WAAO,KAAK,yDAAyD;AACrE,UAAM,uBAAuB,MAAM,UAAU,YAAY;AACzD,WAAO,KAAK,8CAA8C,IAAI,EAAE;AAAA,EAClE,OAAO;AACL,WAAO,MAAM,wBAAwB,MAAM,UAAU,YAAY;AAAA,EACnE;AACF;"}
1
+ {"version":3,"file":"mcp.js","sources":["../../../src/server/cli/mcp.ts"],"sourcesContent":["import { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { captureException } from \"@sentry/node\";\nimport { ServerType as ProxyServerType, startStdioServer } from \"mcp-proxy\";\nimport { logger } from \"../logger.ts\";\nimport { setShutdownHandlers, startServer } from \"../main.ts\";\nimport { createMCPInstance } from \"../mcp/mcp.ts\";\nimport type { CLIHandlerOptions } from \"../types/cli.ts\";\nimport type { NormalizedAllowedOrigins } from \"../utils/cors.ts\";\nimport { normalizeAllowedOrigins } from \"../utils/cors.ts\";\nimport { isSidecarRunning } from \"../utils/extras.ts\";\n\nasync function startServerWithStdioMCP(\n port: CLIHandlerOptions[\"port\"],\n basePath: CLIHandlerOptions[\"basePath\"],\n filesToServe: CLIHandlerOptions[\"filesToServe\"],\n normalizedAllowedOrigins: NormalizedAllowedOrigins | undefined,\n) {\n const serverInstance = await startServer({\n port,\n basePath,\n filesToServe,\n normalizedAllowedOrigins,\n });\n setShutdownHandlers(serverInstance);\n\n logger.info(\"Starting MCP over stdio too...\");\n const mcpInstance = createMCPInstance();\n await mcpInstance.connect(new StdioServerTransport());\n\n const shutdownMcp = () => {\n mcpInstance.close();\n };\n\n process.on(\"SIGINT\", shutdownMcp);\n process.on(\"SIGTERM\", shutdownMcp);\n\n return serverInstance;\n}\n\nasync function startMCPStdioHTTPProxy(\n port: CLIHandlerOptions[\"port\"],\n basePath: CLIHandlerOptions[\"basePath\"],\n filesToServe: CLIHandlerOptions[\"filesToServe\"],\n normalizedAllowedOrigins: NormalizedAllowedOrigins | undefined,\n) {\n let intentionalShutdown = false;\n let client: Client | null = null;\n let server: Awaited<ReturnType<typeof startStdioServer>> | null = null;\n\n const shutdown = async () => {\n if (intentionalShutdown) {\n // If we get the signal again, exit immediately\n logger.info(\"Bye.\");\n process.exit(0);\n }\n\n intentionalShutdown = true;\n logger.info(\"Shutting down MCP stdio proxy...\");\n\n if (client) {\n await client.close();\n }\n if (server) {\n await server.close();\n }\n };\n\n // Set up signal handlers for graceful shutdown\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n server = await startStdioServer({\n // We need to hook into `initStreamClient` as the returned object from startStdioServer\n // is not a meta proxy object giving access to both the server and the client. It just\n // returns the StdioServerTransport instance without a way to access the client or its errors.\n // TODO: We should probably upstream a fix for this to close the server or bubble the errors\n initStreamClient: () => {\n client = new Client({\n name: \"Spotlight Sidecar (stdio proxy)\",\n version: \"1.0.0\",\n });\n client.onerror = async (err: Error) => {\n if (\n err.message.startsWith(\"Maximum reconnection attempts\") ||\n /disconnected|fetch failed|connection closed/i.test(err.message)\n ) {\n if (client) await client.close();\n if (server) await server.close();\n } else if (!/conflict/i.test(err.message)) {\n captureException(err);\n logger.error(`MCP stdio proxy error: ${err.name}: ${err.message}`);\n }\n };\n return Promise.resolve(client);\n },\n serverType: ProxyServerType.HTTPStream,\n url: `http://localhost:${port}/mcp`,\n });\n server.onclose = async () => {\n // If this is an intentional shutdown, don't restart\n if (intentionalShutdown) {\n logger.info(\"MCP stdio proxy server closed.\");\n return;\n }\n\n logger.info(\"MCP stdio proxy server closed unexpectedly. Attempting to restart...\");\n process.off(\"SIGINT\", shutdown);\n process.off(\"SIGTERM\", shutdown);\n // We need to manually resume stdin as `StdioServerTransport` pauses it on\n // close but does not `resume` it when a new instance is created. Probably\n // a bug in https://github.com/modelcontextprotocol/typescript-sdk/blob/main/src/server/stdio.ts\n process.stdin.resume();\n\n try {\n await startMCPStdioHTTPProxy(port, basePath, filesToServe, normalizedAllowedOrigins);\n logger.info(\"Connection restored\");\n } catch (_err) {\n try {\n return await startServerWithStdioMCP(port, basePath, filesToServe, normalizedAllowedOrigins);\n } catch (_err2) {\n logger.error(\"Failed to restart sidecar server after MCP stdio proxy closed.\");\n captureException(_err2);\n await startMCPStdioHTTPProxy(port, basePath, filesToServe, normalizedAllowedOrigins);\n }\n }\n };\n}\n\nexport default async function mcp({ port, basePath, filesToServe, allowedOrigins }: CLIHandlerOptions) {\n // Normalize allowed origins once at startup\n const normalizedAllowedOrigins = allowedOrigins ? normalizeAllowedOrigins(allowedOrigins) : undefined;\n\n if (port > 0 && (await isSidecarRunning(port))) {\n logger.info(\"Connecting to existing MCP instance with stdio proxy...\");\n await startMCPStdioHTTPProxy(port, basePath, filesToServe, normalizedAllowedOrigins);\n logger.info(`Connected to existing MCP instance on port ${port}`);\n } else {\n return await startServerWithStdioMCP(port, basePath, filesToServe, normalizedAllowedOrigins);\n }\n}\n"],"names":["ProxyServerType"],"mappings":";;;;;;;;;;;;;;;;;;AAYA,eAAe,wBACb,MACA,UACA,cACA,0BACA;AACA,QAAM,iBAAiB,MAAM,YAAY;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AACD,sBAAoB,cAAc;AAElC,SAAO,KAAK,gCAAgC;AAC5C,QAAM,cAAc,kBAAA;AACpB,QAAM,YAAY,QAAQ,IAAI,sBAAsB;AAEpD,QAAM,cAAc,MAAM;AACxB,gBAAY,MAAA;AAAA,EACd;AAEA,UAAQ,GAAG,UAAU,WAAW;AAChC,UAAQ,GAAG,WAAW,WAAW;AAEjC,SAAO;AACT;AAEA,eAAe,uBACb,MACA,UACA,cACA,0BACA;AACA,MAAI,sBAAsB;AAC1B,MAAI,SAAwB;AAC5B,MAAI,SAA8D;AAElE,QAAM,WAAW,YAAY;AAC3B,QAAI,qBAAqB;AAEvB,aAAO,KAAK,MAAM;AAClB,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,0BAAsB;AACtB,WAAO,KAAK,kCAAkC;AAE9C,QAAI,QAAQ;AACV,YAAM,OAAO,MAAA;AAAA,IACf;AACA,QAAI,QAAQ;AACV,YAAM,OAAO,MAAA;AAAA,IACf;AAAA,EACF;AAGA,UAAQ,GAAG,UAAU,QAAQ;AAC7B,UAAQ,GAAG,WAAW,QAAQ;AAE9B,WAAS,MAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA,IAK9B,kBAAkB,MAAM;AACtB,eAAS,IAAI,OAAO;AAAA,QAClB,MAAM;AAAA,QACN,SAAS;AAAA,MAAA,CACV;AACD,aAAO,UAAU,OAAO,QAAe;AACrC,YACE,IAAI,QAAQ,WAAW,+BAA+B,KACtD,+CAA+C,KAAK,IAAI,OAAO,GAC/D;AACA,cAAI,OAAQ,OAAM,OAAO,MAAA;AACzB,cAAI,OAAQ,OAAM,OAAO,MAAA;AAAA,QAC3B,WAAW,CAAC,YAAY,KAAK,IAAI,OAAO,GAAG;AACzC,2BAAiB,GAAG;AACpB,iBAAO,MAAM,0BAA0B,IAAI,IAAI,KAAK,IAAI,OAAO,EAAE;AAAA,QACnE;AAAA,MACF;AACA,aAAO,QAAQ,QAAQ,MAAM;AAAA,IAC/B;AAAA,IACA,YAAYA,WAAgB;AAAA,IAC5B,KAAK,oBAAoB,IAAI;AAAA,EAAA,CAC9B;AACD,SAAO,UAAU,YAAY;AAE3B,QAAI,qBAAqB;AACvB,aAAO,KAAK,gCAAgC;AAC5C;AAAA,IACF;AAEA,WAAO,KAAK,sEAAsE;AAClF,YAAQ,IAAI,UAAU,QAAQ;AAC9B,YAAQ,IAAI,WAAW,QAAQ;AAI/B,YAAQ,MAAM,OAAA;AAEd,QAAI;AACF,YAAM,uBAAuB,MAAM,UAAU,cAAc,wBAAwB;AACnF,aAAO,KAAK,qBAAqB;AAAA,IACnC,SAAS,MAAM;AACb,UAAI;AACF,eAAO,MAAM,wBAAwB,MAAM,UAAU,cAAc,wBAAwB;AAAA,MAC7F,SAAS,OAAO;AACd,eAAO,MAAM,gEAAgE;AAC7E,yBAAiB,KAAK;AACtB,cAAM,uBAAuB,MAAM,UAAU,cAAc,wBAAwB;AAAA,MACrF;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAA8B,IAAI,EAAE,MAAM,UAAU,cAAc,kBAAqC;AAErG,QAAM,2BAA2B,iBAAiB,wBAAwB,cAAc,IAAI;AAE5F,MAAI,OAAO,KAAM,MAAM,iBAAiB,IAAI,GAAI;AAC9C,WAAO,KAAK,yDAAyD;AACrE,UAAM,uBAAuB,MAAM,UAAU,cAAc,wBAAwB;AACnF,WAAO,KAAK,8CAA8C,IAAI,EAAE;AAAA,EAClE,OAAO;AACL,WAAO,MAAM,wBAAwB,MAAM,UAAU,cAAc,wBAAwB;AAAA,EAC7F;AACF;"}
@@ -1,2 +1,2 @@
1
1
  import { CLIHandlerOptions } from '../types/cli.ts';
2
- export default function run({ port, cmdArgs, basePath, filesToServe, format }: CLIHandlerOptions): Promise<void>;
2
+ export default function run({ port, cmdArgs, basePath, filesToServe, format, allowedOrigins, }: CLIHandlerOptions): Promise<void>;
@@ -1,17 +1,30 @@
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] = "47ea9082-13e7-493c-ae81-4aadefdf848c", e._sentryDebugIdIdentifier = "sentry-dbid-47ea9082-13e7-493c-ae81-4aadefdf848c");
6
+ } catch (e2) {
7
+ }
8
+ }();
1
9
  import { spawn } from "node:child_process";
2
10
  import { readFileSync } from "node:fs";
3
11
  import * as path from "node:path";
4
12
  import * as readline from "node:readline";
13
+ import { metrics } from "@sentry/node";
5
14
  import { Searcher } from "fast-fuzzy";
6
15
  import { uuidv7 } from "uuidv7";
7
16
  import { SENTRY_CONTENT_TYPE } from "../../shared/constants.js";
17
+ import "../../_virtual/_sentry-release-injection-file.js";
8
18
  import { logger } from "../logger.js";
9
19
  import { detectDockerCompose, buildDockerComposeCommand } from "../utils/docker-compose.js";
10
20
  import { getSpotlightURL } from "../utils/extras.js";
11
21
  import { getBuffer } from "../utils/getBuffer.js";
12
22
  import { EventContainer } from "../utils/eventContainer.js";
23
+ import "node:dns/promises";
24
+ import "node:net";
25
+ import "node:os";
13
26
  import tail from "./tail.js";
14
- const SPOTLIGHT_VERSION = "4.6.0";
27
+ const SPOTLIGHT_VERSION = "4.7.1";
15
28
  const LOCALHOST_HOST = "localhost";
16
29
  const DOCKER_HOST = "host.docker.internal";
17
30
  function detectPackageJson() {
@@ -85,7 +98,14 @@ function createLogEnvelope(level, body, timestamp) {
85
98
  return Buffer.from(`${parts.join("\n")}
86
99
  `, "utf-8");
87
100
  }
88
- async function run({ port, cmdArgs, basePath, filesToServe, format }) {
101
+ async function run({
102
+ port,
103
+ cmdArgs,
104
+ basePath,
105
+ filesToServe,
106
+ format,
107
+ allowedOrigins
108
+ }) {
89
109
  let relayStdioAsLogs = true;
90
110
  const fuzzySearcher = new Searcher([], {
91
111
  threshold: 0.8,
@@ -115,7 +135,7 @@ async function run({ port, cmdArgs, basePath, filesToServe, format }) {
115
135
  }
116
136
  return true;
117
137
  };
118
- const serverInstance = await tail({ port, cmdArgs: [], basePath, filesToServe, format }, logChecker);
138
+ const serverInstance = await tail({ port, cmdArgs: [], basePath, filesToServe, format, allowedOrigins }, logChecker);
119
139
  if (!serverInstance) {
120
140
  logger.error("Failed to start Spotlight sidecar server.");
121
141
  logger.error(`The port ${port} might already be in use — most likely by another Spotlight instance.`);
@@ -145,10 +165,12 @@ async function run({ port, cmdArgs, basePath, filesToServe, format }) {
145
165
  process.exit(1);
146
166
  }
147
167
  const choice = await promptUserChoice();
168
+ metrics.count("cli.run.prompt_choice", 1, { attributes: { choice } });
148
169
  if (choice === "docker") {
149
170
  logger.info(
150
171
  `Detected Docker Compose project with ${dockerCompose.serviceNames.length} service(s): ${dockerCompose.serviceNames.join(", ")}`
151
172
  );
173
+ metrics.count("cli.run.autodetect", 1, { attributes: { type: "docker-compose" } });
152
174
  env.SENTRY_SPOTLIGHT = getSpotlightURL(actualServerPort, DOCKER_HOST);
153
175
  const command = buildDockerComposeCommand(dockerCompose);
154
176
  cmdArgs = command.cmdArgs;
@@ -156,6 +178,7 @@ async function run({ port, cmdArgs, basePath, filesToServe, format }) {
156
178
  delete env.COMPOSE_FILE;
157
179
  } else {
158
180
  logger.info(`Using package.json script: ${packageJson.scriptName}`);
181
+ metrics.count("cli.run.autodetect", 1, { attributes: { type: "package-json" } });
159
182
  cmdArgs = [packageJson.scriptCommand];
160
183
  shell = true;
161
184
  env.PATH = path.resolve("./node_modules/.bin") + path.delimiter + env.PATH;
@@ -164,6 +187,7 @@ async function run({ port, cmdArgs, basePath, filesToServe, format }) {
164
187
  logger.info(
165
188
  `Detected Docker Compose project with ${dockerCompose.serviceNames.length} service(s): ${dockerCompose.serviceNames.join(", ")}`
166
189
  );
190
+ metrics.count("cli.run.autodetect", 1, { attributes: { type: "docker-compose" } });
167
191
  env.SENTRY_SPOTLIGHT = getSpotlightURL(actualServerPort, DOCKER_HOST);
168
192
  const command = buildDockerComposeCommand(dockerCompose);
169
193
  cmdArgs = command.cmdArgs;
@@ -171,6 +195,7 @@ async function run({ port, cmdArgs, basePath, filesToServe, format }) {
171
195
  delete env.COMPOSE_FILE;
172
196
  } else if (packageJson) {
173
197
  logger.info(`Using package.json script: ${packageJson.scriptName}`);
198
+ metrics.count("cli.run.autodetect", 1, { attributes: { type: "package-json" } });
174
199
  cmdArgs = [packageJson.scriptCommand];
175
200
  shell = true;
176
201
  env.PATH = path.resolve("./node_modules/.bin") + path.delimiter + env.PATH;
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sources":["../../../src/server/cli/run.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport { readFileSync } from \"node:fs\";\nimport type { AddressInfo } from \"node:net\";\nimport * as path from \"node:path\";\nimport * as readline from \"node:readline\";\nimport type { SerializedLog } from \"@sentry/core\";\nimport { Searcher } from \"fast-fuzzy\";\nimport { uuidv7 } from \"uuidv7\";\nimport { SENTRY_CONTENT_TYPE } from \"../constants.ts\";\nimport { logger } from \"../logger.ts\";\nimport type { SentryLogEvent } from \"../parser/types.ts\";\nimport type { CLIHandlerOptions } from \"../types/cli.ts\";\nimport { buildDockerComposeCommand, detectDockerCompose } from \"../utils/docker-compose.ts\";\nimport { getSpotlightURL } from \"../utils/extras.ts\";\nimport { EventContainer, getBuffer } from \"../utils/index.ts\";\nimport tail, { type OnItemCallback } from \"./tail.ts\";\n\nconst SPOTLIGHT_VERSION = process.env.npm_package_version || \"unknown\";\n\n// Environment variable host configurations\nconst LOCALHOST_HOST = \"localhost\";\nconst DOCKER_HOST = \"host.docker.internal\";\n\n/**\n * Detect if there's a package.json with runnable scripts\n */\nfunction detectPackageJson(): { scriptName: string; scriptCommand: string } | null {\n try {\n const scripts = JSON.parse(readFileSync(\"./package.json\", \"utf-8\")).scripts;\n const scriptName = [\"dev\", \"develop\", \"serve\", \"start\"].find(name => scripts[name]);\n if (!scriptName || !scripts[scriptName]) {\n return null;\n }\n return { scriptName, scriptCommand: scripts[scriptName] };\n } catch {\n // pass\n }\n return null;\n}\n\n/**\n * Prompt the user to choose between Docker Compose and package.json\n */\nasync function promptUserChoice(): Promise<\"docker\" | \"package\"> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise(resolve => {\n console.log(\"\\n⚠️ Both Docker Compose and package.json detected!\");\n console.log(\"\\nWhich would you like to use?\");\n console.log(\" 1) docker compose\");\n console.log(\" 2) package.json\");\n\n rl.question(\"Enter your choice (1 or 2): \", answer => {\n rl.close();\n const choice = answer.trim();\n const selected = choice === \"2\" ? \"package\" : \"docker\";\n logger.info(`Selected: ${selected === \"docker\" ? \"Docker compose\" : \"package.json\"}`);\n resolve(selected);\n });\n });\n}\n\nfunction createLogEnvelope(level: \"info\" | \"error\", body: string, timestamp: number): Buffer {\n const envelopeHeader = {\n sdk: {\n name: \"sentry.spotlight.stdio\",\n version: SPOTLIGHT_VERSION,\n },\n };\n\n const logItem: SerializedLog = {\n timestamp,\n level,\n body,\n attributes: {},\n };\n\n const logPayload: SentryLogEvent = {\n type: \"log\",\n event_id: uuidv7(),\n timestamp,\n items: [\n {\n ...logItem,\n id: uuidv7(),\n severity_number: level === \"error\" ? 17 : 9, // ERROR=17, INFO=9 per OpenTelemetry spec\n sdk: undefined,\n },\n ],\n };\n\n const payloadJson = JSON.stringify(logPayload);\n const payloadBuffer = Buffer.from(payloadJson, \"utf-8\");\n\n const itemHeader = {\n type: \"log\",\n length: payloadBuffer.length, // Use byte length, not string length\n item_count: 1,\n content_type: \"application/json\",\n };\n\n const parts = [JSON.stringify(envelopeHeader), JSON.stringify(itemHeader), payloadJson];\n\n return Buffer.from(`${parts.join(\"\\n\")}\\n`, \"utf-8\");\n}\n\nexport default async function run({ port, cmdArgs, basePath, filesToServe, format }: CLIHandlerOptions) {\n let relayStdioAsLogs = true;\n\n const fuzzySearcher = new Searcher([] as string[], {\n threshold: 0.8,\n ignoreCase: false,\n });\n\n const logChecker: OnItemCallback = (type, item, envelopeHeader) => {\n if (type !== \"log\") return true;\n\n const [, payload] = item;\n const logEvent = payload as SentryLogEvent;\n\n if (logEvent.items && logEvent.items.length > 0) {\n for (const logItem of logEvent.items) {\n // Check if this is a stdio log from Spotlight itself\n if (envelopeHeader.sdk?.name === \"sentry.spotlight.stdio\") {\n continue;\n }\n\n if (!relayStdioAsLogs) continue;\n\n const logBody = typeof logItem.body === \"string\" ? logItem.body : String(logItem.body);\n const trimmedBody = logBody.trim();\n\n if (trimmedBody) {\n const matches = fuzzySearcher.search(trimmedBody);\n if (matches.length > 0) {\n logger.debug(\"Detected Sentry logging in the process, disabling stdio relay\");\n relayStdioAsLogs = false;\n return false;\n }\n }\n }\n }\n\n return true;\n };\n\n const serverInstance = await tail({ port, cmdArgs: [], basePath, filesToServe, format }, logChecker);\n if (!serverInstance) {\n logger.error(\"Failed to start Spotlight sidecar server.\");\n logger.error(`The port ${port} might already be in use — most likely by another Spotlight instance.`);\n process.exit(1);\n }\n\n // We *MUST* have an instance address and a port here\n // as not having that indicates either the server did not start\n // or started in a weird manner (like over a unix socket)\n const actualServerPort = (serverInstance.address() as AddressInfo).port;\n const spotlightUrl = getSpotlightURL(actualServerPort, LOCALHOST_HOST);\n let shell = false;\n let stdin: string | undefined = undefined;\n const env = {\n ...process.env,\n SENTRY_SPOTLIGHT: spotlightUrl,\n // We need the one below for Next.js projects -- they only allow NEXT_PUBLIC_ prefixed env vars\n // on frontend code\n NEXT_PUBLIC_SENTRY_SPOTLIGHT: spotlightUrl,\n // This is not supported in all SDKs but worth adding\n // for the ones that support it\n SENTRY_TRACES_SAMPLE_RATE: \"1\",\n } as {\n PATH: string;\n SENTRY_SPOTLIGHT: string;\n NEXT_PUBLIC_SENTRY_SPOTLIGHT: string;\n SENTRY_TRACES_SAMPLE_RATE: string;\n [key: string]: string;\n };\n if (cmdArgs.length === 0) {\n const dockerCompose = detectDockerCompose();\n const packageJson = detectPackageJson();\n\n // If both Docker Compose and package.json are detected, ask the user which one to use\n if (dockerCompose && packageJson) {\n if (!process.stdin.isTTY) {\n logger.error(\"Both Docker Compose and package.json detected, but cannot prompt in non-interactive mode.\");\n logger.error(\"Please specify a command explicitly or run in an interactive terminal.\");\n process.exit(1);\n }\n const choice = await promptUserChoice();\n\n if (choice === \"docker\") {\n logger.info(\n `Detected Docker Compose project with ${dockerCompose.serviceNames.length} service(s): ${dockerCompose.serviceNames.join(\", \")}`,\n );\n // Use host.docker.internal for backend services to access the host machine\n env.SENTRY_SPOTLIGHT = getSpotlightURL(actualServerPort, DOCKER_HOST);\n const command = buildDockerComposeCommand(dockerCompose);\n cmdArgs = command.cmdArgs;\n stdin = command.stdin;\n // Always unset COMPOSE_FILE to avoid conflicts with explicit -f flags\n delete env.COMPOSE_FILE;\n } else {\n logger.info(`Using package.json script: ${packageJson.scriptName}`);\n cmdArgs = [packageJson.scriptCommand];\n shell = true;\n env.PATH = path.resolve(\"./node_modules/.bin\") + path.delimiter + env.PATH;\n }\n } else if (dockerCompose) {\n logger.info(\n `Detected Docker Compose project with ${dockerCompose.serviceNames.length} service(s): ${dockerCompose.serviceNames.join(\", \")}`,\n );\n // Use host.docker.internal for backend services to access the host machine\n env.SENTRY_SPOTLIGHT = getSpotlightURL(actualServerPort, DOCKER_HOST);\n\n const command = buildDockerComposeCommand(dockerCompose);\n cmdArgs = command.cmdArgs;\n stdin = command.stdin;\n // Always unset COMPOSE_FILE to avoid conflicts with explicit -f flags\n delete env.COMPOSE_FILE;\n } else if (packageJson) {\n logger.info(`Using package.json script: ${packageJson.scriptName}`);\n cmdArgs = [packageJson.scriptCommand];\n shell = true;\n env.PATH = path.resolve(\"./node_modules/.bin\") + path.delimiter + env.PATH;\n }\n }\n if (cmdArgs.length === 0) {\n logger.error(\"Error: No command specified to run and could not infer the command automatically.\");\n process.exit(1);\n }\n const cmdStr = cmdArgs.join(\" \");\n logger.info(`Starting command: ${cmdStr}`);\n // When we have Docker Compose override YAML (for -f -), we need to pipe stdin\n // Otherwise, inherit stdin to relay user input to the downstream process\n const stdinMode: \"pipe\" | \"inherit\" = stdin ? \"pipe\" : \"inherit\";\n const runCmd = spawn(cmdArgs[0], cmdArgs.slice(1), {\n cwd: process.cwd(),\n env,\n shell,\n windowsVerbatimArguments: true,\n windowsHide: true,\n stdio: [stdinMode, \"pipe\", \"pipe\"],\n });\n\n const { stdout, stderr } = runCmd;\n if (!stdout || !stderr) {\n logger.error(\"Failed to create process streams\");\n process.exit(1);\n }\n\n // If our command has a stdin input _and_ we can send to stdin, write and close\n if (stdin) {\n if (!runCmd.stdin) {\n logger.error(\"Failed to pipe Docker Compose override: stdin is not available\");\n process.exit(1);\n }\n runCmd.stdin.write(stdin);\n runCmd.stdin.end();\n }\n\n const processLogLine = (line: string, level: \"info\" | \"error\") => {\n if (!relayStdioAsLogs) return;\n const trimmedLine = line.trim();\n if (!trimmedLine) return;\n\n fuzzySearcher.add(trimmedLine);\n\n const timestamp = Date.now() / 1000;\n const envelopeBuffer = createLogEnvelope(level, trimmedLine, timestamp);\n\n const container = new EventContainer(SENTRY_CONTENT_TYPE, envelopeBuffer);\n // Add to buffer - this will automatically trigger all subscribers\n // including the onEnvelope callback registered in tail()\n getBuffer().put(container);\n };\n\n let stdoutBuffer = \"\";\n let stderrBuffer = \"\";\n\n // Stream stdout as info-level logs\n stdout.on(\"data\", (data: Buffer) => {\n stdoutBuffer += data.toString();\n const lines = stdoutBuffer.split(\"\\n\");\n // Keep the last partial line in the buffer\n stdoutBuffer = lines.pop() || \"\";\n\n for (const line of lines) {\n processLogLine(line, \"info\");\n }\n });\n\n // Stream stderr as error-level logs\n stderr.on(\"data\", (data: Buffer) => {\n stderrBuffer += data.toString();\n const lines = stderrBuffer.split(\"\\n\");\n // Keep the last partial line in the buffer\n stderrBuffer = lines.pop() || \"\";\n\n for (const line of lines) {\n processLogLine(line, \"error\");\n }\n });\n\n runCmd.on(\"error\", err => {\n logger.error(`Failed to run ${cmdStr}:`);\n logger.error(err);\n process.exit(1);\n });\n\n runCmd.on(\"close\", code => {\n // Handle any remaining buffered lines\n if (stdoutBuffer.trim()) {\n processLogLine(stdoutBuffer, \"info\");\n }\n if (stderrBuffer.trim()) {\n processLogLine(stderrBuffer, \"error\");\n }\n\n if (!code) {\n logger.error(`${cmdStr} exited, terminating.`);\n } else {\n logger.error(`${cmdStr} exited with code ${code}.`);\n }\n process.exit(code);\n });\n const killRunCmd = () => {\n if (runCmd.killed) return;\n stdout.destroy();\n stderr.destroy();\n runCmd.kill();\n };\n runCmd.on(\"spawn\", () => {\n runCmd.removeAllListeners(\"spawn\");\n runCmd.removeAllListeners(\"error\");\n process.on(\"SIGINT\", killRunCmd);\n process.on(\"SIGTERM\", killRunCmd);\n process.on(\"beforeExit\", killRunCmd);\n });\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run.js","sources":["../../../src/server/cli/run.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport { readFileSync } from \"node:fs\";\nimport type { AddressInfo } from \"node:net\";\nimport * as path from \"node:path\";\nimport * as readline from \"node:readline\";\nimport type { SerializedLog } from \"@sentry/core\";\nimport { metrics } from \"@sentry/node\";\nimport { Searcher } from \"fast-fuzzy\";\nimport { uuidv7 } from \"uuidv7\";\nimport { SENTRY_CONTENT_TYPE } from \"../constants.ts\";\nimport { logger } from \"../logger.ts\";\nimport type { SentryLogEvent } from \"../parser/types.ts\";\nimport type { CLIHandlerOptions } from \"../types/cli.ts\";\nimport { buildDockerComposeCommand, detectDockerCompose } from \"../utils/docker-compose.ts\";\nimport { getSpotlightURL } from \"../utils/extras.ts\";\nimport { EventContainer, getBuffer } from \"../utils/index.ts\";\nimport tail, { type OnItemCallback } from \"./tail.ts\";\n\nconst SPOTLIGHT_VERSION = process.env.npm_package_version || \"unknown\";\n\n// Environment variable host configurations\nconst LOCALHOST_HOST = \"localhost\";\nconst DOCKER_HOST = \"host.docker.internal\";\n\n/**\n * Detect if there's a package.json with runnable scripts\n */\nfunction detectPackageJson(): { scriptName: string; scriptCommand: string } | null {\n try {\n const scripts = JSON.parse(readFileSync(\"./package.json\", \"utf-8\")).scripts;\n const scriptName = [\"dev\", \"develop\", \"serve\", \"start\"].find(name => scripts[name]);\n if (!scriptName || !scripts[scriptName]) {\n return null;\n }\n return { scriptName, scriptCommand: scripts[scriptName] };\n } catch {\n // pass\n }\n return null;\n}\n\n/**\n * Prompt the user to choose between Docker Compose and package.json\n */\nasync function promptUserChoice(): Promise<\"docker\" | \"package\"> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise(resolve => {\n console.log(\"\\n⚠️ Both Docker Compose and package.json detected!\");\n console.log(\"\\nWhich would you like to use?\");\n console.log(\" 1) docker compose\");\n console.log(\" 2) package.json\");\n\n rl.question(\"Enter your choice (1 or 2): \", answer => {\n rl.close();\n const choice = answer.trim();\n const selected = choice === \"2\" ? \"package\" : \"docker\";\n logger.info(`Selected: ${selected === \"docker\" ? \"Docker compose\" : \"package.json\"}`);\n resolve(selected);\n });\n });\n}\n\nfunction createLogEnvelope(level: \"info\" | \"error\", body: string, timestamp: number): Buffer {\n const envelopeHeader = {\n sdk: {\n name: \"sentry.spotlight.stdio\",\n version: SPOTLIGHT_VERSION,\n },\n };\n\n const logItem: SerializedLog = {\n timestamp,\n level,\n body,\n attributes: {},\n };\n\n const logPayload: SentryLogEvent = {\n type: \"log\",\n event_id: uuidv7(),\n timestamp,\n items: [\n {\n ...logItem,\n id: uuidv7(),\n severity_number: level === \"error\" ? 17 : 9, // ERROR=17, INFO=9 per OpenTelemetry spec\n sdk: undefined,\n },\n ],\n };\n\n const payloadJson = JSON.stringify(logPayload);\n const payloadBuffer = Buffer.from(payloadJson, \"utf-8\");\n\n const itemHeader = {\n type: \"log\",\n length: payloadBuffer.length, // Use byte length, not string length\n item_count: 1,\n content_type: \"application/json\",\n };\n\n const parts = [JSON.stringify(envelopeHeader), JSON.stringify(itemHeader), payloadJson];\n\n return Buffer.from(`${parts.join(\"\\n\")}\\n`, \"utf-8\");\n}\n\nexport default async function run({\n port,\n cmdArgs,\n basePath,\n filesToServe,\n format,\n allowedOrigins,\n}: CLIHandlerOptions) {\n let relayStdioAsLogs = true;\n\n const fuzzySearcher = new Searcher([] as string[], {\n threshold: 0.8,\n ignoreCase: false,\n });\n\n const logChecker: OnItemCallback = (type, item, envelopeHeader) => {\n if (type !== \"log\") return true;\n\n const [, payload] = item;\n const logEvent = payload as SentryLogEvent;\n\n if (logEvent.items && logEvent.items.length > 0) {\n for (const logItem of logEvent.items) {\n // Check if this is a stdio log from Spotlight itself\n if (envelopeHeader.sdk?.name === \"sentry.spotlight.stdio\") {\n continue;\n }\n\n if (!relayStdioAsLogs) continue;\n\n const logBody = typeof logItem.body === \"string\" ? logItem.body : String(logItem.body);\n const trimmedBody = logBody.trim();\n\n if (trimmedBody) {\n const matches = fuzzySearcher.search(trimmedBody);\n if (matches.length > 0) {\n logger.debug(\"Detected Sentry logging in the process, disabling stdio relay\");\n relayStdioAsLogs = false;\n return false;\n }\n }\n }\n }\n\n return true;\n };\n\n const serverInstance = await tail({ port, cmdArgs: [], basePath, filesToServe, format, allowedOrigins }, logChecker);\n if (!serverInstance) {\n logger.error(\"Failed to start Spotlight sidecar server.\");\n logger.error(`The port ${port} might already be in use — most likely by another Spotlight instance.`);\n process.exit(1);\n }\n\n // We *MUST* have an instance address and a port here\n // as not having that indicates either the server did not start\n // or started in a weird manner (like over a unix socket)\n const actualServerPort = (serverInstance.address() as AddressInfo).port;\n const spotlightUrl = getSpotlightURL(actualServerPort, LOCALHOST_HOST);\n let shell = false;\n let stdin: string | undefined = undefined;\n const env = {\n ...process.env,\n SENTRY_SPOTLIGHT: spotlightUrl,\n // We need the one below for Next.js projects -- they only allow NEXT_PUBLIC_ prefixed env vars\n // on frontend code\n NEXT_PUBLIC_SENTRY_SPOTLIGHT: spotlightUrl,\n // This is not supported in all SDKs but worth adding\n // for the ones that support it\n SENTRY_TRACES_SAMPLE_RATE: \"1\",\n } as {\n PATH: string;\n SENTRY_SPOTLIGHT: string;\n NEXT_PUBLIC_SENTRY_SPOTLIGHT: string;\n SENTRY_TRACES_SAMPLE_RATE: string;\n [key: string]: string;\n };\n if (cmdArgs.length === 0) {\n const dockerCompose = detectDockerCompose();\n const packageJson = detectPackageJson();\n\n // If both Docker Compose and package.json are detected, ask the user which one to use\n if (dockerCompose && packageJson) {\n if (!process.stdin.isTTY) {\n logger.error(\"Both Docker Compose and package.json detected, but cannot prompt in non-interactive mode.\");\n logger.error(\"Please specify a command explicitly or run in an interactive terminal.\");\n process.exit(1);\n }\n const choice = await promptUserChoice();\n metrics.count(\"cli.run.prompt_choice\", 1, { attributes: { choice } });\n\n if (choice === \"docker\") {\n logger.info(\n `Detected Docker Compose project with ${dockerCompose.serviceNames.length} service(s): ${dockerCompose.serviceNames.join(\", \")}`,\n );\n metrics.count(\"cli.run.autodetect\", 1, { attributes: { type: \"docker-compose\" } });\n // Use host.docker.internal for backend services to access the host machine\n env.SENTRY_SPOTLIGHT = getSpotlightURL(actualServerPort, DOCKER_HOST);\n const command = buildDockerComposeCommand(dockerCompose);\n cmdArgs = command.cmdArgs;\n stdin = command.stdin;\n // Always unset COMPOSE_FILE to avoid conflicts with explicit -f flags\n // biome-ignore lint/performance/noDelete: need to remove env var entirely\n delete env.COMPOSE_FILE;\n } else {\n logger.info(`Using package.json script: ${packageJson.scriptName}`);\n metrics.count(\"cli.run.autodetect\", 1, { attributes: { type: \"package-json\" } });\n cmdArgs = [packageJson.scriptCommand];\n shell = true;\n env.PATH = path.resolve(\"./node_modules/.bin\") + path.delimiter + env.PATH;\n }\n } else if (dockerCompose) {\n logger.info(\n `Detected Docker Compose project with ${dockerCompose.serviceNames.length} service(s): ${dockerCompose.serviceNames.join(\", \")}`,\n );\n metrics.count(\"cli.run.autodetect\", 1, { attributes: { type: \"docker-compose\" } });\n // Use host.docker.internal for backend services to access the host machine\n env.SENTRY_SPOTLIGHT = getSpotlightURL(actualServerPort, DOCKER_HOST);\n\n const command = buildDockerComposeCommand(dockerCompose);\n cmdArgs = command.cmdArgs;\n stdin = command.stdin;\n // Always unset COMPOSE_FILE to avoid conflicts with explicit -f flags\n // biome-ignore lint/performance/noDelete: need to remove env var entirely\n delete env.COMPOSE_FILE;\n } else if (packageJson) {\n logger.info(`Using package.json script: ${packageJson.scriptName}`);\n metrics.count(\"cli.run.autodetect\", 1, { attributes: { type: \"package-json\" } });\n cmdArgs = [packageJson.scriptCommand];\n shell = true;\n env.PATH = path.resolve(\"./node_modules/.bin\") + path.delimiter + env.PATH;\n }\n }\n if (cmdArgs.length === 0) {\n logger.error(\"Error: No command specified to run and could not infer the command automatically.\");\n process.exit(1);\n }\n const cmdStr = cmdArgs.join(\" \");\n logger.info(`Starting command: ${cmdStr}`);\n // When we have Docker Compose override YAML (for -f -), we need to pipe stdin\n // Otherwise, inherit stdin to relay user input to the downstream process\n const stdinMode: \"pipe\" | \"inherit\" = stdin ? \"pipe\" : \"inherit\";\n const runCmd = spawn(cmdArgs[0], cmdArgs.slice(1), {\n cwd: process.cwd(),\n env,\n shell,\n windowsVerbatimArguments: true,\n windowsHide: true,\n stdio: [stdinMode, \"pipe\", \"pipe\"],\n });\n\n const { stdout, stderr } = runCmd;\n if (!stdout || !stderr) {\n logger.error(\"Failed to create process streams\");\n process.exit(1);\n }\n\n // If our command has a stdin input _and_ we can send to stdin, write and close\n if (stdin) {\n if (!runCmd.stdin) {\n logger.error(\"Failed to pipe Docker Compose override: stdin is not available\");\n process.exit(1);\n }\n runCmd.stdin.write(stdin);\n runCmd.stdin.end();\n }\n\n const processLogLine = (line: string, level: \"info\" | \"error\") => {\n if (!relayStdioAsLogs) return;\n const trimmedLine = line.trim();\n if (!trimmedLine) return;\n\n fuzzySearcher.add(trimmedLine);\n\n const timestamp = Date.now() / 1000;\n const envelopeBuffer = createLogEnvelope(level, trimmedLine, timestamp);\n\n const container = new EventContainer(SENTRY_CONTENT_TYPE, envelopeBuffer);\n // Add to buffer - this will automatically trigger all subscribers\n // including the onEnvelope callback registered in tail()\n getBuffer().put(container);\n };\n\n let stdoutBuffer = \"\";\n let stderrBuffer = \"\";\n\n // Stream stdout as info-level logs\n stdout.on(\"data\", (data: Buffer) => {\n stdoutBuffer += data.toString();\n const lines = stdoutBuffer.split(\"\\n\");\n // Keep the last partial line in the buffer\n stdoutBuffer = lines.pop() || \"\";\n\n for (const line of lines) {\n processLogLine(line, \"info\");\n }\n });\n\n // Stream stderr as error-level logs\n stderr.on(\"data\", (data: Buffer) => {\n stderrBuffer += data.toString();\n const lines = stderrBuffer.split(\"\\n\");\n // Keep the last partial line in the buffer\n stderrBuffer = lines.pop() || \"\";\n\n for (const line of lines) {\n processLogLine(line, \"error\");\n }\n });\n\n runCmd.on(\"error\", err => {\n logger.error(`Failed to run ${cmdStr}:`);\n logger.error(err);\n process.exit(1);\n });\n\n runCmd.on(\"close\", code => {\n // Handle any remaining buffered lines\n if (stdoutBuffer.trim()) {\n processLogLine(stdoutBuffer, \"info\");\n }\n if (stderrBuffer.trim()) {\n processLogLine(stderrBuffer, \"error\");\n }\n\n if (!code) {\n logger.error(`${cmdStr} exited, terminating.`);\n } else {\n logger.error(`${cmdStr} exited with code ${code}.`);\n }\n process.exit(code);\n });\n const killRunCmd = () => {\n if (runCmd.killed) return;\n stdout.destroy();\n stderr.destroy();\n runCmd.kill();\n };\n runCmd.on(\"spawn\", () => {\n runCmd.removeAllListeners(\"spawn\");\n runCmd.removeAllListeners(\"error\");\n process.on(\"SIGINT\", killRunCmd);\n process.on(\"SIGTERM\", killRunCmd);\n process.on(\"beforeExit\", killRunCmd);\n });\n}\n"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
1
  import { CLIHandlerOptions } from '../types/cli.ts';
2
- export default function server({ port, basePath, filesToServe }: CLIHandlerOptions): Promise<import('http').Server<typeof import('http').IncomingMessage, typeof import('http').ServerResponse> | undefined>;
2
+ export default function server({ port, basePath, filesToServe, allowedOrigins }: CLIHandlerOptions): Promise<import('http').Server<typeof import('http').IncomingMessage, typeof import('http').ServerResponse> | undefined>;
@@ -1,10 +1,20 @@
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] = "b0df70d8-9df1-45bb-8915-b98805fbbb55", e._sentryDebugIdIdentifier = "sentry-dbid-b0df70d8-9df1-45bb-8915-b98805fbbb55");
6
+ } catch (e2) {
7
+ }
8
+ }();
1
9
  import { setupSpotlight } from "../main.js";
2
- async function server({ port, basePath, filesToServe }) {
10
+ import "../../_virtual/_sentry-release-injection-file.js";
11
+ async function server({ port, basePath, filesToServe, allowedOrigins }) {
3
12
  return await setupSpotlight({
4
13
  port,
5
14
  basePath,
6
15
  filesToServe,
7
- isStandalone: true
16
+ isStandalone: true,
17
+ allowedOrigins
8
18
  });
9
19
  }
10
20
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sources":["../../../src/server/cli/server.ts"],"sourcesContent":["import { setupSpotlight } from \"../main.ts\";\nimport type { CLIHandlerOptions } from \"../types/cli.ts\";\n\nexport default async function server({ port, basePath, filesToServe }: CLIHandlerOptions) {\n return await setupSpotlight({\n port,\n basePath,\n filesToServe,\n isStandalone: true,\n });\n}\n"],"names":[],"mappings":";AAGA,eAA8B,OAAO,EAAE,MAAM,UAAU,gBAAmC;AACxF,SAAO,MAAM,eAAe;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,EAAA,CACf;AACH;"}
1
+ {"version":3,"file":"server.js","sources":["../../../src/server/cli/server.ts"],"sourcesContent":["import { setupSpotlight } from \"../main.ts\";\nimport type { CLIHandlerOptions } from \"../types/cli.ts\";\n\nexport default async function server({ port, basePath, filesToServe, allowedOrigins }: CLIHandlerOptions) {\n return await setupSpotlight({\n port,\n basePath,\n filesToServe,\n isStandalone: true,\n allowedOrigins,\n });\n}\n"],"names":[],"mappings":";;;;;;;;;;AAGA,eAA8B,OAAO,EAAE,MAAM,UAAU,cAAc,kBAAqC;AACxG,SAAO,MAAM,eAAe;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd;AAAA,EAAA,CACD;AACH;"}
@@ -5,4 +5,4 @@ export type OnItemCallback = (type: string, item: ParsedEnvelope["envelope"][1][
5
5
  export declare const NAME_TO_TYPE_MAPPING: Record<string, string[]>;
6
6
  export declare const EVERYTHING_MAGIC_WORDS: Set<string>;
7
7
  export declare const SUPPORTED_TAIL_ARGS: Set<string>;
8
- export default function tail({ port, cmdArgs, basePath, filesToServe, format }: CLIHandlerOptions, onItem?: OnItemCallback): Promise<ServerType | undefined>;
8
+ export default function tail({ port, cmdArgs, basePath, filesToServe, format, allowedOrigins }: CLIHandlerOptions, onItem?: OnItemCallback): Promise<ServerType | undefined>;
@@ -1,6 +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] = "f35053fc-26c9-45cd-b2da-1b59b921e9cb", e._sentryDebugIdIdentifier = "sentry-dbid-f35053fc-26c9-45cd-b2da-1b59b921e9cb");
6
+ } catch (e2) {
7
+ }
8
+ }();
1
9
  import { captureException } from "@sentry/core";
10
+ import { metrics } from "@sentry/node";
2
11
  import { EventSource } from "eventsource";
3
12
  import { SENTRY_CONTENT_TYPE } from "../../shared/constants.js";
13
+ import "../../_virtual/_sentry-release-injection-file.js";
4
14
  import { applyFormatter } from "../formatters/index.js";
5
15
  import { logger } from "../logger.js";
6
16
  import { setupSpotlight } from "../main.js";
@@ -8,6 +18,9 @@ import { getSpotlightURL } from "../utils/extras.js";
8
18
  import { getBuffer } from "../utils/getBuffer.js";
9
19
  import "../parser/helpers.js";
10
20
  import "uuidv7";
21
+ import "node:dns/promises";
22
+ import "node:net";
23
+ import "node:os";
11
24
  import { formatters } from "../formatters/human/index.js";
12
25
  import { formatters as formatters$1 } from "../formatters/json/index.js";
13
26
  import { formatters as formatters$2 } from "../formatters/logfmt/index.js";
@@ -36,7 +49,7 @@ const connectUpstream = async (port) => new Promise((resolve, reject) => {
36
49
  client.onerror = reject;
37
50
  client.onopen = () => resolve(client);
38
51
  });
39
- async function tail({ port, cmdArgs, basePath, filesToServe, format = "logfmt" }, onItem) {
52
+ async function tail({ port, cmdArgs, basePath, filesToServe, format = "logfmt", allowedOrigins }, onItem) {
40
53
  const eventTypes = cmdArgs.length > 0 ? cmdArgs.map((arg) => arg.toLowerCase()) : ["everything"];
41
54
  for (const eventType of eventTypes) {
42
55
  if (!SUPPORTED_TAIL_ARGS.has(eventType)) {
@@ -45,6 +58,9 @@ async function tail({ port, cmdArgs, basePath, filesToServe, format = "logfmt" }
45
58
  process.exit(1);
46
59
  }
47
60
  }
61
+ for (const eventType of eventTypes) {
62
+ metrics.count("cli.tail.event_type", 1, { attributes: { type: eventType } });
63
+ }
48
64
  const formatter = FORMATTERS[format];
49
65
  const types = eventTypes.some((type) => EVERYTHING_MAGIC_WORDS.has(type)) ? SUPPORTED_ENVELOPE_TYPES : /* @__PURE__ */ new Set([...eventTypes.flatMap((type) => NAME_TO_TYPE_MAPPING[type] || [])]);
50
66
  const onEnvelope = (envelope) => {
@@ -79,7 +95,7 @@ async function tail({ port, cmdArgs, basePath, filesToServe, format = "logfmt" }
79
95
  process.exit(1);
80
96
  }
81
97
  }
82
- const serverInstance = await setupSpotlight({ port, filesToServe, basePath, isStandalone: true });
98
+ const serverInstance = await setupSpotlight({ port, filesToServe, basePath, isStandalone: true, allowedOrigins });
83
99
  getBuffer().subscribe((container) => {
84
100
  const parsedEnvelope = container.getParsedEnvelope();
85
101
  if (parsedEnvelope) {
@@ -1 +1 @@
1
- {"version":3,"file":"tail.js","sources":["../../../src/server/cli/tail.ts"],"sourcesContent":["import type { ServerType } from \"@hono/node-server\";\nimport { captureException } from \"@sentry/core\";\nimport { EventSource } from \"eventsource\";\nimport { SENTRY_CONTENT_TYPE } from \"../constants.ts\";\nimport {\n type FormatterRegistry,\n type FormatterType,\n applyFormatter,\n humanFormatters,\n jsonFormatters,\n logfmtFormatters,\n mdFormatters,\n} from \"../formatters/index.ts\";\nimport { logger } from \"../logger.ts\";\nimport { setupSpotlight } from \"../main.ts\";\nimport type { ParsedEnvelope } from \"../parser/index.ts\";\nimport type { CLIHandlerOptions } from \"../types/cli.ts\";\nimport { getSpotlightURL } from \"../utils/extras.ts\";\nimport { getBuffer } from \"../utils/index.ts\";\n\nexport type OnItemCallback = (\n type: string,\n item: ParsedEnvelope[\"envelope\"][1][number],\n envelopeHeader: ParsedEnvelope[\"envelope\"][0],\n) => boolean;\nexport const NAME_TO_TYPE_MAPPING: Record<string, string[]> = Object.freeze({\n traces: [\"transaction\", \"span\"],\n // profiles: [\"profile\"],\n logs: [\"log\"],\n attachments: [\"attachment\"],\n errors: [\"event\"],\n // sessions: [\"session\"],\n // replays: [\"replay_video\"],\n // client_report\n});\n\nconst SUPPORTED_ENVELOPE_TYPES = new Set(Object.values(NAME_TO_TYPE_MAPPING).flat());\nexport const EVERYTHING_MAGIC_WORDS = new Set([\"everything\", \"all\", \"*\"]);\nexport const SUPPORTED_TAIL_ARGS = new Set([...Object.keys(NAME_TO_TYPE_MAPPING), ...EVERYTHING_MAGIC_WORDS]);\n\nconst FORMATTERS: Record<FormatterType, FormatterRegistry> = {\n md: mdFormatters,\n logfmt: logfmtFormatters,\n json: jsonFormatters,\n human: humanFormatters,\n};\n\nconst connectUpstream = async (port: number) =>\n new Promise<EventSource>((resolve, reject) => {\n const client = new EventSource(getSpotlightURL(port));\n client.onerror = reject;\n client.onopen = () => resolve(client);\n });\n\nexport default async function tail(\n { port, cmdArgs, basePath, filesToServe, format = \"logfmt\" }: CLIHandlerOptions,\n onItem?: OnItemCallback,\n): Promise<ServerType | undefined> {\n const eventTypes = cmdArgs.length > 0 ? cmdArgs.map(arg => arg.toLowerCase()) : [\"everything\"];\n for (const eventType of eventTypes) {\n if (!SUPPORTED_TAIL_ARGS.has(eventType)) {\n logger.error(`Error: Unsupported argument \"${eventType}\".`);\n logger.error(`Supported arguments are: ${[...SUPPORTED_TAIL_ARGS].join(\", \")}`);\n process.exit(1);\n }\n }\n\n const formatter = FORMATTERS[format];\n const types = eventTypes.some(type => EVERYTHING_MAGIC_WORDS.has(type))\n ? SUPPORTED_ENVELOPE_TYPES\n : new Set([...eventTypes.flatMap(type => NAME_TO_TYPE_MAPPING[type] || [])]);\n const onEnvelope: (envelope: ParsedEnvelope[\"envelope\"]) => void = envelope => {\n const [envelopeHeader, items] = envelope;\n const formatted: string[] = [];\n\n for (const item of items) {\n const [{ type }, payload] = item;\n\n if (!type || !types.has(type)) {\n // Skip if not a type we're interested in\n continue;\n }\n\n // Check if this event type is supported by the formatter\n if (!(type in formatter)) {\n continue;\n }\n\n if (onItem && !onItem(type, item, envelopeHeader)) {\n continue;\n }\n\n formatted.push(...applyFormatter(formatter, type as keyof FormatterRegistry, payload, envelopeHeader));\n }\n\n if (formatted.length > 0) {\n console.log(formatted.join(\"\\n\"));\n }\n };\n\n // try to connect to an already existing server first\n try {\n const client = await connectUpstream(port);\n client.addEventListener(SENTRY_CONTENT_TYPE, event => onEnvelope!(JSON.parse(event.data)));\n // Early return - don't start our own server if we can connect to an upstream one\n return undefined;\n } catch (err) {\n // if we fail, fine then we'll start our own\n if (err instanceof Error && !err.message?.includes(port.toString())) {\n captureException(err);\n logger.error(\"Error when trying to connect to upstream sidecar:\");\n logger.error(err);\n process.exit(1);\n }\n }\n\n const serverInstance = await setupSpotlight({ port, filesToServe, basePath, isStandalone: true });\n\n // Subscribe the onEnvelope callback to the message buffer\n // This ensures it gets called whenever any envelope is added to the buffer\n getBuffer().subscribe(container => {\n const parsedEnvelope = container.getParsedEnvelope();\n if (parsedEnvelope) {\n onEnvelope(parsedEnvelope.envelope);\n }\n });\n\n return serverInstance;\n}\n"],"names":["mdFormatters","logfmtFormatters","jsonFormatters","humanFormatters"],"mappings":"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"}
1
+ {"version":3,"file":"tail.js","sources":["../../../src/server/cli/tail.ts"],"sourcesContent":["import type { ServerType } from \"@hono/node-server\";\nimport { captureException } from \"@sentry/core\";\nimport { metrics } from \"@sentry/node\";\nimport { EventSource } from \"eventsource\";\nimport { SENTRY_CONTENT_TYPE } from \"../constants.ts\";\nimport {\n type FormatterRegistry,\n type FormatterType,\n applyFormatter,\n humanFormatters,\n jsonFormatters,\n logfmtFormatters,\n mdFormatters,\n} from \"../formatters/index.ts\";\nimport { logger } from \"../logger.ts\";\nimport { setupSpotlight } from \"../main.ts\";\nimport type { ParsedEnvelope } from \"../parser/index.ts\";\nimport type { CLIHandlerOptions } from \"../types/cli.ts\";\nimport { getSpotlightURL } from \"../utils/extras.ts\";\nimport { getBuffer } from \"../utils/index.ts\";\n\nexport type OnItemCallback = (\n type: string,\n item: ParsedEnvelope[\"envelope\"][1][number],\n envelopeHeader: ParsedEnvelope[\"envelope\"][0],\n) => boolean;\nexport const NAME_TO_TYPE_MAPPING: Record<string, string[]> = Object.freeze({\n traces: [\"transaction\", \"span\"],\n // profiles: [\"profile\"],\n logs: [\"log\"],\n attachments: [\"attachment\"],\n errors: [\"event\"],\n // sessions: [\"session\"],\n // replays: [\"replay_video\"],\n // client_report\n});\n\nconst SUPPORTED_ENVELOPE_TYPES = new Set(Object.values(NAME_TO_TYPE_MAPPING).flat());\nexport const EVERYTHING_MAGIC_WORDS = new Set([\"everything\", \"all\", \"*\"]);\nexport const SUPPORTED_TAIL_ARGS = new Set([...Object.keys(NAME_TO_TYPE_MAPPING), ...EVERYTHING_MAGIC_WORDS]);\n\nconst FORMATTERS: Record<FormatterType, FormatterRegistry> = {\n md: mdFormatters,\n logfmt: logfmtFormatters,\n json: jsonFormatters,\n human: humanFormatters,\n};\n\nconst connectUpstream = async (port: number) =>\n new Promise<EventSource>((resolve, reject) => {\n const client = new EventSource(getSpotlightURL(port));\n client.onerror = reject;\n client.onopen = () => resolve(client);\n });\n\nexport default async function tail(\n { port, cmdArgs, basePath, filesToServe, format = \"logfmt\", allowedOrigins }: CLIHandlerOptions,\n onItem?: OnItemCallback,\n): Promise<ServerType | undefined> {\n const eventTypes = cmdArgs.length > 0 ? cmdArgs.map(arg => arg.toLowerCase()) : [\"everything\"];\n for (const eventType of eventTypes) {\n if (!SUPPORTED_TAIL_ARGS.has(eventType)) {\n logger.error(`Error: Unsupported argument \"${eventType}\".`);\n logger.error(`Supported arguments are: ${[...SUPPORTED_TAIL_ARGS].join(\", \")}`);\n process.exit(1);\n }\n }\n\n // Track which event types users tail\n for (const eventType of eventTypes) {\n metrics.count(\"cli.tail.event_type\", 1, { attributes: { type: eventType } });\n }\n\n const formatter = FORMATTERS[format];\n const types = eventTypes.some(type => EVERYTHING_MAGIC_WORDS.has(type))\n ? SUPPORTED_ENVELOPE_TYPES\n : new Set([...eventTypes.flatMap(type => NAME_TO_TYPE_MAPPING[type] || [])]);\n const onEnvelope: (envelope: ParsedEnvelope[\"envelope\"]) => void = envelope => {\n const [envelopeHeader, items] = envelope;\n const formatted: string[] = [];\n\n for (const item of items) {\n const [{ type }, payload] = item;\n\n if (!type || !types.has(type)) {\n // Skip if not a type we're interested in\n continue;\n }\n\n // Check if this event type is supported by the formatter\n if (!(type in formatter)) {\n continue;\n }\n\n if (onItem && !onItem(type, item, envelopeHeader)) {\n continue;\n }\n\n formatted.push(...applyFormatter(formatter, type as keyof FormatterRegistry, payload, envelopeHeader));\n }\n\n if (formatted.length > 0) {\n console.log(formatted.join(\"\\n\"));\n }\n };\n\n // try to connect to an already existing server first\n try {\n const client = await connectUpstream(port);\n client.addEventListener(SENTRY_CONTENT_TYPE, event => onEnvelope!(JSON.parse(event.data)));\n // Early return - don't start our own server if we can connect to an upstream one\n return undefined;\n } catch (err) {\n // if we fail, fine then we'll start our own\n if (err instanceof Error && !err.message?.includes(port.toString())) {\n captureException(err);\n logger.error(\"Error when trying to connect to upstream sidecar:\");\n logger.error(err);\n process.exit(1);\n }\n }\n\n const serverInstance = await setupSpotlight({ port, filesToServe, basePath, isStandalone: true, allowedOrigins });\n\n // Subscribe the onEnvelope callback to the message buffer\n // This ensures it gets called whenever any envelope is added to the buffer\n getBuffer().subscribe(container => {\n const parsedEnvelope = container.getParsedEnvelope();\n if (parsedEnvelope) {\n onEnvelope(parsedEnvelope.envelope);\n }\n });\n\n return serverInstance;\n}\n"],"names":["mdFormatters","logfmtFormatters","jsonFormatters","humanFormatters"],"mappings":"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"}
@@ -7,6 +7,7 @@ export type CLIArgs = {
7
7
  format: FormatterType;
8
8
  cmd: string | undefined;
9
9
  cmdArgs: string[];
10
+ allowedOrigins: string[];
10
11
  };
11
12
  export declare function parseCLIArgs(): CLIArgs;
12
13
  export declare const CLI_CMD_MAP: Map<string | undefined, CLIHandler>;
@@ -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] = "f472fd05-2531-4511-be93-cb96646f13eb", e._sentryDebugIdIdentifier = "sentry-dbid-f472fd05-2531-4511-be93-cb96646f13eb");
6
+ } catch (e2) {
7
+ }
8
+ }();
1
9
  import { parseArgs } from "node:util";
10
+ import { metrics } from "@sentry/node";
2
11
  import showHelp from "./cli/help.js";
3
12
  import mcp from "./cli/mcp.js";
4
13
  import run from "./cli/run.js";
@@ -7,6 +16,7 @@ import tail from "./cli/tail.js";
7
16
  import { DEFAULT_PORT } from "./constants.js";
8
17
  import { AVAILABLE_FORMATTERS } from "./formatters/types.js";
9
18
  import { enableDebugLogging, logger } from "./logger.js";
19
+ import "../_virtual/_sentry-release-injection-file.js";
10
20
  const MAGIC_PORT_FOR_DYNAMIC_ASSIGNMENT = 0;
11
21
  const PARSE_ARGS_CONFIG = {
12
22
  options: {
@@ -25,6 +35,12 @@ const PARSE_ARGS_CONFIG = {
25
35
  short: "f",
26
36
  default: "human"
27
37
  },
38
+ "allowed-origin": {
39
+ type: "string",
40
+ short: "A",
41
+ multiple: true,
42
+ default: []
43
+ },
28
44
  // Deprecated -- use the positional `mcp` argument instead
29
45
  "stdio-mcp": {
30
46
  type: "boolean",
@@ -77,13 +93,16 @@ function parseCLIArgs() {
77
93
  console.error(`Valid formats are: ${AVAILABLE_FORMATTERS.join(", ")}`);
78
94
  process.exit(1);
79
95
  }
96
+ const allowedOriginInput = values["allowed-origin"];
97
+ const allowedOrigins = allowedOriginInput.flatMap((origin) => origin.split(",").map((o) => o.trim())).filter(Boolean);
80
98
  const result = {
81
99
  debug: values.debug,
82
100
  help: values.help,
83
101
  format,
84
102
  port,
85
103
  cmd: positionals[0],
86
- cmdArgs: cmdArgs ?? positionals.slice(1)
104
+ cmdArgs: cmdArgs ?? positionals.slice(1),
105
+ allowedOrigins
87
106
  };
88
107
  return result;
89
108
  }
@@ -99,18 +118,25 @@ async function main({
99
118
  basePath,
100
119
  filesToServe
101
120
  } = {}) {
102
- let { cmd, cmdArgs, help, port, debug, format } = parseCLIArgs();
121
+ let { cmd, cmdArgs, help, port, debug, format, allowedOrigins } = parseCLIArgs();
103
122
  if (debug || process.env.SPOTLIGHT_DEBUG) {
104
123
  enableDebugLogging(true);
105
124
  }
106
- const spotlightVersion = "4.6.0";
125
+ const spotlightVersion = "4.7.1";
107
126
  logger.info(`Spotlight by Sentry - v${spotlightVersion}`);
127
+ metrics.count("cli.invocation", 1, {
128
+ attributes: {
129
+ command: cmd || "server",
130
+ format,
131
+ debug: String(debug)
132
+ }
133
+ });
108
134
  if (help) {
109
135
  cmd = "help";
110
136
  cmdArgs = [];
111
137
  }
112
138
  const handler = CLI_CMD_MAP.get(cmd) || showHelp;
113
- return await handler({ cmd, cmdArgs, port, help, debug, format, basePath, filesToServe });
139
+ return await handler({ cmd, cmdArgs, port, help, debug, format, basePath, filesToServe, allowedOrigins });
114
140
  }
115
141
  export {
116
142
  CLI_CMD_MAP,