@spotlightjs/spotlight 4.7.2 → 4.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (610) hide show
  1. package/dist/_virtual/_commonjsHelpers.js +1 -3
  2. package/dist/_virtual/_commonjsHelpers.js.map +1 -1
  3. package/dist/_virtual/_sentry-release-injection-file.js +2 -2
  4. package/dist/_virtual/additionalItems.js +13 -0
  5. package/dist/_virtual/additionalItems.js.map +1 -0
  6. package/dist/_virtual/additionalProperties.js +13 -0
  7. package/dist/_virtual/additionalProperties.js.map +1 -0
  8. package/dist/_virtual/{cache.js → ajv.js} +4 -4
  9. package/dist/_virtual/ajv.js.map +1 -0
  10. package/dist/_virtual/{uri.all.js → allOf.js} +4 -4
  11. package/dist/_virtual/allOf.js.map +1 -0
  12. package/dist/_virtual/anyOf.js +13 -0
  13. package/dist/_virtual/anyOf.js.map +1 -0
  14. package/dist/_virtual/applicability.js +13 -0
  15. package/dist/_virtual/applicability.js.map +1 -0
  16. package/dist/_virtual/boolSchema.js +13 -0
  17. package/dist/_virtual/boolSchema.js.map +1 -0
  18. package/dist/_virtual/code.js +13 -0
  19. package/dist/_virtual/code.js.map +1 -0
  20. package/dist/_virtual/code2.js +13 -0
  21. package/dist/_virtual/code2.js.map +1 -0
  22. package/dist/_virtual/const.js +13 -0
  23. package/dist/_virtual/const.js.map +1 -0
  24. package/dist/_virtual/contains.js +13 -0
  25. package/dist/_virtual/contains.js.map +1 -0
  26. package/dist/_virtual/core.js +13 -0
  27. package/dist/_virtual/core.js.map +1 -0
  28. package/dist/_virtual/dataType.js +13 -0
  29. package/dist/_virtual/dataType.js.map +1 -0
  30. package/dist/_virtual/defaults.js +13 -0
  31. package/dist/_virtual/defaults.js.map +1 -0
  32. package/dist/_virtual/dependencies.js +13 -0
  33. package/dist/_virtual/dependencies.js.map +1 -0
  34. package/dist/_virtual/draft7.js +13 -0
  35. package/dist/_virtual/draft7.js.map +1 -0
  36. package/dist/_virtual/enum.js +13 -0
  37. package/dist/_virtual/enum.js.map +1 -0
  38. package/dist/_virtual/equal.js +13 -0
  39. package/dist/_virtual/equal.js.map +1 -0
  40. package/dist/_virtual/errors.js +13 -0
  41. package/dist/_virtual/errors.js.map +1 -0
  42. package/dist/_virtual/format.js +13 -0
  43. package/dist/_virtual/format.js.map +1 -0
  44. package/dist/_virtual/formats.js +13 -0
  45. package/dist/_virtual/formats.js.map +1 -0
  46. package/dist/_virtual/id.js +13 -0
  47. package/dist/_virtual/id.js.map +1 -0
  48. package/dist/_virtual/if.js +13 -0
  49. package/dist/_virtual/if.js.map +1 -0
  50. package/dist/_virtual/index.js +3 -3
  51. package/dist/_virtual/index10.js +13 -0
  52. package/dist/_virtual/index10.js.map +1 -0
  53. package/dist/_virtual/index11.js +13 -0
  54. package/dist/_virtual/index11.js.map +1 -0
  55. package/dist/_virtual/index2.js +13 -0
  56. package/dist/_virtual/index2.js.map +1 -0
  57. package/dist/_virtual/index3.js +13 -0
  58. package/dist/_virtual/index3.js.map +1 -0
  59. package/dist/_virtual/index4.js +13 -0
  60. package/dist/_virtual/index4.js.map +1 -0
  61. package/dist/_virtual/index5.js +13 -0
  62. package/dist/_virtual/index5.js.map +1 -0
  63. package/dist/_virtual/index6.js +13 -0
  64. package/dist/_virtual/index6.js.map +1 -0
  65. package/dist/_virtual/index7.js +13 -0
  66. package/dist/_virtual/index7.js.map +1 -0
  67. package/dist/_virtual/index8.js +13 -0
  68. package/dist/_virtual/index8.js.map +1 -0
  69. package/dist/_virtual/index9.js +13 -0
  70. package/dist/_virtual/index9.js.map +1 -0
  71. package/dist/_virtual/items.js +13 -0
  72. package/dist/_virtual/items.js.map +1 -0
  73. package/dist/_virtual/items2020.js +13 -0
  74. package/dist/_virtual/items2020.js.map +1 -0
  75. package/dist/_virtual/keyword.js +13 -0
  76. package/dist/_virtual/keyword.js.map +1 -0
  77. package/dist/_virtual/limit.js +13 -0
  78. package/dist/_virtual/limit.js.map +1 -0
  79. package/dist/_virtual/limitItems.js +13 -0
  80. package/dist/_virtual/limitItems.js.map +1 -0
  81. package/dist/_virtual/limitLength.js +13 -0
  82. package/dist/_virtual/limitLength.js.map +1 -0
  83. package/dist/_virtual/limitNumber.js +13 -0
  84. package/dist/_virtual/limitNumber.js.map +1 -0
  85. package/dist/_virtual/limitProperties.js +13 -0
  86. package/dist/_virtual/limitProperties.js.map +1 -0
  87. package/dist/_virtual/metadata.js +13 -0
  88. package/dist/_virtual/metadata.js.map +1 -0
  89. package/dist/_virtual/multipleOf.js +13 -0
  90. package/dist/_virtual/multipleOf.js.map +1 -0
  91. package/dist/_virtual/names.js +13 -0
  92. package/dist/_virtual/names.js.map +1 -0
  93. package/dist/_virtual/not.js +13 -0
  94. package/dist/_virtual/not.js.map +1 -0
  95. package/dist/_virtual/oneOf.js +13 -0
  96. package/dist/_virtual/oneOf.js.map +1 -0
  97. package/dist/_virtual/pattern.js +13 -0
  98. package/dist/_virtual/pattern.js.map +1 -0
  99. package/dist/_virtual/patternProperties.js +13 -0
  100. package/dist/_virtual/patternProperties.js.map +1 -0
  101. package/dist/_virtual/prefixItems.js +13 -0
  102. package/dist/_virtual/prefixItems.js.map +1 -0
  103. package/dist/_virtual/properties.js +13 -0
  104. package/dist/_virtual/properties.js.map +1 -0
  105. package/dist/_virtual/propertyNames.js +13 -0
  106. package/dist/_virtual/propertyNames.js.map +1 -0
  107. package/dist/_virtual/ref.js +13 -0
  108. package/dist/_virtual/ref.js.map +1 -0
  109. package/dist/_virtual/ref_error.js +13 -0
  110. package/dist/_virtual/ref_error.js.map +1 -0
  111. package/dist/_virtual/required.js +13 -0
  112. package/dist/_virtual/required.js.map +1 -0
  113. package/dist/_virtual/resolve.js +13 -0
  114. package/dist/_virtual/resolve.js.map +1 -0
  115. package/dist/_virtual/rules.js +13 -0
  116. package/dist/_virtual/rules.js.map +1 -0
  117. package/dist/_virtual/scope.js +13 -0
  118. package/dist/_virtual/scope.js.map +1 -0
  119. package/dist/_virtual/subschema.js +13 -0
  120. package/dist/_virtual/subschema.js.map +1 -0
  121. package/dist/_virtual/thenElse.js +13 -0
  122. package/dist/_virtual/thenElse.js.map +1 -0
  123. package/dist/_virtual/types.js +13 -0
  124. package/dist/_virtual/types.js.map +1 -0
  125. package/dist/_virtual/ucs2length.js +13 -0
  126. package/dist/_virtual/ucs2length.js.map +1 -0
  127. package/dist/_virtual/uniqueItems.js +13 -0
  128. package/dist/_virtual/uniqueItems.js.map +1 -0
  129. package/dist/_virtual/uri.js +13 -0
  130. package/dist/_virtual/uri.js.map +1 -0
  131. package/dist/_virtual/util.js +13 -0
  132. package/dist/_virtual/util.js.map +1 -0
  133. package/dist/_virtual/validation_error.js +13 -0
  134. package/dist/_virtual/validation_error.js.map +1 -0
  135. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.24.3_zod@4.1.13/node_modules/@modelcontextprotocol/sdk/dist/esm/client/index.js +454 -0
  136. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.24.3_zod@4.1.13/node_modules/@modelcontextprotocol/sdk/dist/esm/client/index.js.map +1 -0
  137. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.24.3_zod@4.1.13/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/client.js +166 -0
  138. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.24.3_zod@4.1.13/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/client.js.map +1 -0
  139. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.24.3_zod@4.1.13/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/helpers.js +44 -0
  140. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.24.3_zod@4.1.13/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/helpers.js.map +1 -0
  141. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.24.3_zod@4.1.13/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/interfaces.js +15 -0
  142. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.24.3_zod@4.1.13/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/interfaces.js.map +1 -0
  143. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.24.3_zod@4.1.13/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/mcp-server.js +25 -0
  144. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.24.3_zod@4.1.13/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/mcp-server.js.map +1 -0
  145. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.24.3_zod@4.1.13/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/server.js +82 -0
  146. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.24.3_zod@4.1.13/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/server.js.map +1 -0
  147. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.24.3_zod@4.1.13/node_modules/@modelcontextprotocol/sdk/dist/esm/server/completable.js +27 -0
  148. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.24.3_zod@4.1.13/node_modules/@modelcontextprotocol/sdk/dist/esm/server/completable.js.map +1 -0
  149. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.24.3_zod@4.1.13/node_modules/@modelcontextprotocol/sdk/dist/esm/server/index.js +400 -0
  150. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.24.3_zod@4.1.13/node_modules/@modelcontextprotocol/sdk/dist/esm/server/index.js.map +1 -0
  151. package/dist/node_modules/.pnpm/{@modelcontextprotocol_sdk@1.16.0 → @modelcontextprotocol_sdk@1.24.3_zod@4.1.13}/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js +284 -97
  152. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.24.3_zod@4.1.13/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js.map +1 -0
  153. package/dist/node_modules/.pnpm/{@modelcontextprotocol_sdk@1.16.0 → @modelcontextprotocol_sdk@1.24.3_zod@4.1.13}/node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js +1 -1
  154. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.24.3_zod@4.1.13/node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js.map +1 -0
  155. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.24.3_zod@4.1.13/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-compat.js +176 -0
  156. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.24.3_zod@4.1.13/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-compat.js.map +1 -0
  157. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.24.3_zod@4.1.13/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-json-schema-compat.js +59 -0
  158. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.24.3_zod@4.1.13/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-json-schema-compat.js.map +1 -0
  159. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.24.3_zod@4.1.13/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/protocol.js +968 -0
  160. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.24.3_zod@4.1.13/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/protocol.js.map +1 -0
  161. package/dist/node_modules/.pnpm/{@modelcontextprotocol_sdk@1.16.0 → @modelcontextprotocol_sdk@1.24.3_zod@4.1.13}/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/stdio.js +1 -1
  162. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.24.3_zod@4.1.13/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/stdio.js.map +1 -0
  163. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.24.3_zod@4.1.13/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/toolNameValidation.js +70 -0
  164. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.24.3_zod@4.1.13/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/toolNameValidation.js.map +1 -0
  165. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.24.3_zod@4.1.13/node_modules/@modelcontextprotocol/sdk/dist/esm/types.js +1623 -0
  166. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.24.3_zod@4.1.13/node_modules/@modelcontextprotocol/sdk/dist/esm/types.js.map +1 -0
  167. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.24.3_zod@4.1.13/node_modules/@modelcontextprotocol/sdk/dist/esm/validation/ajv-provider.js +79 -0
  168. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.24.3_zod@4.1.13/node_modules/@modelcontextprotocol/sdk/dist/esm/validation/ajv-provider.js.map +1 -0
  169. package/dist/node_modules/.pnpm/ajv-formats@3.0.1_ajv@8.17.1/node_modules/ajv-formats/dist/formats.js +209 -0
  170. package/dist/node_modules/.pnpm/ajv-formats@3.0.1_ajv@8.17.1/node_modules/ajv-formats/dist/formats.js.map +1 -0
  171. package/dist/node_modules/.pnpm/ajv-formats@3.0.1_ajv@8.17.1/node_modules/ajv-formats/dist/index.js +59 -0
  172. package/dist/node_modules/.pnpm/ajv-formats@3.0.1_ajv@8.17.1/node_modules/ajv-formats/dist/index.js.map +1 -0
  173. package/dist/node_modules/.pnpm/ajv-formats@3.0.1_ajv@8.17.1/node_modules/ajv-formats/dist/limit.js +81 -0
  174. package/dist/node_modules/.pnpm/ajv-formats@3.0.1_ajv@8.17.1/node_modules/ajv-formats/dist/limit.js.map +1 -0
  175. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/ajv.js +95 -0
  176. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/ajv.js.map +1 -0
  177. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/codegen/code.js +160 -0
  178. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/codegen/code.js.map +1 -0
  179. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/codegen/index.js +730 -0
  180. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/codegen/index.js.map +1 -0
  181. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/codegen/scope.js +153 -0
  182. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/codegen/scope.js.map +1 -0
  183. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/errors.js +134 -0
  184. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/errors.js.map +1 -0
  185. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/index.js +243 -0
  186. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/index.js.map +1 -0
  187. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/names.js +45 -0
  188. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/names.js.map +1 -0
  189. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/ref_error.js +23 -0
  190. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/ref_error.js.map +1 -0
  191. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/resolve.js +167 -0
  192. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/resolve.js.map +1 -0
  193. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/rules.js +38 -0
  194. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/rules.js.map +1 -0
  195. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/util.js +178 -0
  196. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/util.js.map +1 -0
  197. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/validate/applicability.js +30 -0
  198. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/validate/applicability.js.map +1 -0
  199. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/validate/boolSchema.js +64 -0
  200. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/validate/boolSchema.js.map +1 -0
  201. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/validate/dataType.js +201 -0
  202. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/validate/dataType.js.map +1 -0
  203. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/validate/defaults.js +48 -0
  204. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/validate/defaults.js.map +1 -0
  205. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/validate/index.js +536 -0
  206. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/validate/index.js.map +1 -0
  207. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/validate/keyword.js +133 -0
  208. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/validate/keyword.js.map +1 -0
  209. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/validate/subschema.js +94 -0
  210. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/validate/subschema.js.map +1 -0
  211. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/core.js +638 -0
  212. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/core.js.map +1 -0
  213. package/dist/node_modules/.pnpm/{ajv@6.12.6/node_modules/ajv/lib → ajv@8.17.1/node_modules/ajv/dist}/refs/data.json.js +4 -7
  214. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/refs/data.json.js.map +1 -0
  215. package/dist/node_modules/.pnpm/{ajv@6.12.6/node_modules/ajv/lib → ajv@8.17.1/node_modules/ajv/dist}/refs/json-schema-draft-07.json.js +3 -3
  216. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/runtime/equal.js +16 -0
  217. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/runtime/equal.js.map +1 -0
  218. package/dist/node_modules/.pnpm/{ajv@6.12.6/node_modules/ajv/lib/compile → ajv@8.17.1/node_modules/ajv/dist/runtime}/ucs2length.js +13 -8
  219. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/runtime/ucs2length.js.map +1 -0
  220. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/runtime/uri.js +16 -0
  221. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/runtime/uri.js.map +1 -0
  222. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/runtime/validation_error.js +20 -0
  223. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/runtime/validation_error.js.map +1 -0
  224. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js +61 -0
  225. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js.map +1 -0
  226. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js +118 -0
  227. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js.map +1 -0
  228. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/allOf.js +33 -0
  229. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/allOf.js.map +1 -0
  230. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/anyOf.js +23 -0
  231. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/anyOf.js.map +1 -0
  232. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/contains.js +102 -0
  233. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/contains.js.map +1 -0
  234. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/dependencies.js +106 -0
  235. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/dependencies.js.map +1 -0
  236. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/if.js +77 -0
  237. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/if.js.map +1 -0
  238. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/index.js +84 -0
  239. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/index.js.map +1 -0
  240. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/items.js +67 -0
  241. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/items.js.map +1 -0
  242. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/items2020.js +47 -0
  243. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/items2020.js.map +1 -0
  244. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/not.js +37 -0
  245. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/not.js.map +1 -0
  246. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/oneOf.js +66 -0
  247. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/oneOf.js.map +1 -0
  248. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js +84 -0
  249. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js.map +1 -0
  250. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js +23 -0
  251. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js.map +1 -0
  252. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/properties.js +70 -0
  253. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/properties.js.map +1 -0
  254. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js +51 -0
  255. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js.map +1 -0
  256. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/thenElse.js +24 -0
  257. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/thenElse.js.map +1 -0
  258. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/code.js +146 -0
  259. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/code.js.map +1 -0
  260. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/core/id.js +19 -0
  261. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/core/id.js.map +1 -0
  262. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/core/index.js +29 -0
  263. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/core/index.js.map +1 -0
  264. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/core/ref.js +138 -0
  265. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/core/ref.js.map +1 -0
  266. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/discriminator/index.js +119 -0
  267. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/discriminator/index.js.map +1 -0
  268. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/discriminator/types.js +21 -0
  269. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/discriminator/types.js.map +1 -0
  270. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/draft7.js +36 -0
  271. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/draft7.js.map +1 -0
  272. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/format/format.js +96 -0
  273. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/format/format.js.map +1 -0
  274. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/format/index.js +17 -0
  275. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/format/index.js.map +1 -0
  276. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/metadata.js +30 -0
  277. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/metadata.js.map +1 -0
  278. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/const.js +39 -0
  279. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/const.js.map +1 -0
  280. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/enum.js +59 -0
  281. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/enum.js.map +1 -0
  282. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/index.js +62 -0
  283. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/index.js.map +1 -0
  284. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/limitItems.js +35 -0
  285. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/limitItems.js.map +1 -0
  286. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/limitLength.js +42 -0
  287. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/limitLength.js.map +1 -0
  288. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/limitNumber.js +38 -0
  289. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/limitNumber.js.map +1 -0
  290. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/limitProperties.js +35 -0
  291. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/limitProperties.js.map +1 -0
  292. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/multipleOf.js +34 -0
  293. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/multipleOf.js.map +1 -0
  294. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/pattern.js +36 -0
  295. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/pattern.js.map +1 -0
  296. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/required.js +92 -0
  297. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/required.js.map +1 -0
  298. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js +79 -0
  299. package/dist/node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js.map +1 -0
  300. package/dist/node_modules/.pnpm/fast-uri@3.0.2/node_modules/fast-uri/index.js +267 -0
  301. package/dist/node_modules/.pnpm/fast-uri@3.0.2/node_modules/fast-uri/index.js.map +1 -0
  302. package/dist/node_modules/.pnpm/fast-uri@3.0.2/node_modules/fast-uri/lib/schemes.js +152 -0
  303. package/dist/node_modules/.pnpm/fast-uri@3.0.2/node_modules/fast-uri/lib/schemes.js.map +1 -0
  304. package/dist/node_modules/.pnpm/fast-uri@3.0.2/node_modules/fast-uri/lib/scopedChars.js +40 -0
  305. package/dist/node_modules/.pnpm/fast-uri@3.0.2/node_modules/fast-uri/lib/scopedChars.js.map +1 -0
  306. package/dist/node_modules/.pnpm/fast-uri@3.0.2/node_modules/fast-uri/lib/utils.js +236 -0
  307. package/dist/node_modules/.pnpm/fast-uri@3.0.2/node_modules/fast-uri/lib/utils.js.map +1 -0
  308. package/dist/node_modules/.pnpm/{json-schema-traverse@0.4.1 → json-schema-traverse@1.0.0}/node_modules/json-schema-traverse/index.js +7 -3
  309. package/dist/node_modules/.pnpm/json-schema-traverse@1.0.0/node_modules/json-schema-traverse/index.js.map +1 -0
  310. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/Options.js.map +1 -0
  311. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/Refs.js.map +1 -0
  312. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/errorMessages.js.map +1 -0
  313. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/getRelativePath.js.map +1 -0
  314. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/parseDef.js.map +1 -0
  315. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/parsers/any.js.map +1 -0
  316. package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/parsers/array.js +2 -2
  317. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/parsers/array.js.map +1 -0
  318. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/parsers/bigint.js.map +1 -0
  319. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/parsers/boolean.js.map +1 -0
  320. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/parsers/branded.js.map +1 -0
  321. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/parsers/catch.js.map +1 -0
  322. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/parsers/date.js.map +1 -0
  323. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/parsers/default.js.map +1 -0
  324. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/parsers/effects.js.map +1 -0
  325. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/parsers/enum.js.map +1 -0
  326. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/parsers/intersection.js.map +1 -0
  327. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/parsers/literal.js.map +1 -0
  328. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/parsers/map.js.map +1 -0
  329. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/parsers/nativeEnum.js.map +1 -0
  330. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/parsers/never.js.map +1 -0
  331. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/parsers/null.js.map +1 -0
  332. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/parsers/nullable.js.map +1 -0
  333. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/parsers/number.js.map +1 -0
  334. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/parsers/object.js.map +1 -0
  335. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/parsers/optional.js.map +1 -0
  336. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/parsers/pipeline.js.map +1 -0
  337. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/parsers/promise.js.map +1 -0
  338. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/parsers/readonly.js.map +1 -0
  339. package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/parsers/record.js +2 -2
  340. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/parsers/record.js.map +1 -0
  341. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/parsers/set.js.map +1 -0
  342. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/parsers/string.js.map +1 -0
  343. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/parsers/tuple.js.map +1 -0
  344. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/parsers/undefined.js.map +1 -0
  345. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/parsers/union.js.map +1 -0
  346. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/parsers/unknown.js.map +1 -0
  347. package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/selectParser.js +2 -2
  348. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/selectParser.js.map +1 -0
  349. package/dist/node_modules/.pnpm/zod-to-json-schema@3.25.0_zod@4.1.13/node_modules/zod-to-json-schema/dist/esm/zodToJsonSchema.js.map +1 -0
  350. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v3/ZodError.js +126 -0
  351. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v3/ZodError.js.map +1 -0
  352. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v3/errors.js +18 -0
  353. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v3/errors.js.map +1 -0
  354. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v3/helpers/errorUtil.js +17 -0
  355. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v3/helpers/errorUtil.js.map +1 -0
  356. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v3/helpers/parseUtil.js +130 -0
  357. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v3/helpers/parseUtil.js.map +1 -0
  358. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v3/helpers/util.js +147 -0
  359. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v3/helpers/util.js.map +1 -0
  360. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v3/locales/en.js +114 -0
  361. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v3/locales/en.js.map +1 -0
  362. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v3/types.js +3169 -0
  363. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v3/types.js.map +1 -0
  364. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v4/classic/errors.js +53 -0
  365. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v4/classic/errors.js.map +1 -0
  366. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v4/classic/iso.js +52 -0
  367. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v4/classic/iso.js.map +1 -0
  368. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v4/classic/parse.js +38 -0
  369. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v4/classic/parse.js.map +1 -0
  370. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v4/classic/schemas.js +686 -0
  371. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v4/classic/schemas.js.map +1 -0
  372. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v4/core/api.js +542 -0
  373. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v4/core/api.js.map +1 -0
  374. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v4/core/checks.js +414 -0
  375. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v4/core/checks.js.map +1 -0
  376. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v4/core/core.js +82 -0
  377. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v4/core/core.js.map +1 -0
  378. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v4/core/doc.js +46 -0
  379. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v4/core/doc.js.map +1 -0
  380. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v4/core/errors.js +81 -0
  381. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v4/core/errors.js.map +1 -0
  382. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v4/core/parse.js +108 -0
  383. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v4/core/parse.js.map +1 -0
  384. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v4/core/regexes.js +94 -0
  385. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v4/core/regexes.js.map +1 -0
  386. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v4/core/registries.js +63 -0
  387. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v4/core/registries.js.map +1 -0
  388. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v4/core/schemas.js +1391 -0
  389. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v4/core/schemas.js.map +1 -0
  390. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v4/core/to-json-schema.js +782 -0
  391. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v4/core/to-json-schema.js.map +1 -0
  392. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v4/core/util.js +419 -0
  393. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v4/core/util.js.map +1 -0
  394. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v4/core/versions.js +17 -0
  395. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v4/core/versions.js.map +1 -0
  396. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v4/mini/schemas.js +61 -0
  397. package/dist/node_modules/.pnpm/zod@4.1.13/node_modules/zod/v4/mini/schemas.js.map +1 -0
  398. package/dist/run.js +3 -3
  399. package/dist/run.js.map +1 -1
  400. package/dist/sentry-config.js +2 -2
  401. package/dist/server/cli/help.js +3 -1
  402. package/dist/server/cli/help.js.map +1 -1
  403. package/dist/server/cli/mcp.js +3 -3
  404. package/dist/server/cli/run.d.ts +1 -1
  405. package/dist/server/cli/run.js +25 -16
  406. package/dist/server/cli/run.js.map +1 -1
  407. package/dist/server/cli/server.d.ts +1 -1
  408. package/dist/server/cli/server.js +9 -3
  409. package/dist/server/cli/server.js.map +1 -1
  410. package/dist/server/cli.d.ts +1 -0
  411. package/dist/server/cli.js +10 -4
  412. package/dist/server/cli.js.map +1 -1
  413. package/dist/server/formatters/md/errors.d.ts +1 -1
  414. package/dist/server/formatters/md/errors.js.map +1 -1
  415. package/dist/server/formatters/md/event.d.ts +1 -1
  416. package/dist/server/formatters/md/event.js.map +1 -1
  417. package/dist/server/formatters/schema.d.ts +39 -39
  418. package/dist/server/mcp/mcp.d.ts +1 -1
  419. package/dist/server/mcp/mcp.js +14 -13
  420. package/dist/server/mcp/mcp.js.map +1 -1
  421. package/dist/server/routes/clear.js +2 -1
  422. package/dist/server/routes/clear.js.map +1 -1
  423. package/dist/server/routes/stream/index.js +3 -2
  424. package/dist/server/routes/stream/index.js.map +1 -1
  425. package/dist/server/types/cli.d.ts +1 -0
  426. package/dist/server/utils/docker-compose.d.ts +24 -0
  427. package/dist/server/utils/docker-compose.js +142 -37
  428. package/dist/server/utils/docker-compose.js.map +1 -1
  429. package/dist/server/utils/extras.d.ts +2 -0
  430. package/dist/server/utils/extras.js +29 -2
  431. package/dist/server/utils/extras.js.map +1 -1
  432. package/dist/ui/assets/index.js +38 -38
  433. package/dist/ui/assets/index.js.map +1 -1
  434. package/dist/ui/assets/instrumentation.js +2 -2
  435. package/dist/ui/assets/main.js +1 -1
  436. package/dist/ui/assets/serverTimingMeta.js +11 -11
  437. package/dist/ui/assets/serverTimingMeta.js.map +1 -1
  438. package/package.json +7 -8
  439. package/dist/_virtual/cache.js.map +0 -1
  440. package/dist/_virtual/uri.all.js.map +0 -1
  441. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.16.0/node_modules/@modelcontextprotocol/sdk/dist/esm/client/index.js +0 -241
  442. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.16.0/node_modules/@modelcontextprotocol/sdk/dist/esm/client/index.js.map +0 -1
  443. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.16.0/node_modules/@modelcontextprotocol/sdk/dist/esm/server/completable.js +0 -64
  444. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.16.0/node_modules/@modelcontextprotocol/sdk/dist/esm/server/completable.js.map +0 -1
  445. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.16.0/node_modules/@modelcontextprotocol/sdk/dist/esm/server/index.js +0 -196
  446. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.16.0/node_modules/@modelcontextprotocol/sdk/dist/esm/server/index.js.map +0 -1
  447. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.16.0/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js.map +0 -1
  448. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.16.0/node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js.map +0 -1
  449. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.16.0/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/protocol.js +0 -391
  450. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.16.0/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/protocol.js.map +0 -1
  451. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.16.0/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/stdio.js.map +0 -1
  452. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.16.0/node_modules/@modelcontextprotocol/sdk/dist/esm/types.js +0 -1045
  453. package/dist/node_modules/.pnpm/@modelcontextprotocol_sdk@1.16.0/node_modules/@modelcontextprotocol/sdk/dist/esm/types.js.map +0 -1
  454. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/ajv.js +0 -365
  455. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/ajv.js.map +0 -1
  456. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/cache.js +0 -30
  457. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/cache.js.map +0 -1
  458. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/async.js +0 -74
  459. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/async.js.map +0 -1
  460. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/error_classes.js +0 -37
  461. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/error_classes.js.map +0 -1
  462. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/formats.js +0 -119
  463. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/formats.js.map +0 -1
  464. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/index.js +0 -288
  465. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/index.js.map +0 -1
  466. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/resolve.js +0 -228
  467. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/resolve.js.map +0 -1
  468. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/rules.js +0 -101
  469. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/rules.js.map +0 -1
  470. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/schema_obj.js +0 -19
  471. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/schema_obj.js.map +0 -1
  472. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/ucs2length.js.map +0 -1
  473. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/util.js +0 -192
  474. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/compile/util.js.map +0 -1
  475. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/data.js +0 -57
  476. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/data.js.map +0 -1
  477. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/definition_schema.js +0 -48
  478. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/definition_schema.js.map +0 -1
  479. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/_limit.js +0 -160
  480. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/_limit.js.map +0 -1
  481. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/_limitItems.js +0 -90
  482. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/_limitItems.js.map +0 -1
  483. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/_limitLength.js +0 -95
  484. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/_limitLength.js.map +0 -1
  485. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/_limitProperties.js +0 -90
  486. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/_limitProperties.js.map +0 -1
  487. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/allOf.js +0 -52
  488. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/allOf.js.map +0 -1
  489. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/anyOf.js +0 -83
  490. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/anyOf.js.map +0 -1
  491. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/comment.js +0 -26
  492. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/comment.js.map +0 -1
  493. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/const.js +0 -63
  494. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/const.js.map +0 -1
  495. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/contains.js +0 -88
  496. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/contains.js.map +0 -1
  497. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/custom.js +0 -230
  498. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/custom.js.map +0 -1
  499. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/dependencies.js +0 -171
  500. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/dependencies.js.map +0 -1
  501. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/enum.js +0 -72
  502. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/enum.js.map +0 -1
  503. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/format.js +0 -157
  504. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/format.js.map +0 -1
  505. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/if.js +0 -110
  506. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/if.js.map +0 -1
  507. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/index.js +0 -67
  508. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/index.js.map +0 -1
  509. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/items.js +0 -147
  510. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/items.js.map +0 -1
  511. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/multipleOf.js +0 -90
  512. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/multipleOf.js.map +0 -1
  513. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/not.js +0 -95
  514. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/not.js.map +0 -1
  515. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/oneOf.js +0 -81
  516. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/oneOf.js.map +0 -1
  517. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/pattern.js +0 -85
  518. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/pattern.js.map +0 -1
  519. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/properties.js +0 -322
  520. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/properties.js.map +0 -1
  521. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/propertyNames.js +0 -84
  522. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/propertyNames.js.map +0 -1
  523. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/ref.js +0 -134
  524. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/ref.js.map +0 -1
  525. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/required.js +0 -263
  526. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/required.js.map +0 -1
  527. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/uniqueItems.js +0 -95
  528. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/uniqueItems.js.map +0 -1
  529. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/validate.js +0 -464
  530. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/dotjs/validate.js.map +0 -1
  531. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/keyword.js +0 -108
  532. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/keyword.js.map +0 -1
  533. package/dist/node_modules/.pnpm/ajv@6.12.6/node_modules/ajv/lib/refs/data.json.js.map +0 -1
  534. package/dist/node_modules/.pnpm/fast-json-stable-stringify@2.1.0/node_modules/fast-json-stable-stringify/index.js +0 -62
  535. package/dist/node_modules/.pnpm/fast-json-stable-stringify@2.1.0/node_modules/fast-json-stable-stringify/index.js.map +0 -1
  536. package/dist/node_modules/.pnpm/json-schema-traverse@0.4.1/node_modules/json-schema-traverse/index.js.map +0 -1
  537. package/dist/node_modules/.pnpm/uri-js@4.4.1/node_modules/uri-js/dist/es5/uri.all.js +0 -1035
  538. package/dist/node_modules/.pnpm/uri-js@4.4.1/node_modules/uri-js/dist/es5/uri.all.js.map +0 -1
  539. 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 +0 -1
  540. 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 +0 -1
  541. 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 +0 -1
  542. 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 +0 -1
  543. 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 +0 -1
  544. 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 +0 -1
  545. 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 +0 -1
  546. 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 +0 -1
  547. 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 +0 -1
  548. 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 +0 -1
  549. 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 +0 -1
  550. 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 +0 -1
  551. 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 +0 -1
  552. 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 +0 -1
  553. 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 +0 -1
  554. 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 +0 -1
  555. 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 +0 -1
  556. 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 +0 -1
  557. 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 +0 -1
  558. 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 +0 -1
  559. 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 +0 -1
  560. 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 +0 -1
  561. 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 +0 -1
  562. 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 +0 -1
  563. 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 +0 -1
  564. 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 +0 -1
  565. 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 +0 -1
  566. 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 +0 -1
  567. 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 +0 -1
  568. 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 +0 -1
  569. 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 +0 -1
  570. 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 +0 -1
  571. 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 +0 -1
  572. 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 +0 -1
  573. 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 +0 -1
  574. 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 +0 -1
  575. 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 +0 -1
  576. /package/dist/node_modules/.pnpm/{ajv@6.12.6/node_modules/ajv/lib → ajv@8.17.1/node_modules/ajv/dist}/refs/json-schema-draft-07.json.js.map +0 -0
  577. /package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/Options.js +0 -0
  578. /package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/Refs.js +0 -0
  579. /package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/errorMessages.js +0 -0
  580. /package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/getRelativePath.js +0 -0
  581. /package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/parseDef.js +0 -0
  582. /package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/parsers/any.js +0 -0
  583. /package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/parsers/bigint.js +0 -0
  584. /package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/parsers/boolean.js +0 -0
  585. /package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/parsers/branded.js +0 -0
  586. /package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/parsers/catch.js +0 -0
  587. /package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/parsers/date.js +0 -0
  588. /package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/parsers/default.js +0 -0
  589. /package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/parsers/effects.js +0 -0
  590. /package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/parsers/enum.js +0 -0
  591. /package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/parsers/intersection.js +0 -0
  592. /package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/parsers/literal.js +0 -0
  593. /package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/parsers/map.js +0 -0
  594. /package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/parsers/nativeEnum.js +0 -0
  595. /package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/parsers/never.js +0 -0
  596. /package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/parsers/null.js +0 -0
  597. /package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/parsers/nullable.js +0 -0
  598. /package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/parsers/number.js +0 -0
  599. /package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/parsers/object.js +0 -0
  600. /package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/parsers/optional.js +0 -0
  601. /package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/parsers/pipeline.js +0 -0
  602. /package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/parsers/promise.js +0 -0
  603. /package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/parsers/readonly.js +0 -0
  604. /package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/parsers/set.js +0 -0
  605. /package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/parsers/string.js +0 -0
  606. /package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/parsers/tuple.js +0 -0
  607. /package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/parsers/undefined.js +0 -0
  608. /package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/parsers/union.js +0 -0
  609. /package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/parsers/unknown.js +0 -0
  610. /package/dist/node_modules/.pnpm/{zod-to-json-schema@3.24.6_zod@3.25.76 → zod-to-json-schema@3.25.0_zod@4.1.13}/node_modules/zod-to-json-schema/dist/esm/zodToJsonSchema.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.js","sources":["../../../src/server/mcp/mcp.ts"],"sourcesContent":["import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { TextContent } from \"@modelcontextprotocol/sdk/types.js\";\nimport { captureException, wrapMcpServerWithSentry } from \"@sentry/node\";\nimport { z } from \"zod\";\nimport { formatErrorEnvelope } from \"../formatters/md/errors.ts\";\nimport { formatLogEnvelope } from \"../formatters/md/logs.ts\";\nimport {\n buildSpanTree,\n extractTracesFromEnvelopes,\n formatTraceSummary,\n renderSpanTree,\n} from \"../formatters/md/traces.ts\";\nimport { getBuffer } from \"../utils/index.ts\";\nimport { NO_ERRORS_CONTENT, NO_LOGS_CONTENT } from \"./constants.ts\";\n\nconst inputSchema = {\n filters: z.union([\n z.object({\n timeWindow: z\n .number()\n .describe(\n \"Number of seconds to look back from now. Examples: 60 = last minute, 300 = last 5 minutes, 3600 = last hour. Default: 60\",\n ),\n }),\n z.object({\n filename: z\n .string()\n .describe(\n \"Exact filename to search in stack traces or logs. Examples: 'Button.tsx', 'auth.js', 'api/routes.ts'. Case-sensitive.\",\n ),\n }),\n /**\n * TODO: Need to check, if this approach is better then a cursor based approach,\n * where the user can pass `events since [event_id]` as \"last N events\" is a\n * moving target as events keep coming in.\n *\n * https://github.com/getsentry/spotlight/pull/968#discussion_r2391587907\n */\n z\n .object({\n limit: z.number().describe(\"Maximum number of results to return. Examples: 10, 20, 50. Default: no limit\"),\n offset: z\n .number()\n .default(0)\n .describe(\n \"Number of results to skip from the beginning. Examples: 0 = start from first, 10 = skip first 10. Default: 0\",\n ),\n })\n .optional()\n .describe(\"Pagination: Use when timeWindow doesn't work or for browsing through many results\"),\n ]),\n};\n\nexport type InputSchema = { [K in keyof typeof inputSchema]: z.infer<(typeof inputSchema)[K]> };\n\nfunction applyPagination<T>(envelopes: T[], pagination: InputSchema[\"filters\"]) {\n if (pagination == null || !(\"limit\" in pagination)) {\n return envelopes;\n }\n\n return envelopes.slice(pagination.offset, pagination.offset + pagination.limit);\n}\n\nexport function createMCPInstance() {\n const mcp = wrapMcpServerWithSentry(\n new McpServer({\n name: \"spotlight-mcp\",\n version: String(process.env.npm_package_version),\n }),\n );\n\n mcp.registerTool(\n \"search_errors\",\n {\n title: \"Search Application Errors\",\n description: `**Purpose:** Search for runtime errors, exceptions, and crashes captured by Spotlight across your entire application stack.\n\n**CRITICAL: Call this tool IMMEDIATELY when:**\n- User says \"error\", \"broken\", \"not working\", \"failing\", \"crash\", \"bug\", \"issue\"\n- You encounter errors during testing or code execution\n- Before and after making code changes to verify no regressions\n- Investigating any unexpected behavior or performance problems\n- Error messages and exception details\n- Request/response context for API failures\n- Browser/device info when available\n\n**Returns:**\n• Full stack traces with exact file:line locations\n\n**When to use:**\n- User reports \"error\", \"broken\", \"not working\", \"crash\", \"bug\"\n- After code changes to verify no regressions\n- Investigating unexpected behavior or failures\n- Debugging specific file errors\n\n**Example calls:**\n\\`\\`\\`json\n// Example 1: Check last minute for any errors\nsearch_errors({ filters: { timeWindow: 60 } })\n\n// Example 2: Find errors in specific file\nsearch_errors({ filters: { filename: \"auth.tsx\" } })\n\n// Example 3: Get last 10 errors with pagination\nsearch_errors({ filters: { limit: 10, offset: 0 } })\n\\`\\`\\`\n\n**Parameter hints:**\n• filters.timeWindow: Seconds to look back (60 = 1 min, 300 = 5 min, 3600 = 1 hour)\n• filters.filename: Exact filename in stack trace (e.g., \"Button.tsx\", \"api.js\")\n• filters.limit/offset: For pagination through many errors`,\n inputSchema,\n },\n async args => {\n const envelopes = getBuffer().read(args.filters);\n\n if (envelopes.length === 0) {\n return NO_ERRORS_CONTENT;\n }\n\n const content: TextContent[] = [];\n for (const envelope of envelopes) {\n try {\n const events = await formatErrorEnvelope(envelope);\n\n if (events?.length) {\n for (const event of events) {\n content.push({\n type: \"text\",\n text: event,\n });\n }\n }\n } catch (err) {\n captureException(err, { extra: { context: \"Error formatting error envelope in MCP\" } });\n }\n }\n\n if (content.length === 0) {\n return NO_ERRORS_CONTENT;\n }\n\n return {\n content: applyPagination(content, args.filters),\n };\n },\n );\n\n mcp.registerTool(\n \"search_logs\",\n {\n title: \"Search Application Logs\",\n description: `**Purpose:** Search for application logs to understand behavior, debug issues, and trace execution flow across your stack.\n\n**NOT for:** Error diagnostics (use search_errors for exceptions/crashes). This tool is for info, warn, debug, and trace messages.\n\n**Returns:**\n• Timestamped log entries with severity levels (info, warn, debug)\n• Custom application messages and debug output\n• API request/response logs with timing\n• Database query logs and performance metrics\n\n**When to use:**\n- Understanding application flow and behavior\n- User mentions \"logs\", \"debugging\", \"trace\"\n- Checking what the app is doing internally\n- Performance investigation and timing analysis\n\n**Example calls:**\n\\`\\`\\`json\n// Example 1: Check last 5 minutes of logs\nsearch_logs({ filters: { timeWindow: 300 } })\n\n// Example 2: Find logs from specific file\nsearch_logs({ filters: { filename: \"auth.ts\" } })\n\n// Example 3: Get recent 20 log entries\nsearch_logs({ filters: { limit: 20, offset: 0 } })\n\\`\\`\\`\n\n## Workflow Pattern:\n1. User reports behavior question → **Call search_logs** \n2. User tests new feature → **Check logs for expected output**\n3. Performance concerns → **Look for timing patterns in logs**\n4. Debugging complex flows → **Trace execution through log timeline**\n5. **Use with search_errors** for complete debugging picture\n\n**Key trigger phrases:**\n- \"How does X work?\" → See runtime execution flow\n- \"Is the app doing Y?\" → Check for specific log patterns \n- \"Performance seems off\" → Look for timing/resource logs\n- \"Debug this feature\" → Follow execution path through logs\n- \"What's happening when...\" → Real-time application behavior\n\n**Log Levels Available:**\n- **INFO**: General application flow and significant events\n- **WARN**: Potential issues that don't break functionality \n- **DEBUG**: Detailed execution information for troubleshooting\n- **ERROR**: Actual failures (also available via search_errors)\n\n**Remember:** Logs show you what your application is actually doing, not just what the code says it should do. Use this for understanding real runtime behavior, performance patterns, and verifying that features work as intended.\n\n**Parameter hints:**\n• filters.timeWindow: Seconds to look back (60 = 1 min, 300 = 5 min, 3600 = 1 hour) \n• filters.filename: Exact filename generating logs (e.g., \"api.ts\", \"database.js\")\n• filters.limit/offset: For pagination through many log entries`,\n inputSchema,\n },\n async args => {\n const envelopes = getBuffer().read(args.filters);\n\n if (envelopes.length === 0) {\n return NO_LOGS_CONTENT;\n }\n\n const content: TextContent[] = [];\n for (const envelope of envelopes) {\n try {\n const events = await formatLogEnvelope(envelope);\n\n if (events?.length) {\n for (const event of events) {\n content.push({\n type: \"text\",\n text: event,\n });\n }\n }\n } catch (err) {\n captureException(err, { extra: { context: \"Error formatting log envelope in MCP\" } });\n }\n }\n\n if (content.length === 0) {\n return NO_LOGS_CONTENT;\n }\n\n return {\n content: applyPagination(content, args.filters),\n };\n },\n );\n\n mcp.registerTool(\n \"search_traces\",\n {\n title: \"Search Performance Traces\",\n description: `**Purpose:** Search for performance traces to identify slow requests, bottlenecks, and transaction patterns across your application.\n\n**USE THIS TOOL WHEN:**\n- Investigating application performance and request flows\n- User mentions \"traces\", \"performance\", \"slow requests\", \"tracing\"\n- Looking for distributed tracing data or transaction flows\n- Need to see high-level trace patterns before diving into details\n\n**Returns:**\n• List of traces with IDs, durations, and span counts\n• Root transaction names and total execution time\n• Error counts per trace for quick identification\n• Trace start timestamps for timeline analysis\n\n**When to use:**\n- Investigating performance issues or slow requests\n- User mentions \"traces\", \"performance\", \"slow\"\n- Finding specific transactions or requests\n- Overview of recent application activity\n\n**Example calls:**\n\\`\\`\\`json\n// Example 1: Get traces from last 5 minutes\nsearch_traces({ filters: { timeWindow: 300 } })\n\n// Example 2: Get 10 most recent traces\nsearch_traces({ filters: { limit: 10, offset: 0 } })\n\n// Example 3: Find traces involving specific file\nsearch_traces({ filters: { filename: \"api.ts\" } })\n\\`\\`\\`\n\n**Parameter hints:**\n• filters.timeWindow: Seconds to look back (60 = 1 min, 300 = 5 min)\n• filters.limit: Number of traces to return (e.g., 10, 20)\n• filters.offset: Skip first N traces for pagination\n**Key trigger phrases:**\n- \"Show me recent traces\" → Get trace overview\n- \"Performance issues\" → Look for slow traces\n- \"Request flows\" → See transaction patterns\n- \"Distributed tracing\" → View trace summaries\n\n**Next step:** Use get_traces with a trace ID to see detailed span breakdown`,\n inputSchema,\n },\n async args => {\n const envelopes = getBuffer().read(args.filters);\n\n if (envelopes.length === 0) {\n return {\n content: [\n {\n type: \"text\",\n text: \"No traces found in the specified time period. Make sure your application is instrumented with Sentry performance monitoring and try triggering some requests or transactions.\",\n },\n ],\n };\n }\n\n const traces = extractTracesFromEnvelopes(envelopes);\n\n if (traces.size === 0) {\n return {\n content: [\n {\n type: \"text\",\n text: \"No traces with trace context found. Ensure your Sentry SDK has performance monitoring enabled and is generating transaction events.\",\n },\n ],\n };\n }\n\n let content: TextContent[] = [];\n\n // Sort traces by start time (most recent first)\n const sortedTraces = Array.from(traces.values()).sort(\n (a, b) => (b.start_timestamp || 0) - (a.start_timestamp || 0),\n );\n\n content.push({\n type: \"text\",\n text: `# Local Traces (${sortedTraces.length} found)\\n\\nRecent traces from your application:\\n`,\n });\n\n for (const trace of sortedTraces.slice(0, 20)) {\n // Limit to 20 most recent\n content.push({\n type: \"text\",\n text: formatTraceSummary(trace),\n });\n }\n\n content = applyPagination(content, args.filters);\n\n content.push({\n type: \"text\",\n text: \"\\n**Next Steps:**\\nUse `get_traces` with a trace ID (e.g., first 8 characters shown above) to see the full span tree and detailed timing breakdown for any specific trace.\",\n });\n\n return { content };\n },\n );\n\n mcp.registerTool(\n \"get_traces\",\n {\n title: \"Get Trace Details\",\n description: `**Purpose:** Get the complete span tree and timing breakdown for a specific trace ID to analyze performance bottlenecks.\n\n**USE THIS TOOL WHEN:**\n- User provides a specific trace ID from \\`search_traces\\`\n- Want to see detailed span hierarchy and timing for a trace\n- Investigating performance bottlenecks within a specific request flow\n- Need to understand the complete execution path of a transaction\n\n**Returns:**\n• Hierarchical span tree with parent-child relationships\n• Individual span durations and operation names\n• Database queries, API calls, and render timings\n• Error details if spans failed\n\n**When to use:**\n- After finding a trace ID with search_traces\n- Investigating specific slow request or transaction\n- Understanding detailed execution flow\n- Finding performance bottlenecks in a trace\n\n**Example calls:**\n\\`\\`\\`json\n// Example 1: Get trace using short ID (first 8 chars)\nget_traces({ traceId: \"71a8c5e4\" })\n\n// Example 2: Get trace using full 32-char ID\nget_traces({ traceId: \"71a8c5e41ae1044dee67f50a07538fe7\" })\n\\`\\`\\`\n\n**Parameter hints:**\n• traceId: Trace identifier from search_traces\n - Can use first 8 characters (e.g., \"71a8c5e4\")\n - Or full 32-character hex string\n - Case-insensitive`,\n inputSchema: {\n traceId: z\n .string()\n .describe(\n \"Trace ID to retrieve. Format: 8 or 32 hex characters. Examples: '71a8c5e4' or '71a8c5e41ae1044dee67f50a07538fe7'\",\n ),\n },\n },\n async args => {\n // Getting all the envelopes\n const envelopes = getBuffer().read({ all: true });\n const traces = extractTracesFromEnvelopes(envelopes);\n\n // Find trace by full ID or partial ID match\n let targetTrace = traces.get(args.traceId);\n\n if (!targetTrace && args.traceId.length < 32) {\n // Try to find by partial ID\n for (const [traceId, trace] of traces) {\n if (traceId.startsWith(args.traceId)) {\n targetTrace = trace;\n break;\n }\n }\n }\n\n if (!targetTrace) {\n return {\n content: [\n {\n type: \"text\",\n text: `Trace \\`${args.traceId}\\` not found. Use \\`search_traces\\` to see available traces, or try expanding the time window if the trace is older.`,\n },\n ],\n };\n }\n\n const spanTree = buildSpanTree(targetTrace);\n\n // Just render the full span tree\n const treeLines = renderSpanTree(spanTree);\n\n return {\n content: [\n {\n type: \"text\",\n text: treeLines.join(\"\\n\"),\n },\n ],\n };\n },\n );\n\n return mcp;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp.js","sources":["../../../src/server/mcp/mcp.ts"],"sourcesContent":["import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { TextContent } from \"@modelcontextprotocol/sdk/types.js\";\nimport { captureException, wrapMcpServerWithSentry } from \"@sentry/node\";\nimport { z } from \"zod/v3\";\nimport { formatErrorEnvelope } from \"../formatters/md/errors.ts\";\nimport { formatLogEnvelope } from \"../formatters/md/logs.ts\";\nimport {\n buildSpanTree,\n extractTracesFromEnvelopes,\n formatTraceSummary,\n renderSpanTree,\n} from \"../formatters/md/traces.ts\";\nimport { getBuffer } from \"../utils/index.ts\";\nimport { NO_ERRORS_CONTENT, NO_LOGS_CONTENT } from \"./constants.ts\";\n\nconst inputSchema = {\n filters: z.union([\n z.object({\n timeWindow: z\n .number()\n .describe(\n \"Number of seconds to look back from now. Examples: 60 = last minute, 300 = last 5 minutes, 3600 = last hour. Default: 60\",\n ),\n }),\n z.object({\n filename: z\n .string()\n .describe(\n \"Exact filename to search in stack traces or logs. Examples: 'Button.tsx', 'auth.js', 'api/routes.ts'. Case-sensitive.\",\n ),\n }),\n /**\n * TODO: Need to check, if this approach is better then a cursor based approach,\n * where the user can pass `events since [event_id]` as \"last N events\" is a\n * moving target as events keep coming in.\n *\n * https://github.com/getsentry/spotlight/pull/968#discussion_r2391587907\n */\n z\n .object({\n limit: z.number().describe(\"Maximum number of results to return. Examples: 10, 20, 50. Default: no limit\"),\n offset: z\n .number()\n .default(0)\n .describe(\n \"Number of results to skip from the beginning. Examples: 0 = start from first, 10 = skip first 10. Default: 0\",\n ),\n })\n .optional()\n .describe(\"Pagination: Use when timeWindow doesn't work or for browsing through many results\"),\n ]),\n};\n\nexport type InputSchema = { [K in keyof typeof inputSchema]: z.infer<(typeof inputSchema)[K]> };\n\nfunction applyPagination<T>(envelopes: T[], pagination: InputSchema[\"filters\"]) {\n if (pagination == null || !(\"limit\" in pagination)) {\n return envelopes;\n }\n\n return envelopes.slice(pagination.offset, pagination.offset + pagination.limit);\n}\n\nexport function createMCPInstance() {\n const mcp = wrapMcpServerWithSentry(\n new McpServer({\n name: \"spotlight-mcp\",\n version: String(process.env.npm_package_version),\n }),\n );\n\n mcp.registerTool(\n \"search_errors\",\n {\n title: \"Search Application Errors\",\n description: `**Purpose:** Search for runtime errors, exceptions, and crashes captured by Spotlight across your entire application stack.\n\n**CRITICAL: Call this tool IMMEDIATELY when:**\n- User says \"error\", \"broken\", \"not working\", \"failing\", \"crash\", \"bug\", \"issue\"\n- You encounter errors during testing or code execution\n- Before and after making code changes to verify no regressions\n- Investigating any unexpected behavior or performance problems\n- Error messages and exception details\n- Request/response context for API failures\n- Browser/device info when available\n\n**Returns:**\n• Full stack traces with exact file:line locations\n\n**When to use:**\n- User reports \"error\", \"broken\", \"not working\", \"crash\", \"bug\"\n- After code changes to verify no regressions\n- Investigating unexpected behavior or failures\n- Debugging specific file errors\n\n**Example calls:**\n\\`\\`\\`json\n// Example 1: Check last minute for any errors\nsearch_errors({ filters: { timeWindow: 60 } })\n\n// Example 2: Find errors in specific file\nsearch_errors({ filters: { filename: \"auth.tsx\" } })\n\n// Example 3: Get last 10 errors with pagination\nsearch_errors({ filters: { limit: 10, offset: 0 } })\n\\`\\`\\`\n\n**Parameter hints:**\n• filters.timeWindow: Seconds to look back (60 = 1 min, 300 = 5 min, 3600 = 1 hour)\n• filters.filename: Exact filename in stack trace (e.g., \"Button.tsx\", \"api.js\")\n• filters.limit/offset: For pagination through many errors`,\n inputSchema,\n },\n async args => {\n const envelopes = getBuffer().read(args.filters);\n\n if (envelopes.length === 0) {\n return NO_ERRORS_CONTENT;\n }\n\n const content: TextContent[] = [];\n for (const envelope of envelopes) {\n try {\n const events = await formatErrorEnvelope(envelope);\n\n if (events?.length) {\n for (const event of events) {\n content.push({\n type: \"text\",\n text: event,\n });\n }\n }\n } catch (err) {\n captureException(err, { extra: { context: \"Error formatting error envelope in MCP\" } });\n }\n }\n\n if (content.length === 0) {\n return NO_ERRORS_CONTENT;\n }\n\n return {\n content: applyPagination(content, args.filters),\n };\n },\n );\n\n mcp.registerTool(\n \"search_logs\",\n {\n title: \"Search Application Logs\",\n description: `**Purpose:** Search for application logs to understand behavior, debug issues, and trace execution flow across your stack.\n\n**NOT for:** Error diagnostics (use search_errors for exceptions/crashes). This tool is for info, warn, debug, and trace messages.\n\n**Returns:**\n• Timestamped log entries with severity levels (info, warn, debug)\n• Custom application messages and debug output\n• API request/response logs with timing\n• Database query logs and performance metrics\n\n**When to use:**\n- Understanding application flow and behavior\n- User mentions \"logs\", \"debugging\", \"trace\"\n- Checking what the app is doing internally\n- Performance investigation and timing analysis\n\n**Example calls:**\n\\`\\`\\`json\n// Example 1: Check last 5 minutes of logs\nsearch_logs({ filters: { timeWindow: 300 } })\n\n// Example 2: Find logs from specific file\nsearch_logs({ filters: { filename: \"auth.ts\" } })\n\n// Example 3: Get recent 20 log entries\nsearch_logs({ filters: { limit: 20, offset: 0 } })\n\\`\\`\\`\n\n## Workflow Pattern:\n1. User reports behavior question → **Call search_logs** \n2. User tests new feature → **Check logs for expected output**\n3. Performance concerns → **Look for timing patterns in logs**\n4. Debugging complex flows → **Trace execution through log timeline**\n5. **Use with search_errors** for complete debugging picture\n\n**Key trigger phrases:**\n- \"How does X work?\" → See runtime execution flow\n- \"Is the app doing Y?\" → Check for specific log patterns \n- \"Performance seems off\" → Look for timing/resource logs\n- \"Debug this feature\" → Follow execution path through logs\n- \"What's happening when...\" → Real-time application behavior\n\n**Log Levels Available:**\n- **INFO**: General application flow and significant events\n- **WARN**: Potential issues that don't break functionality \n- **DEBUG**: Detailed execution information for troubleshooting\n- **ERROR**: Actual failures (also available via search_errors)\n\n**Remember:** Logs show you what your application is actually doing, not just what the code says it should do. Use this for understanding real runtime behavior, performance patterns, and verifying that features work as intended.\n\n**Parameter hints:**\n• filters.timeWindow: Seconds to look back (60 = 1 min, 300 = 5 min, 3600 = 1 hour) \n• filters.filename: Exact filename generating logs (e.g., \"api.ts\", \"database.js\")\n• filters.limit/offset: For pagination through many log entries`,\n inputSchema,\n },\n async args => {\n const envelopes = getBuffer().read(args.filters);\n\n if (envelopes.length === 0) {\n return NO_LOGS_CONTENT;\n }\n\n const content: TextContent[] = [];\n for (const envelope of envelopes) {\n try {\n const events = await formatLogEnvelope(envelope);\n\n if (events?.length) {\n for (const event of events) {\n content.push({\n type: \"text\",\n text: event,\n });\n }\n }\n } catch (err) {\n captureException(err, { extra: { context: \"Error formatting log envelope in MCP\" } });\n }\n }\n\n if (content.length === 0) {\n return NO_LOGS_CONTENT;\n }\n\n return {\n content: applyPagination(content, args.filters),\n };\n },\n );\n\n mcp.registerTool(\n \"search_traces\",\n {\n title: \"Search Performance Traces\",\n description: `**Purpose:** Search for performance traces to identify slow requests, bottlenecks, and transaction patterns across your application.\n\n**USE THIS TOOL WHEN:**\n- Investigating application performance and request flows\n- User mentions \"traces\", \"performance\", \"slow requests\", \"tracing\"\n- Looking for distributed tracing data or transaction flows\n- Need to see high-level trace patterns before diving into details\n\n**Returns:**\n• List of traces with IDs, durations, and span counts\n• Root transaction names and total execution time\n• Error counts per trace for quick identification\n• Trace start timestamps for timeline analysis\n\n**When to use:**\n- Investigating performance issues or slow requests\n- User mentions \"traces\", \"performance\", \"slow\"\n- Finding specific transactions or requests\n- Overview of recent application activity\n\n**Example calls:**\n\\`\\`\\`json\n// Example 1: Get traces from last 5 minutes\nsearch_traces({ filters: { timeWindow: 300 } })\n\n// Example 2: Get 10 most recent traces\nsearch_traces({ filters: { limit: 10, offset: 0 } })\n\n// Example 3: Find traces involving specific file\nsearch_traces({ filters: { filename: \"api.ts\" } })\n\\`\\`\\`\n\n**Parameter hints:**\n• filters.timeWindow: Seconds to look back (60 = 1 min, 300 = 5 min)\n• filters.limit: Number of traces to return (e.g., 10, 20)\n• filters.offset: Skip first N traces for pagination\n**Key trigger phrases:**\n- \"Show me recent traces\" → Get trace overview\n- \"Performance issues\" → Look for slow traces\n- \"Request flows\" → See transaction patterns\n- \"Distributed tracing\" → View trace summaries\n\n**Next step:** Use get_traces with a trace ID to see detailed span breakdown`,\n inputSchema,\n },\n async args => {\n const envelopes = getBuffer().read(args.filters);\n\n if (envelopes.length === 0) {\n return {\n content: [\n {\n type: \"text\",\n text: \"No traces found in the specified time period. Make sure your application is instrumented with Sentry performance monitoring and try triggering some requests or transactions.\",\n },\n ],\n };\n }\n\n const traces = extractTracesFromEnvelopes(envelopes);\n\n if (traces.size === 0) {\n return {\n content: [\n {\n type: \"text\",\n text: \"No traces with trace context found. Ensure your Sentry SDK has performance monitoring enabled and is generating transaction events.\",\n },\n ],\n };\n }\n\n let content: TextContent[] = [];\n\n // Sort traces by start time (most recent first)\n const sortedTraces = Array.from(traces.values()).sort(\n (a, b) => (b.start_timestamp || 0) - (a.start_timestamp || 0),\n );\n\n content.push({\n type: \"text\",\n text: `# Local Traces (${sortedTraces.length} found)\\n\\nRecent traces from your application:\\n`,\n });\n\n for (const trace of sortedTraces.slice(0, 20)) {\n // Limit to 20 most recent\n content.push({\n type: \"text\",\n text: formatTraceSummary(trace),\n });\n }\n\n content = applyPagination(content, args.filters);\n\n content.push({\n type: \"text\",\n text: \"\\n**Next Steps:**\\nUse `get_traces` with a trace ID (e.g., first 8 characters shown above) to see the full span tree and detailed timing breakdown for any specific trace.\",\n });\n\n return { content };\n },\n );\n\n mcp.registerTool(\n \"get_traces\",\n {\n title: \"Get Trace Details\",\n description: `**Purpose:** Get the complete span tree and timing breakdown for a specific trace ID to analyze performance bottlenecks.\n\n**USE THIS TOOL WHEN:**\n- User provides a specific trace ID from \\`search_traces\\`\n- Want to see detailed span hierarchy and timing for a trace\n- Investigating performance bottlenecks within a specific request flow\n- Need to understand the complete execution path of a transaction\n\n**Returns:**\n• Hierarchical span tree with parent-child relationships\n• Individual span durations and operation names\n• Database queries, API calls, and render timings\n• Error details if spans failed\n\n**When to use:**\n- After finding a trace ID with search_traces\n- Investigating specific slow request or transaction\n- Understanding detailed execution flow\n- Finding performance bottlenecks in a trace\n\n**Example calls:**\n\\`\\`\\`json\n// Example 1: Get trace using short ID (first 8 chars)\nget_traces({ traceId: \"71a8c5e4\" })\n\n// Example 2: Get trace using full 32-char ID\nget_traces({ traceId: \"71a8c5e41ae1044dee67f50a07538fe7\" })\n\\`\\`\\`\n\n**Parameter hints:**\n• traceId: Trace identifier from search_traces\n - Can use first 8 characters (e.g., \"71a8c5e4\")\n - Or full 32-character hex string\n - Case-insensitive`,\n inputSchema: {\n traceId: z\n .string()\n .describe(\n \"Trace ID to retrieve. Format: 8 or 32 hex characters. Examples: '71a8c5e4' or '71a8c5e41ae1044dee67f50a07538fe7'\",\n ),\n },\n },\n async args => {\n // Getting all the envelopes\n const envelopes = getBuffer().read({ all: true });\n const traces = extractTracesFromEnvelopes(envelopes);\n\n // Find trace by full ID or partial ID match\n let targetTrace = traces.get(args.traceId);\n\n if (!targetTrace && args.traceId.length < 32) {\n // Try to find by partial ID\n for (const [traceId, trace] of traces) {\n if (traceId.startsWith(args.traceId)) {\n targetTrace = trace;\n break;\n }\n }\n }\n\n if (!targetTrace) {\n return {\n content: [\n {\n type: \"text\",\n text: `Trace \\`${args.traceId}\\` not found. Use \\`search_traces\\` to see available traces, or try expanding the time window if the trace is older.`,\n },\n ],\n };\n }\n\n const spanTree = buildSpanTree(targetTrace);\n\n // Just render the full span tree\n const treeLines = renderSpanTree(spanTree);\n\n return {\n content: [\n {\n type: \"text\",\n text: treeLines.join(\"\\n\"),\n },\n ],\n };\n },\n );\n\n return mcp;\n}\n"],"names":["z.union","z.object","z.number","z.string"],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  !function() {
3
3
  try {
4
4
  var e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : {}, n = new e.Error().stack;
5
- n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "df2b59d9-0e2c-4abe-8147-c0e94d351512", e._sentryDebugIdIdentifier = "sentry-dbid-df2b59d9-0e2c-4abe-8147-c0e94d351512");
5
+ n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "7d53e322-d26b-40ad-870a-31ce2368a1b1", e._sentryDebugIdIdentifier = "sentry-dbid-7d53e322-d26b-40ad-870a-31ce2368a1b1");
6
6
  } catch (e2) {
7
7
  }
8
8
  }();
@@ -11,6 +11,7 @@ import { getBuffer } from "../utils/getBuffer.js";
11
11
  import "../parser/helpers.js";
12
12
  import "uuidv7";
13
13
  import "../../_virtual/_sentry-release-injection-file.js";
14
+ import "node:child_process";
14
15
  import "node:http";
15
16
  import "@sentry/node";
16
17
  import "node:dns/promises";
@@ -1 +1 @@
1
- {"version":3,"file":"clear.js","sources":["../../../src/server/routes/clear.ts"],"sourcesContent":["import { Hono } from \"hono\";\nimport { getBuffer } from \"../utils/index.ts\";\n\nconst router = new Hono();\n\nrouter.delete(\"/\", ctx => {\n getBuffer().clear();\n return ctx.text(\"Cleared\");\n});\n\nexport default router;\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAGA,MAAM,SAAS,IAAI,KAAA;AAEnB,OAAO,OAAO,KAAK,CAAA,QAAO;AACxB,YAAA,EAAY,MAAA;AACZ,SAAO,IAAI,KAAK,SAAS;AAC3B,CAAC;"}
1
+ {"version":3,"file":"clear.js","sources":["../../../src/server/routes/clear.ts"],"sourcesContent":["import { Hono } from \"hono\";\nimport { getBuffer } from \"../utils/index.ts\";\n\nconst router = new Hono();\n\nrouter.delete(\"/\", ctx => {\n getBuffer().clear();\n return ctx.text(\"Cleared\");\n});\n\nexport default router;\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAGA,MAAM,SAAS,IAAI,KAAA;AAEnB,OAAO,OAAO,KAAK,CAAA,QAAO;AACxB,YAAA,EAAY,MAAA;AACZ,SAAO,IAAI,KAAK,SAAS;AAC3B,CAAC;"}
@@ -2,7 +2,7 @@
2
2
  !function() {
3
3
  try {
4
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] = "c8123de6-5e77-41da-8100-10d99b558d5f", e._sentryDebugIdIdentifier = "sentry-dbid-c8123de6-5e77-41da-8100-10d99b558d5f");
5
+ n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "2e7449de-b7a2-4372-aa0d-d7b00927a5fa", e._sentryDebugIdIdentifier = "sentry-dbid-2e7449de-b7a2-4372-aa0d-d7b00927a5fa");
6
6
  } catch (e2) {
7
7
  }
8
8
  }();
@@ -15,6 +15,7 @@ import { getBuffer } from "../../utils/getBuffer.js";
15
15
  import "../../parser/helpers.js";
16
16
  import "uuidv7";
17
17
  import "../../../_virtual/_sentry-release-injection-file.js";
18
+ import "node:child_process";
18
19
  import "node:http";
19
20
  import "@sentry/node";
20
21
  import "node:dns/promises";
@@ -64,7 +65,7 @@ const router = new Hono().get("/stream", (ctx) => {
64
65
  "Content-Disposition": `attachment; filename="${envelopeId}.bin"`,
65
66
  Connection: "keep-alive"
66
67
  });
67
- }).on("POST", ["/stream", "/api/:id/envelope"], async (ctx) => {
68
+ }).on("POST", ["/stream", "/api/:id/envelope", "/api/:id/envelope/"], async (ctx) => {
68
69
  let contentType = ctx.req.header("content-type")?.split(";")[0].toLocaleLowerCase();
69
70
  if (ctx.req.query("sentry_client")?.startsWith("sentry.javascript.browser") && ctx.req.header("Origin")) {
70
71
  contentType = SENTRY_CONTENT_TYPE;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/server/routes/stream/index.ts"],"sourcesContent":["import { createWriteStream } from \"node:fs\";\nimport { Hono } from \"hono\";\nimport { SENTRY_CONTENT_TYPE } from \"../../../shared/constants.ts\";\nimport { logger } from \"../../logger.ts\";\nimport { decompressBody, pushToSpotlightBuffer } from \"../../sdk.ts\";\nimport type { ContentEncoding } from \"../../sdk.ts\";\nimport type { HonoEnv } from \"../../types/env.ts\";\nimport { getBuffer } from \"../../utils/index.ts\";\nimport { logIncomingEvent, logOutgoingEvent } from \"./debugLogging.ts\";\nimport { streamSSE } from \"./streaming.ts\";\nimport { parseBrowserFromUserAgent } from \"./userAgent.ts\";\n\nconst router = new Hono<HonoEnv>()\n .get(\"/stream\", ctx => {\n const buffer = getBuffer();\n\n const useBase64 = ctx.req.query(\"base64\") != null;\n const base64Indicator = useBase64 ? \";base64\" : \"\";\n\n // Capture client information for debug logging\n let clientId = ctx.req.query(\"client\");\n if (!clientId) {\n // Fallback to parsing User-Agent if no client param\n const userAgent = ctx.req.header(\"User-Agent\") || \"unknown\";\n clientId = parseBrowserFromUserAgent(userAgent);\n }\n // Sanitize to prevent log injection - keep only safe printable characters\n // Allow alphanumeric, spaces, dots, dashes, underscores, slashes, parentheses\n clientId = clientId.replace(/[^\\w\\s.\\-/()]/g, \"\");\n // Ensure we always have a non-empty clientId\n if (!clientId) clientId = \"unknown\";\n\n return streamSSE(ctx, async stream => {\n // Check for Last-Event-ID header to support reconnection\n const lastEventId = ctx.req.header(\"Last-Event-ID\");\n\n // Subscribe to events, optionally starting from after the lastEventId\n const sub = buffer.subscribe(container => {\n logOutgoingEvent(container, clientId);\n\n const parsedEnvelope = container.getParsedEnvelope();\n if (parsedEnvelope) {\n stream.writeSSE({\n id: parsedEnvelope.envelope[0].__spotlight_envelope_id.toString(),\n event: `${container.getContentType()}${base64Indicator}`,\n data: JSON.stringify(parsedEnvelope.envelope),\n });\n }\n }, lastEventId);\n\n stream.onAbort(() => {\n buffer.unsubscribe(sub);\n });\n });\n })\n .get(\"/envelope/:id\", ctx => {\n const buffer = getBuffer();\n\n const envelopeId = ctx.req.param(\"id\");\n const container = buffer.read({ envelopeId });\n\n if (container.length === 0) {\n return ctx.notFound();\n }\n\n return ctx.body(new Uint8Array(container[0].getData()), 200, {\n \"Content-Type\": container[0].getContentType(),\n \"Cache-Control\": \"no-cache\",\n \"Content-Disposition\": `attachment; filename=\"${envelopeId}.bin\"`,\n Connection: \"keep-alive\",\n });\n })\n .on(\"POST\", [\"/stream\", \"/api/:id/envelope\"], async ctx => {\n let contentType = ctx.req.header(\"content-type\")?.split(\";\")[0].toLocaleLowerCase();\n if (ctx.req.query(\"sentry_client\")?.startsWith(\"sentry.javascript.browser\") && ctx.req.header(\"Origin\")) {\n // This is a correction we make as Sentry Browser SDK may send messages with text/plain to avoid CORS issues\n contentType = SENTRY_CONTENT_TYPE;\n }\n\n // manually decompress body to use it below without another decompression\n const body = decompressBody(\n Buffer.from(await ctx.req.arrayBuffer()),\n ctx.req.header(\"Content-Encoding\") as ContentEncoding,\n );\n\n const container = pushToSpotlightBuffer({\n body,\n spotlightBuffer: getBuffer(),\n contentType,\n userAgent: ctx.req.header(\"User-Agent\"),\n });\n\n if (container) {\n // Log incoming event details when debug is enabled\n logIncomingEvent(container);\n } else {\n logger.warn(\"No content type, skipping payload...\");\n }\n\n const incomingPayload = ctx.get(\"incomingPayload\");\n\n if (process.env.SPOTLIGHT_CAPTURE || incomingPayload) {\n const contentType = container?.getContentType();\n const timestamp = BigInt(Date.now()) * 1_000_000n + (process.hrtime.bigint() % 1_000_000n);\n const filename = `${contentType?.replace(/[^a-z0-9]/gi, \"_\") || \"no_content_type\"}-${timestamp}.txt`;\n\n if (incomingPayload) {\n incomingPayload(body.toString(\"binary\"));\n } else {\n const stream = createWriteStream(filename);\n stream.on(\"error\", err => {\n logger.error(`Failed to save data to ${filename}: ${err}`);\n stream.destroy();\n });\n stream.end(body, () => {\n logger.info(`🗃️ Saved data to ${filename}`);\n });\n }\n }\n\n // 204 would be more appropriate but returning 200 to match what /envelope returns\n return ctx.body(null, 200, {\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n });\n\nexport default router;\n"],"names":["contentType"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/server/routes/stream/index.ts"],"sourcesContent":["import { createWriteStream } from \"node:fs\";\nimport { Hono } from \"hono\";\nimport { SENTRY_CONTENT_TYPE } from \"../../../shared/constants.ts\";\nimport { logger } from \"../../logger.ts\";\nimport { decompressBody, pushToSpotlightBuffer } from \"../../sdk.ts\";\nimport type { ContentEncoding } from \"../../sdk.ts\";\nimport type { HonoEnv } from \"../../types/env.ts\";\nimport { getBuffer } from \"../../utils/index.ts\";\nimport { logIncomingEvent, logOutgoingEvent } from \"./debugLogging.ts\";\nimport { streamSSE } from \"./streaming.ts\";\nimport { parseBrowserFromUserAgent } from \"./userAgent.ts\";\n\nconst router = new Hono<HonoEnv>()\n .get(\"/stream\", ctx => {\n const buffer = getBuffer();\n\n const useBase64 = ctx.req.query(\"base64\") != null;\n const base64Indicator = useBase64 ? \";base64\" : \"\";\n\n // Capture client information for debug logging\n let clientId = ctx.req.query(\"client\");\n if (!clientId) {\n // Fallback to parsing User-Agent if no client param\n const userAgent = ctx.req.header(\"User-Agent\") || \"unknown\";\n clientId = parseBrowserFromUserAgent(userAgent);\n }\n // Sanitize to prevent log injection - keep only safe printable characters\n // Allow alphanumeric, spaces, dots, dashes, underscores, slashes, parentheses\n clientId = clientId.replace(/[^\\w\\s.\\-/()]/g, \"\");\n // Ensure we always have a non-empty clientId\n if (!clientId) clientId = \"unknown\";\n\n return streamSSE(ctx, async stream => {\n // Check for Last-Event-ID header to support reconnection\n const lastEventId = ctx.req.header(\"Last-Event-ID\");\n\n // Subscribe to events, optionally starting from after the lastEventId\n const sub = buffer.subscribe(container => {\n logOutgoingEvent(container, clientId);\n\n const parsedEnvelope = container.getParsedEnvelope();\n if (parsedEnvelope) {\n stream.writeSSE({\n id: parsedEnvelope.envelope[0].__spotlight_envelope_id.toString(),\n event: `${container.getContentType()}${base64Indicator}`,\n data: JSON.stringify(parsedEnvelope.envelope),\n });\n }\n }, lastEventId);\n\n stream.onAbort(() => {\n buffer.unsubscribe(sub);\n });\n });\n })\n .get(\"/envelope/:id\", ctx => {\n const buffer = getBuffer();\n\n const envelopeId = ctx.req.param(\"id\");\n const container = buffer.read({ envelopeId });\n\n if (container.length === 0) {\n return ctx.notFound();\n }\n\n return ctx.body(new Uint8Array(container[0].getData()), 200, {\n \"Content-Type\": container[0].getContentType(),\n \"Cache-Control\": \"no-cache\",\n \"Content-Disposition\": `attachment; filename=\"${envelopeId}.bin\"`,\n Connection: \"keep-alive\",\n });\n })\n .on(\"POST\", [\"/stream\", \"/api/:id/envelope\", \"/api/:id/envelope/\"], async ctx => {\n let contentType = ctx.req.header(\"content-type\")?.split(\";\")[0].toLocaleLowerCase();\n if (ctx.req.query(\"sentry_client\")?.startsWith(\"sentry.javascript.browser\") && ctx.req.header(\"Origin\")) {\n // This is a correction we make as Sentry Browser SDK may send messages with text/plain to avoid CORS issues\n contentType = SENTRY_CONTENT_TYPE;\n }\n\n // manually decompress body to use it below without another decompression\n const body = decompressBody(\n Buffer.from(await ctx.req.arrayBuffer()),\n ctx.req.header(\"Content-Encoding\") as ContentEncoding,\n );\n\n const container = pushToSpotlightBuffer({\n body,\n spotlightBuffer: getBuffer(),\n contentType,\n userAgent: ctx.req.header(\"User-Agent\"),\n });\n\n if (container) {\n // Log incoming event details when debug is enabled\n logIncomingEvent(container);\n } else {\n logger.warn(\"No content type, skipping payload...\");\n }\n\n const incomingPayload = ctx.get(\"incomingPayload\");\n\n if (process.env.SPOTLIGHT_CAPTURE || incomingPayload) {\n const contentType = container?.getContentType();\n const timestamp = BigInt(Date.now()) * 1_000_000n + (process.hrtime.bigint() % 1_000_000n);\n const filename = `${contentType?.replace(/[^a-z0-9]/gi, \"_\") || \"no_content_type\"}-${timestamp}.txt`;\n\n if (incomingPayload) {\n incomingPayload(body.toString(\"binary\"));\n } else {\n const stream = createWriteStream(filename);\n stream.on(\"error\", err => {\n logger.error(`Failed to save data to ${filename}: ${err}`);\n stream.destroy();\n });\n stream.end(body, () => {\n logger.info(`🗃️ Saved data to ${filename}`);\n });\n }\n }\n\n // 204 would be more appropriate but returning 200 to match what /envelope returns\n return ctx.body(null, 200, {\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n });\n\nexport default router;\n"],"names":["contentType"],"mappings":"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"}
@@ -6,6 +6,7 @@ export type CLIHandlerOptions = {
6
6
  port: SideCarOptions["port"];
7
7
  help?: boolean;
8
8
  debug?: boolean;
9
+ open?: boolean;
9
10
  format?: FormatterType;
10
11
  basePath?: SideCarOptions["basePath"];
11
12
  filesToServe?: SideCarOptions["filesToServe"];
@@ -5,6 +5,7 @@ interface DockerComposeConfig {
5
5
  composeFiles: string[];
6
6
  command: string[];
7
7
  serviceNames: string[];
8
+ subcommandArgs: string[];
8
9
  }
9
10
  /**
10
11
  * Detect if Docker is installed and check its version
@@ -20,6 +21,17 @@ export declare function buildDockerComposeCommand(config: DockerComposeConfig):
20
21
  cmdArgs: string[];
21
22
  stdin: string;
22
23
  };
24
+ /**
25
+ * Prepare Docker Compose run by configuring environment and building command
26
+ *
27
+ * This helper sets up the SENTRY_SPOTLIGHT URL to use host.docker.internal
28
+ * (so containers can reach the host machine), builds the compose command,
29
+ * and removes COMPOSE_FILE from env to avoid conflicts with explicit -f flags.
30
+ */
31
+ export declare function prepareDockerComposeRun(config: DockerComposeConfig, serverPort: number, env: Record<string, string | undefined>): {
32
+ cmdArgs: string[];
33
+ stdin: string;
34
+ };
23
35
  /**
24
36
  * Detect and configure Docker Compose
25
37
  *
@@ -27,4 +39,16 @@ export declare function buildDockerComposeCommand(config: DockerComposeConfig):
27
39
  * compose files, and services to build a complete configuration.
28
40
  */
29
41
  export declare function detectDockerCompose(): DockerComposeConfig | null;
42
+ /**
43
+ * Parse an explicit Docker Compose command from cmdArgs
44
+ *
45
+ * This handles cases where the user runs:
46
+ * - `spotlight run docker compose up -d`
47
+ * - `spotlight run docker-compose logs -f`
48
+ * - `spotlight run docker compose -f custom.yml exec web bash`
49
+ *
50
+ * Returns a DockerComposeConfig if the command is a docker compose command,
51
+ * null otherwise.
52
+ */
53
+ export declare function parseExplicitDockerCompose(cmdArgs: string[]): DockerComposeConfig | null;
30
54
  export {};
@@ -2,7 +2,7 @@
2
2
  !function() {
3
3
  try {
4
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] = "30f1ede9-afbf-41ac-af87-60295da846a2", e._sentryDebugIdIdentifier = "sentry-dbid-30f1ede9-afbf-41ac-af87-60295da846a2");
5
+ n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "98a6bb80-8229-4a49-9bab-86d71ebccc94", e._sentryDebugIdIdentifier = "sentry-dbid-98a6bb80-8229-4a49-9bab-86d71ebccc94");
6
6
  } catch (e2) {
7
7
  }
8
8
  }();
@@ -35,6 +35,19 @@ function detectDocker() {
35
35
  const valid = semver.gte(versionNumber, DOCKER_MIN_VERSION);
36
36
  return { version: versionNumber, valid };
37
37
  }
38
+ function validateDocker() {
39
+ const docker = detectDocker();
40
+ if (!docker) {
41
+ logger.debug("Docker is not installed or not in PATH");
42
+ return false;
43
+ }
44
+ if (!docker.valid) {
45
+ logger.error(`Docker version ${docker.version} does not meet the minimum required version ${DOCKER_MIN_VERSION}`);
46
+ return false;
47
+ }
48
+ logger.debug(`Detected Docker version ${docker.version}`);
49
+ return true;
50
+ }
38
51
  function detectComposeCommand() {
39
52
  const composePluginVersion = tryExec("docker compose version --short");
40
53
  const composeStandaloneVersion = tryExec("docker-compose version --short");
@@ -64,60 +77,149 @@ function generateSpotlightOverrideYaml(serviceNames) {
64
77
  }
65
78
  return stringify({ services });
66
79
  }
80
+ function resolveComposeFiles(userSpecifiedFiles) {
81
+ if (userSpecifiedFiles && userSpecifiedFiles.length > 0) {
82
+ logger.debug(`Using user-specified compose files: ${userSpecifiedFiles.join(", ")}`);
83
+ return userSpecifiedFiles;
84
+ }
85
+ const fromEnv = getComposeFilesFromEnv();
86
+ if (fromEnv) {
87
+ logger.debug(`Using COMPOSE_FILE environment variable: ${fromEnv.join(", ")}`);
88
+ return fromEnv;
89
+ }
90
+ const composeFile = findComposeFile();
91
+ if (!composeFile) {
92
+ logger.debug("No compose file found");
93
+ return null;
94
+ }
95
+ logger.debug(`Found compose file: ${composeFile}`);
96
+ const files = [composeFile];
97
+ const overrideFile = findOverrideFile(composeFile);
98
+ if (overrideFile) {
99
+ logger.debug(`Found override file: ${overrideFile}`);
100
+ files.push(overrideFile);
101
+ }
102
+ return files;
103
+ }
104
+ function collectServices(composeFiles) {
105
+ const serviceSet = /* @__PURE__ */ new Set();
106
+ for (const file of composeFiles) {
107
+ for (const service of getDockerComposeServices(file)) {
108
+ serviceSet.add(service);
109
+ }
110
+ }
111
+ return Array.from(serviceSet);
112
+ }
113
+ const FILE_FLAGS = ["-f", "--file"];
114
+ const FLAGS_WITH_VALUES = ["-f", "--file", "-p", "--project-name", "--project-directory", "--env-file", "--profile"];
115
+ function parseComposeFlags(args) {
116
+ const files = [];
117
+ const remainingArgs = [];
118
+ let parsingGlobalFlags = true;
119
+ for (let i = 0; i < args.length; i++) {
120
+ const arg = args[i];
121
+ if (parsingGlobalFlags) {
122
+ if (FILE_FLAGS.includes(arg) && args[i + 1]) {
123
+ files.push(args[++i]);
124
+ continue;
125
+ }
126
+ const matchedFileFlag = FILE_FLAGS.find((flag) => arg.startsWith(`${flag}=`));
127
+ if (matchedFileFlag) {
128
+ files.push(arg.slice(matchedFileFlag.length + 1));
129
+ continue;
130
+ }
131
+ if (FLAGS_WITH_VALUES.includes(arg) && args[i + 1]) {
132
+ remainingArgs.push(arg, args[++i]);
133
+ continue;
134
+ }
135
+ const matchedValueFlag = FLAGS_WITH_VALUES.find((flag) => arg.startsWith(`${flag}=`));
136
+ if (matchedValueFlag) {
137
+ remainingArgs.push(arg);
138
+ continue;
139
+ }
140
+ if (!arg.startsWith("-")) {
141
+ parsingGlobalFlags = false;
142
+ }
143
+ }
144
+ remainingArgs.push(arg);
145
+ }
146
+ return { files, remainingArgs };
147
+ }
67
148
  function buildDockerComposeCommand(config) {
68
149
  const cmdArgs = [...config.command];
69
150
  for (const file of config.composeFiles) {
70
151
  cmdArgs.push("-f", file);
71
152
  }
72
153
  cmdArgs.push("-f", "-");
73
- cmdArgs.push("up");
154
+ if (config.subcommandArgs && config.subcommandArgs.length > 0) {
155
+ cmdArgs.push(...config.subcommandArgs);
156
+ }
74
157
  const stdin = generateSpotlightOverrideYaml(config.serviceNames);
75
158
  return { cmdArgs, stdin };
76
159
  }
160
+ function prepareDockerComposeRun(config, serverPort, env) {
161
+ env.SENTRY_SPOTLIGHT = `http://${DOCKER_HOST_INTERNAL}:${serverPort}/stream`;
162
+ const command = buildDockerComposeCommand(config);
163
+ delete env.COMPOSE_FILE;
164
+ return command;
165
+ }
77
166
  function detectDockerCompose() {
78
- const docker = detectDocker();
79
- if (!docker) {
80
- logger.debug("Docker is not installed or not in PATH");
167
+ if (!validateDocker()) {
81
168
  return null;
82
169
  }
83
- if (!docker.valid) {
84
- logger.error(`Docker version ${docker.version} does not meet the minimum required version ${DOCKER_MIN_VERSION}`);
85
- return null;
86
- }
87
- logger.debug(`Detected Docker version ${docker.version}`);
88
170
  const compose = detectComposeCommand();
89
171
  if (!compose) {
90
172
  logger.debug("Docker Compose is not installed or not in PATH");
91
173
  return null;
92
174
  }
93
175
  logger.debug(`Detected Docker Compose version ${compose.version} (${compose.command.join(" ")})`);
94
- const composeFilesFromEnv = getComposeFilesFromEnv();
95
- let composeFiles;
96
- if (composeFilesFromEnv) {
97
- composeFiles = composeFilesFromEnv;
98
- logger.debug(`Using COMPOSE_FILE environment variable: ${composeFiles.join(", ")}`);
176
+ const composeFiles = resolveComposeFiles();
177
+ if (!composeFiles) {
178
+ return null;
179
+ }
180
+ const serviceNames = collectServices(composeFiles);
181
+ if (serviceNames.length === 0) {
182
+ logger.debug("No services found in compose file(s)");
183
+ return null;
184
+ }
185
+ logger.debug(`Found ${serviceNames.length} service(s): ${serviceNames.join(", ")}`);
186
+ return {
187
+ composeFiles,
188
+ command: compose.command,
189
+ serviceNames,
190
+ subcommandArgs: ["up"]
191
+ // Default to 'up' when auto-detecting
192
+ };
193
+ }
194
+ function parseExplicitDockerCompose(cmdArgs) {
195
+ if (cmdArgs.length < 2) {
196
+ return null;
197
+ }
198
+ let command;
199
+ let argsStartIndex;
200
+ if (cmdArgs[0] === "docker-compose") {
201
+ command = ["docker-compose"];
202
+ argsStartIndex = 1;
203
+ } else if (cmdArgs[0] === "docker" && cmdArgs[1] === "compose") {
204
+ command = ["docker", "compose"];
205
+ argsStartIndex = 2;
99
206
  } else {
100
- const composeFile = findComposeFile();
101
- if (!composeFile) {
102
- logger.debug("No compose file found in current directory");
103
- return null;
104
- }
105
- logger.debug(`Found compose file: ${composeFile}`);
106
- composeFiles = [composeFile];
107
- const overrideFile = findOverrideFile(composeFile);
108
- if (overrideFile) {
109
- logger.debug(`Found override file: ${overrideFile}`);
110
- composeFiles.push(overrideFile);
111
- }
207
+ return null;
112
208
  }
113
- const serviceNamesSet = /* @__PURE__ */ new Set();
114
- for (const file of composeFiles) {
115
- const services = getDockerComposeServices(file);
116
- for (const service of services) {
117
- serviceNamesSet.add(service);
118
- }
209
+ if (!validateDocker()) {
210
+ return null;
211
+ }
212
+ const argsAfterCommand = cmdArgs.slice(argsStartIndex);
213
+ const { files: userFiles, remainingArgs: subcommandArgs } = parseComposeFlags(argsAfterCommand);
214
+ if (subcommandArgs.length === 0) {
215
+ logger.debug("No subcommand provided for docker compose");
216
+ return null;
119
217
  }
120
- const serviceNames = Array.from(serviceNamesSet);
218
+ const composeFiles = resolveComposeFiles(userFiles.length > 0 ? userFiles : void 0);
219
+ if (!composeFiles) {
220
+ return null;
221
+ }
222
+ const serviceNames = collectServices(composeFiles);
121
223
  if (serviceNames.length === 0) {
122
224
  logger.debug("No services found in compose file(s)");
123
225
  return null;
@@ -125,8 +227,9 @@ function detectDockerCompose() {
125
227
  logger.debug(`Found ${serviceNames.length} service(s): ${serviceNames.join(", ")}`);
126
228
  return {
127
229
  composeFiles,
128
- command: compose.command,
129
- serviceNames
230
+ command,
231
+ serviceNames,
232
+ subcommandArgs
130
233
  };
131
234
  }
132
235
  export {
@@ -135,6 +238,8 @@ export {
135
238
  DOCKER_MIN_VERSION,
136
239
  buildDockerComposeCommand,
137
240
  detectDocker,
138
- detectDockerCompose
241
+ detectDockerCompose,
242
+ parseExplicitDockerCompose,
243
+ prepareDockerComposeRun
139
244
  };
140
245
  //# sourceMappingURL=docker-compose.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"docker-compose.js","sources":["../../../src/server/utils/docker-compose.ts"],"sourcesContent":["import { execSync } from \"node:child_process\";\nimport semver from \"semver\";\nimport { stringify as stringifyYaml } from \"yaml\";\nimport { logger } from \"../logger.ts\";\nimport {\n findComposeFile,\n findOverrideFile,\n getComposeFilesFromEnv,\n getDockerComposeServices,\n} from \"./docker-compose-parser.ts\";\n\n// minimum version of Docker required to use host.docker.internal on linux\n/// https://docs.docker.com/engine/release-notes/20.10/#bug-fixes-and-enhancements-1\nexport const DOCKER_MIN_VERSION = \"20.10.0\";\nexport const DOCKER_HOST_INTERNAL = \"host.docker.internal\";\nexport const DOCKER_HOST_GATEWAY = \"host-gateway\";\n\ninterface DockerComposeConfig {\n composeFiles: string[]; // Array of compose files\n command: string[];\n serviceNames: string[];\n}\n\n/**\n * Execute a command and return the output, or null if it fails\n */\nfunction tryExec(command: string): string | null {\n try {\n return execSync(command, { encoding: \"utf-8\", stdio: [\"pipe\", \"pipe\", \"pipe\"] }).trim();\n } catch {\n return null;\n }\n}\n\n/**\n * Detect if Docker is installed and check its version\n */\nexport function detectDocker(): { version: string; valid: boolean } | null {\n const version = tryExec(\"docker --version\");\n if (!version) {\n return null;\n }\n\n const match = version.match(/Docker version ([\\d.]+)/);\n if (!match) {\n return null;\n }\n\n const versionNumber = match[1];\n const valid = semver.gte(versionNumber, DOCKER_MIN_VERSION);\n\n return { version: versionNumber, valid };\n}\n\n/**\n * Detect which compose command to use and its version\n * Follows the logic from sentry/self-hosted\n */\nfunction detectComposeCommand(): { command: string[]; version: string } | null {\n const composePluginVersion = tryExec(\"docker compose version --short\");\n const composeStandaloneVersion = tryExec(\"docker-compose version --short\");\n\n if (!composePluginVersion && !composeStandaloneVersion) {\n return null;\n }\n\n if (!composePluginVersion) {\n return { command: [\"docker-compose\"], version: composeStandaloneVersion! };\n }\n\n if (!composeStandaloneVersion) {\n return { command: [\"docker\", \"compose\"], version: composePluginVersion! };\n }\n\n // Use standalone if it's newer, otherwise prefer plugin\n const pluginVer = composePluginVersion.replace(/^v/, \"\");\n const standaloneVer = composeStandaloneVersion.replace(/^v/, \"\");\n\n if (semver.gt(standaloneVer, pluginVer)) {\n return { command: [\"docker-compose\"], version: composeStandaloneVersion };\n }\n\n return { command: [\"docker\", \"compose\"], version: composePluginVersion };\n}\n\n/**\n * Generate the override YAML for injecting Spotlight environment variables\n */\nfunction generateSpotlightOverrideYaml(serviceNames: string[]): string {\n const services: Record<string, { environment: string[]; extra_hosts: string[] }> = {};\n // Pass environment variables without values to inherit from parent process (run.ts)\n // so the values set in run.ts are propagated correctly\n for (const serviceName of serviceNames) {\n services[serviceName] = {\n environment: [\"SENTRY_SPOTLIGHT\", \"NEXT_PUBLIC_SENTRY_SPOTLIGHT\", \"SENTRY_TRACES_SAMPLE_RATE\"],\n extra_hosts: [`${DOCKER_HOST_INTERNAL}:${DOCKER_HOST_GATEWAY}`],\n };\n }\n\n return stringifyYaml({ services });\n}\n\n/**\n * Build the Docker Compose command with Spotlight environment injection\n */\nexport function buildDockerComposeCommand(config: DockerComposeConfig): {\n cmdArgs: string[];\n stdin: string;\n} {\n const cmdArgs = [...config.command];\n\n // Add -f for each compose file\n for (const file of config.composeFiles) {\n cmdArgs.push(\"-f\", file);\n }\n\n // Add our Spotlight override last\n cmdArgs.push(\"-f\", \"-\");\n cmdArgs.push(\"up\");\n\n const stdin = generateSpotlightOverrideYaml(config.serviceNames);\n\n return { cmdArgs, stdin };\n}\n\n/**\n * Detect and configure Docker Compose\n *\n * This function orchestrates the detection of Docker, Docker Compose,\n * compose files, and services to build a complete configuration.\n */\nexport function detectDockerCompose(): DockerComposeConfig | null {\n const docker = detectDocker();\n if (!docker) {\n logger.debug(\"Docker is not installed or not in PATH\");\n return null;\n }\n\n if (!docker.valid) {\n logger.error(`Docker version ${docker.version} does not meet the minimum required version ${DOCKER_MIN_VERSION}`);\n return null;\n }\n\n logger.debug(`Detected Docker version ${docker.version}`);\n\n const compose = detectComposeCommand();\n if (!compose) {\n logger.debug(\"Docker Compose is not installed or not in PATH\");\n return null;\n }\n\n logger.debug(`Detected Docker Compose version ${compose.version} (${compose.command.join(\" \")})`);\n\n // First check if COMPOSE_FILE env is set\n const composeFilesFromEnv = getComposeFilesFromEnv();\n let composeFiles: string[];\n\n if (composeFilesFromEnv) {\n // Use files from COMPOSE_FILE env variable\n composeFiles = composeFilesFromEnv;\n logger.debug(`Using COMPOSE_FILE environment variable: ${composeFiles.join(\", \")}`);\n } else {\n // Use existing findComposeFile() + findOverrideFile() logic\n const composeFile = findComposeFile();\n if (!composeFile) {\n logger.debug(\"No compose file found in current directory\");\n return null;\n }\n\n logger.debug(`Found compose file: ${composeFile}`);\n\n composeFiles = [composeFile];\n\n // Check for override file (only when COMPOSE_FILE is not set)\n const overrideFile = findOverrideFile(composeFile);\n if (overrideFile) {\n logger.debug(`Found override file: ${overrideFile}`);\n composeFiles.push(overrideFile);\n }\n }\n\n // Parse services from all compose files using the refactored function\n const serviceNamesSet = new Set<string>();\n for (const file of composeFiles) {\n const services = getDockerComposeServices(file);\n for (const service of services) {\n serviceNamesSet.add(service);\n }\n }\n\n const serviceNames = Array.from(serviceNamesSet);\n if (serviceNames.length === 0) {\n logger.debug(\"No services found in compose file(s)\");\n return null;\n }\n\n logger.debug(`Found ${serviceNames.length} service(s): ${serviceNames.join(\", \")}`);\n\n return {\n composeFiles,\n command: compose.command,\n serviceNames,\n };\n}\n"],"names":["stringifyYaml"],"mappings":"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"}
1
+ {"version":3,"file":"docker-compose.js","sources":["../../../src/server/utils/docker-compose.ts"],"sourcesContent":["import { execSync } from \"node:child_process\";\nimport semver from \"semver\";\nimport { stringify as stringifyYaml } from \"yaml\";\nimport { logger } from \"../logger.ts\";\nimport {\n findComposeFile,\n findOverrideFile,\n getComposeFilesFromEnv,\n getDockerComposeServices,\n} from \"./docker-compose-parser.ts\";\n\n// minimum version of Docker required to use host.docker.internal on linux\n/// https://docs.docker.com/engine/release-notes/20.10/#bug-fixes-and-enhancements-1\nexport const DOCKER_MIN_VERSION = \"20.10.0\";\nexport const DOCKER_HOST_INTERNAL = \"host.docker.internal\";\nexport const DOCKER_HOST_GATEWAY = \"host-gateway\";\n\ninterface DockerComposeConfig {\n composeFiles: string[]; // Array of compose files\n command: string[];\n serviceNames: string[];\n subcommandArgs: string[]; // Subcommand and its arguments (e.g., up -d --build, logs -f, exec web bash)\n}\n\n/**\n * Execute a command and return the output, or null if it fails\n */\nfunction tryExec(command: string): string | null {\n try {\n return execSync(command, { encoding: \"utf-8\", stdio: [\"pipe\", \"pipe\", \"pipe\"] }).trim();\n } catch {\n return null;\n }\n}\n\n/**\n * Detect if Docker is installed and check its version\n */\nexport function detectDocker(): { version: string; valid: boolean } | null {\n const version = tryExec(\"docker --version\");\n if (!version) {\n return null;\n }\n\n const match = version.match(/Docker version ([\\d.]+)/);\n if (!match) {\n return null;\n }\n\n const versionNumber = match[1];\n const valid = semver.gte(versionNumber, DOCKER_MIN_VERSION);\n\n return { version: versionNumber, valid };\n}\n\n/**\n * Validate Docker is installed and meets minimum version requirement.\n * Logs appropriate messages on failure.\n */\nfunction validateDocker(): boolean {\n const docker = detectDocker();\n if (!docker) {\n logger.debug(\"Docker is not installed or not in PATH\");\n return false;\n }\n\n if (!docker.valid) {\n logger.error(`Docker version ${docker.version} does not meet the minimum required version ${DOCKER_MIN_VERSION}`);\n return false;\n }\n\n logger.debug(`Detected Docker version ${docker.version}`);\n return true;\n}\n\n/**\n * Detect which compose command to use and its version\n * Follows the logic from sentry/self-hosted\n */\nfunction detectComposeCommand(): { command: string[]; version: string } | null {\n const composePluginVersion = tryExec(\"docker compose version --short\");\n const composeStandaloneVersion = tryExec(\"docker-compose version --short\");\n\n if (!composePluginVersion && !composeStandaloneVersion) {\n return null;\n }\n\n if (!composePluginVersion) {\n return { command: [\"docker-compose\"], version: composeStandaloneVersion! };\n }\n\n if (!composeStandaloneVersion) {\n return { command: [\"docker\", \"compose\"], version: composePluginVersion! };\n }\n\n // Use standalone if it's newer, otherwise prefer plugin\n const pluginVer = composePluginVersion.replace(/^v/, \"\");\n const standaloneVer = composeStandaloneVersion.replace(/^v/, \"\");\n\n if (semver.gt(standaloneVer, pluginVer)) {\n return { command: [\"docker-compose\"], version: composeStandaloneVersion };\n }\n\n return { command: [\"docker\", \"compose\"], version: composePluginVersion };\n}\n\n/**\n * Generate the override YAML for injecting Spotlight environment variables\n */\nfunction generateSpotlightOverrideYaml(serviceNames: string[]): string {\n const services: Record<string, { environment: string[]; extra_hosts: string[] }> = {};\n // Pass environment variables without values to inherit from parent process (run.ts)\n // so the values set in run.ts are propagated correctly\n for (const serviceName of serviceNames) {\n services[serviceName] = {\n environment: [\"SENTRY_SPOTLIGHT\", \"NEXT_PUBLIC_SENTRY_SPOTLIGHT\", \"SENTRY_TRACES_SAMPLE_RATE\"],\n extra_hosts: [`${DOCKER_HOST_INTERNAL}:${DOCKER_HOST_GATEWAY}`],\n };\n }\n\n return stringifyYaml({ services });\n}\n\n/**\n * Resolve compose files to use, with the following priority:\n * 1. User-specified files (from -f flags)\n * 2. COMPOSE_FILE environment variable\n * 3. Auto-detect compose file + override file\n */\nfunction resolveComposeFiles(userSpecifiedFiles?: string[]): string[] | null {\n if (userSpecifiedFiles && userSpecifiedFiles.length > 0) {\n logger.debug(`Using user-specified compose files: ${userSpecifiedFiles.join(\", \")}`);\n return userSpecifiedFiles;\n }\n\n const fromEnv = getComposeFilesFromEnv();\n if (fromEnv) {\n logger.debug(`Using COMPOSE_FILE environment variable: ${fromEnv.join(\", \")}`);\n return fromEnv;\n }\n\n const composeFile = findComposeFile();\n if (!composeFile) {\n logger.debug(\"No compose file found\");\n return null;\n }\n\n logger.debug(`Found compose file: ${composeFile}`);\n const files = [composeFile];\n\n const overrideFile = findOverrideFile(composeFile);\n if (overrideFile) {\n logger.debug(`Found override file: ${overrideFile}`);\n files.push(overrideFile);\n }\n\n return files;\n}\n\n/**\n * Collect and deduplicate service names from compose files\n */\nfunction collectServices(composeFiles: string[]): string[] {\n const serviceSet = new Set<string>();\n for (const file of composeFiles) {\n for (const service of getDockerComposeServices(file)) {\n serviceSet.add(service);\n }\n }\n return Array.from(serviceSet);\n}\n\nconst FILE_FLAGS = [\"-f\", \"--file\"];\n\n// Global flags that take a value (we need to skip over their values when finding the subcommand)\nconst FLAGS_WITH_VALUES = [\"-f\", \"--file\", \"-p\", \"--project-name\", \"--project-directory\", \"--env-file\", \"--profile\"];\n\n/**\n * Extract -f/--file flags from global options (before the subcommand).\n * Once we hit the first non-flag argument (the subcommand), everything passes through.\n * This prevents confusing `logs -f` (follow) with `-f file.yml` (compose file).\n */\nfunction parseComposeFlags(args: string[]): { files: string[]; remainingArgs: string[] } {\n const files: string[] = [];\n const remainingArgs: string[] = [];\n let parsingGlobalFlags = true;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n if (parsingGlobalFlags) {\n // Extract -f/--file flags\n if (FILE_FLAGS.includes(arg) && args[i + 1]) {\n files.push(args[++i]);\n continue;\n }\n\n const matchedFileFlag = FILE_FLAGS.find(flag => arg.startsWith(`${flag}=`));\n if (matchedFileFlag) {\n files.push(arg.slice(matchedFileFlag.length + 1));\n continue;\n }\n\n // Skip other global flags that take values (e.g., -p myproject)\n if (FLAGS_WITH_VALUES.includes(arg) && args[i + 1]) {\n remainingArgs.push(arg, args[++i]);\n continue;\n }\n\n const matchedValueFlag = FLAGS_WITH_VALUES.find(flag => arg.startsWith(`${flag}=`));\n if (matchedValueFlag) {\n remainingArgs.push(arg);\n continue;\n }\n\n // First non-flag argument is the subcommand - stop parsing global flags\n if (!arg.startsWith(\"-\")) {\n parsingGlobalFlags = false;\n }\n }\n\n remainingArgs.push(arg);\n }\n\n return { files, remainingArgs };\n}\n\n/**\n * Build the Docker Compose command with Spotlight environment injection\n */\nexport function buildDockerComposeCommand(config: DockerComposeConfig): {\n cmdArgs: string[];\n stdin: string;\n} {\n const cmdArgs = [...config.command];\n\n // Add -f for each compose file\n for (const file of config.composeFiles) {\n cmdArgs.push(\"-f\", file);\n }\n\n // Add our Spotlight override last\n cmdArgs.push(\"-f\", \"-\");\n\n // Add the subcommand and its arguments (e.g., up -d --build, logs -f)\n if (config.subcommandArgs && config.subcommandArgs.length > 0) {\n cmdArgs.push(...config.subcommandArgs);\n }\n\n const stdin = generateSpotlightOverrideYaml(config.serviceNames);\n\n return { cmdArgs, stdin };\n}\n\n/**\n * Prepare Docker Compose run by configuring environment and building command\n *\n * This helper sets up the SENTRY_SPOTLIGHT URL to use host.docker.internal\n * (so containers can reach the host machine), builds the compose command,\n * and removes COMPOSE_FILE from env to avoid conflicts with explicit -f flags.\n */\nexport function prepareDockerComposeRun(\n config: DockerComposeConfig,\n serverPort: number,\n env: Record<string, string | undefined>,\n): { cmdArgs: string[]; stdin: string } {\n env.SENTRY_SPOTLIGHT = `http://${DOCKER_HOST_INTERNAL}:${serverPort}/stream`;\n const command = buildDockerComposeCommand(config);\n // biome-ignore lint/performance/noDelete: need to remove env var entirely\n delete env.COMPOSE_FILE;\n return command;\n}\n\n/**\n * Detect and configure Docker Compose\n *\n * This function orchestrates the detection of Docker, Docker Compose,\n * compose files, and services to build a complete configuration.\n */\nexport function detectDockerCompose(): DockerComposeConfig | null {\n if (!validateDocker()) {\n return null;\n }\n\n const compose = detectComposeCommand();\n if (!compose) {\n logger.debug(\"Docker Compose is not installed or not in PATH\");\n return null;\n }\n\n logger.debug(`Detected Docker Compose version ${compose.version} (${compose.command.join(\" \")})`);\n\n const composeFiles = resolveComposeFiles();\n if (!composeFiles) {\n return null;\n }\n\n const serviceNames = collectServices(composeFiles);\n if (serviceNames.length === 0) {\n logger.debug(\"No services found in compose file(s)\");\n return null;\n }\n\n logger.debug(`Found ${serviceNames.length} service(s): ${serviceNames.join(\", \")}`);\n\n return {\n composeFiles,\n command: compose.command,\n serviceNames,\n subcommandArgs: [\"up\"], // Default to 'up' when auto-detecting\n };\n}\n\n/**\n * Parse an explicit Docker Compose command from cmdArgs\n *\n * This handles cases where the user runs:\n * - `spotlight run docker compose up -d`\n * - `spotlight run docker-compose logs -f`\n * - `spotlight run docker compose -f custom.yml exec web bash`\n *\n * Returns a DockerComposeConfig if the command is a docker compose command,\n * null otherwise.\n */\nexport function parseExplicitDockerCompose(cmdArgs: string[]): DockerComposeConfig | null {\n if (cmdArgs.length < 2) {\n return null;\n }\n\n let command: string[];\n let argsStartIndex: number;\n\n if (cmdArgs[0] === \"docker-compose\") {\n command = [\"docker-compose\"];\n argsStartIndex = 1;\n } else if (cmdArgs[0] === \"docker\" && cmdArgs[1] === \"compose\") {\n command = [\"docker\", \"compose\"];\n argsStartIndex = 2;\n } else {\n return null;\n }\n\n // Validate Docker version (required for host.docker.internal on Linux)\n if (!validateDocker()) {\n return null;\n }\n\n const argsAfterCommand = cmdArgs.slice(argsStartIndex);\n const { files: userFiles, remainingArgs: subcommandArgs } = parseComposeFlags(argsAfterCommand);\n\n if (subcommandArgs.length === 0) {\n logger.debug(\"No subcommand provided for docker compose\");\n return null;\n }\n\n const composeFiles = resolveComposeFiles(userFiles.length > 0 ? userFiles : undefined);\n if (!composeFiles) {\n return null;\n }\n\n const serviceNames = collectServices(composeFiles);\n if (serviceNames.length === 0) {\n logger.debug(\"No services found in compose file(s)\");\n return null;\n }\n\n logger.debug(`Found ${serviceNames.length} service(s): ${serviceNames.join(\", \")}`);\n\n return {\n composeFiles,\n command,\n serviceNames,\n subcommandArgs,\n };\n}\n"],"names":["stringifyYaml"],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  export declare const withTracing: (fn: CallableFunction, spanArgs?: {}) => (...args: unknown[]) => any;
2
2
  export declare const getSpotlightURL: (port: number, host?: string) => string;
3
+ export declare function getSpotlightWebUrl(port: number): string;
3
4
  export declare function logSpotlightUrl(port: number): void;
5
+ export declare function openInBrowser(port: number): void;
4
6
  export declare const isValidPort: (...args: unknown[]) => any;
5
7
  export declare const isSidecarRunning: (...args: unknown[]) => any;
@@ -2,10 +2,11 @@
2
2
  !function() {
3
3
  try {
4
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] = "7395028c-d1eb-42b4-a00d-6217acb41881", e._sentryDebugIdIdentifier = "sentry-dbid-7395028c-d1eb-42b4-a00d-6217acb41881");
5
+ n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "31184761-c651-48ef-9588-a8b09ee4f592", e._sentryDebugIdIdentifier = "sentry-dbid-31184761-c651-48ef-9588-a8b09ee4f592");
6
6
  } catch (e2) {
7
7
  }
8
8
  }();
9
+ import { spawn } from "node:child_process";
9
10
  import { get } from "node:http";
10
11
  import { startSpan } from "@sentry/node";
11
12
  import { SERVER_IDENTIFIER } from "../constants.js";
@@ -13,8 +14,32 @@ import { logger } from "../logger.js";
13
14
  import "../../_virtual/_sentry-release-injection-file.js";
14
15
  const withTracing = (fn, spanArgs = {}) => (...args) => startSpan({ name: fn.name, ...spanArgs }, () => fn(...args));
15
16
  const getSpotlightURL = (port, host = "localhost") => `http://${host}:${port}/stream`;
17
+ function getSpotlightWebUrl(port) {
18
+ return `http://localhost:${port}`;
19
+ }
16
20
  function logSpotlightUrl(port) {
17
- logger.info(`Open http://localhost:${port} to see the Spotlight UI`);
21
+ logger.info(`Open ${getSpotlightWebUrl(port)} to see the Spotlight UI`);
22
+ }
23
+ function openInBrowser(port) {
24
+ const url = getSpotlightWebUrl(port);
25
+ const platform = process.platform;
26
+ let cmd;
27
+ let args;
28
+ if (platform === "darwin") {
29
+ cmd = "open";
30
+ args = [url];
31
+ } else if (platform === "win32") {
32
+ cmd = "cmd";
33
+ args = ["/c", "start", "", url];
34
+ } else {
35
+ cmd = "xdg-open";
36
+ args = [url];
37
+ }
38
+ const child = spawn(cmd, args, { detached: true, stdio: "ignore" });
39
+ child.on("error", (err) => {
40
+ logger.debug(`Failed to open browser: ${err.message}`);
41
+ });
42
+ child.unref();
18
43
  }
19
44
  const isValidPort = withTracing(
20
45
  (value) => {
@@ -64,9 +89,11 @@ const isSidecarRunning = withTracing(
64
89
  );
65
90
  export {
66
91
  getSpotlightURL,
92
+ getSpotlightWebUrl,
67
93
  isSidecarRunning,
68
94
  isValidPort,
69
95
  logSpotlightUrl,
96
+ openInBrowser,
70
97
  withTracing
71
98
  };
72
99
  //# sourceMappingURL=extras.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"extras.js","sources":["../../../src/server/utils/extras.ts"],"sourcesContent":["import { get } from \"node:http\";\nimport { startSpan } from \"@sentry/node\";\nimport { SERVER_IDENTIFIER } from \"../constants.ts\";\nimport { logger } from \"../logger.ts\";\n\nexport const withTracing =\n (fn: CallableFunction, spanArgs = {}) =>\n (...args: unknown[]) =>\n startSpan({ name: fn.name, ...spanArgs }, () => fn(...args));\n\nexport const getSpotlightURL = (port: number, host = \"localhost\") => `http://${host}:${port}/stream`;\n\nexport function logSpotlightUrl(port: number): void {\n logger.info(`Open http://localhost:${port} to see the Spotlight UI`);\n}\n\nexport const isValidPort = withTracing(\n (value: string | number) => {\n if (typeof value === \"string\") {\n const portNumber = Number(value);\n return /^\\d+$/.test(value) && portNumber > 0 && portNumber <= 65535;\n }\n return value > 0 && value <= 65535;\n },\n { name: \"isValidPort\", op: \"sidecar.server.portCheck\" },\n);\n\nexport const isSidecarRunning = withTracing(\n (port: string | number | undefined) =>\n new Promise(_resolve => {\n logger.debug(`Checking if we are already running on port ${port}`);\n const options = {\n hostname: \"localhost\",\n port: port,\n path: \"/health\",\n method: \"GET\",\n // This is only the socket timeout so set up\n // a connection timeout below manually\n timeout: 1000,\n headers: { Connection: \"close\" },\n };\n\n let timeoutId: NodeJS.Timeout | null = null;\n const healthReq = get(options, res => {\n const serverIdentifier = res.headers[\"x-powered-by\"];\n resolve(serverIdentifier === SERVER_IDENTIFIER);\n });\n const destroyHealthReq = () => !healthReq.destroyed && healthReq.destroy(new Error(\"Request timed out.\"));\n function resolve(value: boolean) {\n process.off(\"SIGINT\", destroyHealthReq);\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n _resolve(value);\n }\n process.on(\"SIGINT\", destroyHealthReq);\n timeoutId = setTimeout(destroyHealthReq, 2000);\n timeoutId.unref();\n healthReq.on(\"error\", () => {\n resolve(false);\n });\n healthReq.end();\n }),\n { name: \"isSidecarRunning\", op: \"sidecar.server.collideCheck\" },\n);\n"],"names":[],"mappings":";;;;;;;;;;;;;AAKO,MAAM,cACX,CAAC,IAAsB,WAAW,CAAA,MAClC,IAAI,SACF,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAA,GAAY,MAAM,GAAG,GAAG,IAAI,CAAC;AAExD,MAAM,kBAAkB,CAAC,MAAc,OAAO,gBAAgB,UAAU,IAAI,IAAI,IAAI;AAEpF,SAAS,gBAAgB,MAAoB;AAClD,SAAO,KAAK,yBAAyB,IAAI,0BAA0B;AACrE;AAEO,MAAM,cAAc;AAAA,EACzB,CAAC,UAA2B;AAC1B,QAAI,OAAO,UAAU,UAAU;AAC7B,YAAM,aAAa,OAAO,KAAK;AAC/B,aAAO,QAAQ,KAAK,KAAK,KAAK,aAAa,KAAK,cAAc;AAAA,IAChE;AACA,WAAO,QAAQ,KAAK,SAAS;AAAA,EAC/B;AAAA,EACA,EAAE,MAAM,eAAe,IAAI,2BAAA;AAC7B;AAEO,MAAM,mBAAmB;AAAA,EAC9B,CAAC,SACC,IAAI,QAAQ,CAAA,aAAY;AACtB,WAAO,MAAM,8CAA8C,IAAI,EAAE;AACjE,UAAM,UAAU;AAAA,MACd,UAAU;AAAA,MACV;AAAA,MACA,MAAM;AAAA,MACN,QAAQ;AAAA;AAAA;AAAA,MAGR,SAAS;AAAA,MACT,SAAS,EAAE,YAAY,QAAA;AAAA,IAAQ;AAGjC,QAAI,YAAmC;AACvC,UAAM,YAAY,IAAI,SAAS,CAAA,QAAO;AACpC,YAAM,mBAAmB,IAAI,QAAQ,cAAc;AACnD,cAAQ,qBAAqB,iBAAiB;AAAA,IAChD,CAAC;AACD,UAAM,mBAAmB,MAAM,CAAC,UAAU,aAAa,UAAU,QAAQ,IAAI,MAAM,oBAAoB,CAAC;AACxG,aAAS,QAAQ,OAAgB;AAC/B,cAAQ,IAAI,UAAU,gBAAgB;AACtC,UAAI,WAAW;AACb,qBAAa,SAAS;AAAA,MACxB;AACA,eAAS,KAAK;AAAA,IAChB;AACA,YAAQ,GAAG,UAAU,gBAAgB;AACrC,gBAAY,WAAW,kBAAkB,GAAI;AAC7C,cAAU,MAAA;AACV,cAAU,GAAG,SAAS,MAAM;AAC1B,cAAQ,KAAK;AAAA,IACf,CAAC;AACD,cAAU,IAAA;AAAA,EACZ,CAAC;AAAA,EACH,EAAE,MAAM,oBAAoB,IAAI,8BAAA;AAClC;"}
1
+ {"version":3,"file":"extras.js","sources":["../../../src/server/utils/extras.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport { get } from \"node:http\";\nimport { startSpan } from \"@sentry/node\";\nimport { SERVER_IDENTIFIER } from \"../constants.ts\";\nimport { logger } from \"../logger.ts\";\n\nexport const withTracing =\n (fn: CallableFunction, spanArgs = {}) =>\n (...args: unknown[]) =>\n startSpan({ name: fn.name, ...spanArgs }, () => fn(...args));\n\nexport const getSpotlightURL = (port: number, host = \"localhost\") => `http://${host}:${port}/stream`;\n\nexport function getSpotlightWebUrl(port: number): string {\n return `http://localhost:${port}`;\n}\n\nexport function logSpotlightUrl(port: number): void {\n logger.info(`Open ${getSpotlightWebUrl(port)} to see the Spotlight UI`);\n}\n\nexport function openInBrowser(port: number): void {\n const url = getSpotlightWebUrl(port);\n const platform = process.platform;\n\n let cmd: string;\n let args: string[];\n\n if (platform === \"darwin\") {\n cmd = \"open\";\n args = [url];\n } else if (platform === \"win32\") {\n cmd = \"cmd\";\n args = [\"/c\", \"start\", \"\", url];\n } else {\n cmd = \"xdg-open\";\n args = [url];\n }\n\n const child = spawn(cmd, args, { detached: true, stdio: \"ignore\" });\n // Handle spawn errors gracefully (e.g., command not found in minimal environments)\n child.on(\"error\", err => {\n logger.debug(`Failed to open browser: ${err.message}`);\n });\n child.unref();\n}\n\nexport const isValidPort = withTracing(\n (value: string | number) => {\n if (typeof value === \"string\") {\n const portNumber = Number(value);\n return /^\\d+$/.test(value) && portNumber > 0 && portNumber <= 65535;\n }\n return value > 0 && value <= 65535;\n },\n { name: \"isValidPort\", op: \"sidecar.server.portCheck\" },\n);\n\nexport const isSidecarRunning = withTracing(\n (port: string | number | undefined) =>\n new Promise(_resolve => {\n logger.debug(`Checking if we are already running on port ${port}`);\n const options = {\n hostname: \"localhost\",\n port: port,\n path: \"/health\",\n method: \"GET\",\n // This is only the socket timeout so set up\n // a connection timeout below manually\n timeout: 1000,\n headers: { Connection: \"close\" },\n };\n\n let timeoutId: NodeJS.Timeout | null = null;\n const healthReq = get(options, res => {\n const serverIdentifier = res.headers[\"x-powered-by\"];\n resolve(serverIdentifier === SERVER_IDENTIFIER);\n });\n const destroyHealthReq = () => !healthReq.destroyed && healthReq.destroy(new Error(\"Request timed out.\"));\n function resolve(value: boolean) {\n process.off(\"SIGINT\", destroyHealthReq);\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n _resolve(value);\n }\n process.on(\"SIGINT\", destroyHealthReq);\n timeoutId = setTimeout(destroyHealthReq, 2000);\n timeoutId.unref();\n healthReq.on(\"error\", () => {\n resolve(false);\n });\n healthReq.end();\n }),\n { name: \"isSidecarRunning\", op: \"sidecar.server.collideCheck\" },\n);\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAMO,MAAM,cACX,CAAC,IAAsB,WAAW,CAAA,MAClC,IAAI,SACF,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAA,GAAY,MAAM,GAAG,GAAG,IAAI,CAAC;AAExD,MAAM,kBAAkB,CAAC,MAAc,OAAO,gBAAgB,UAAU,IAAI,IAAI,IAAI;AAEpF,SAAS,mBAAmB,MAAsB;AACvD,SAAO,oBAAoB,IAAI;AACjC;AAEO,SAAS,gBAAgB,MAAoB;AAClD,SAAO,KAAK,QAAQ,mBAAmB,IAAI,CAAC,0BAA0B;AACxE;AAEO,SAAS,cAAc,MAAoB;AAChD,QAAM,MAAM,mBAAmB,IAAI;AACnC,QAAM,WAAW,QAAQ;AAEzB,MAAI;AACJ,MAAI;AAEJ,MAAI,aAAa,UAAU;AACzB,UAAM;AACN,WAAO,CAAC,GAAG;AAAA,EACb,WAAW,aAAa,SAAS;AAC/B,UAAM;AACN,WAAO,CAAC,MAAM,SAAS,IAAI,GAAG;AAAA,EAChC,OAAO;AACL,UAAM;AACN,WAAO,CAAC,GAAG;AAAA,EACb;AAEA,QAAM,QAAQ,MAAM,KAAK,MAAM,EAAE,UAAU,MAAM,OAAO,UAAU;AAElE,QAAM,GAAG,SAAS,CAAA,QAAO;AACvB,WAAO,MAAM,2BAA2B,IAAI,OAAO,EAAE;AAAA,EACvD,CAAC;AACD,QAAM,MAAA;AACR;AAEO,MAAM,cAAc;AAAA,EACzB,CAAC,UAA2B;AAC1B,QAAI,OAAO,UAAU,UAAU;AAC7B,YAAM,aAAa,OAAO,KAAK;AAC/B,aAAO,QAAQ,KAAK,KAAK,KAAK,aAAa,KAAK,cAAc;AAAA,IAChE;AACA,WAAO,QAAQ,KAAK,SAAS;AAAA,EAC/B;AAAA,EACA,EAAE,MAAM,eAAe,IAAI,2BAAA;AAC7B;AAEO,MAAM,mBAAmB;AAAA,EAC9B,CAAC,SACC,IAAI,QAAQ,CAAA,aAAY;AACtB,WAAO,MAAM,8CAA8C,IAAI,EAAE;AACjE,UAAM,UAAU;AAAA,MACd,UAAU;AAAA,MACV;AAAA,MACA,MAAM;AAAA,MACN,QAAQ;AAAA;AAAA;AAAA,MAGR,SAAS;AAAA,MACT,SAAS,EAAE,YAAY,QAAA;AAAA,IAAQ;AAGjC,QAAI,YAAmC;AACvC,UAAM,YAAY,IAAI,SAAS,CAAA,QAAO;AACpC,YAAM,mBAAmB,IAAI,QAAQ,cAAc;AACnD,cAAQ,qBAAqB,iBAAiB;AAAA,IAChD,CAAC;AACD,UAAM,mBAAmB,MAAM,CAAC,UAAU,aAAa,UAAU,QAAQ,IAAI,MAAM,oBAAoB,CAAC;AACxG,aAAS,QAAQ,OAAgB;AAC/B,cAAQ,IAAI,UAAU,gBAAgB;AACtC,UAAI,WAAW;AACb,qBAAa,SAAS;AAAA,MACxB;AACA,eAAS,KAAK;AAAA,IAChB;AACA,YAAQ,GAAG,UAAU,gBAAgB;AACrC,gBAAY,WAAW,kBAAkB,GAAI;AAC7C,cAAU,MAAA;AACV,cAAU,GAAG,SAAS,MAAM;AAC1B,cAAQ,KAAK;AAAA,IACf,CAAC;AACD,cAAU,IAAA;AAAA,EACZ,CAAC;AAAA,EACH,EAAE,MAAM,oBAAoB,IAAI,8BAAA;AAClC;"}