@morsehq-dev/sdk 0.4.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +294 -0
  3. package/dist/anthropic/index.cjs +39 -0
  4. package/dist/anthropic/index.cjs.map +1 -0
  5. package/dist/anthropic/index.d.cts +213 -0
  6. package/dist/anthropic/index.d.ts +213 -0
  7. package/dist/anthropic/index.js +6 -0
  8. package/dist/anthropic/index.js.map +1 -0
  9. package/dist/anthropic-agent-sdk/index.cjs +744 -0
  10. package/dist/anthropic-agent-sdk/index.cjs.map +1 -0
  11. package/dist/anthropic-agent-sdk/index.d.cts +371 -0
  12. package/dist/anthropic-agent-sdk/index.d.ts +371 -0
  13. package/dist/anthropic-agent-sdk/index.js +735 -0
  14. package/dist/anthropic-agent-sdk/index.js.map +1 -0
  15. package/dist/browser/anthropic/index.cjs +39 -0
  16. package/dist/browser/anthropic/index.cjs.map +1 -0
  17. package/dist/browser/anthropic/index.js +6 -0
  18. package/dist/browser/anthropic/index.js.map +1 -0
  19. package/dist/browser/anthropic-agent-sdk/index.cjs +744 -0
  20. package/dist/browser/anthropic-agent-sdk/index.cjs.map +1 -0
  21. package/dist/browser/anthropic-agent-sdk/index.js +735 -0
  22. package/dist/browser/anthropic-agent-sdk/index.js.map +1 -0
  23. package/dist/browser/chunk-3643DC7K.cjs +365 -0
  24. package/dist/browser/chunk-3643DC7K.cjs.map +1 -0
  25. package/dist/browser/chunk-4FALQMOZ.js +232 -0
  26. package/dist/browser/chunk-4FALQMOZ.js.map +1 -0
  27. package/dist/browser/chunk-5J2QBK75.js +884 -0
  28. package/dist/browser/chunk-5J2QBK75.js.map +1 -0
  29. package/dist/browser/chunk-7MSXWGAH.js +53 -0
  30. package/dist/browser/chunk-7MSXWGAH.js.map +1 -0
  31. package/dist/browser/chunk-A24L5N5N.js +596 -0
  32. package/dist/browser/chunk-A24L5N5N.js.map +1 -0
  33. package/dist/browser/chunk-B7DEUDP6.cjs +177 -0
  34. package/dist/browser/chunk-B7DEUDP6.cjs.map +1 -0
  35. package/dist/browser/chunk-F6CJACNH.cjs +604 -0
  36. package/dist/browser/chunk-F6CJACNH.cjs.map +1 -0
  37. package/dist/browser/chunk-JBOYFQSB.js +412 -0
  38. package/dist/browser/chunk-JBOYFQSB.js.map +1 -0
  39. package/dist/browser/chunk-KRBADE6R.cjs +183 -0
  40. package/dist/browser/chunk-KRBADE6R.cjs.map +1 -0
  41. package/dist/browser/chunk-MCJYZH6W.cjs +415 -0
  42. package/dist/browser/chunk-MCJYZH6W.cjs.map +1 -0
  43. package/dist/browser/chunk-NQG2IAQS.js +178 -0
  44. package/dist/browser/chunk-NQG2IAQS.js.map +1 -0
  45. package/dist/browser/chunk-O4HG3OSK.cjs +929 -0
  46. package/dist/browser/chunk-O4HG3OSK.cjs.map +1 -0
  47. package/dist/browser/chunk-QWRQJO57.js +363 -0
  48. package/dist/browser/chunk-QWRQJO57.js.map +1 -0
  49. package/dist/browser/chunk-SWQOPFE4.cjs +234 -0
  50. package/dist/browser/chunk-SWQOPFE4.cjs.map +1 -0
  51. package/dist/browser/chunk-TYDG747E.js +171 -0
  52. package/dist/browser/chunk-TYDG747E.js.map +1 -0
  53. package/dist/browser/chunk-TZRSDDFP.cjs +56 -0
  54. package/dist/browser/chunk-TZRSDDFP.cjs.map +1 -0
  55. package/dist/browser/index.cjs +587 -0
  56. package/dist/browser/index.cjs.map +1 -0
  57. package/dist/browser/index.js +522 -0
  58. package/dist/browser/index.js.map +1 -0
  59. package/dist/browser/integrations/pino.cjs +89 -0
  60. package/dist/browser/integrations/pino.cjs.map +1 -0
  61. package/dist/browser/integrations/pino.js +86 -0
  62. package/dist/browser/integrations/pino.js.map +1 -0
  63. package/dist/browser/langchain/index.cjs +535 -0
  64. package/dist/browser/langchain/index.cjs.map +1 -0
  65. package/dist/browser/langchain/index.js +528 -0
  66. package/dist/browser/langchain/index.js.map +1 -0
  67. package/dist/browser/langgraph/index.cjs +377 -0
  68. package/dist/browser/langgraph/index.cjs.map +1 -0
  69. package/dist/browser/langgraph/index.js +371 -0
  70. package/dist/browser/langgraph/index.js.map +1 -0
  71. package/dist/browser/openai/index.cjs +125 -0
  72. package/dist/browser/openai/index.cjs.map +1 -0
  73. package/dist/browser/openai/index.js +122 -0
  74. package/dist/browser/openai/index.js.map +1 -0
  75. package/dist/browser/openai-agents/index.cjs +689 -0
  76. package/dist/browser/openai-agents/index.cjs.map +1 -0
  77. package/dist/browser/openai-agents/index.js +678 -0
  78. package/dist/browser/openai-agents/index.js.map +1 -0
  79. package/dist/browser/vercel-ai/index.cjs +233 -0
  80. package/dist/browser/vercel-ai/index.cjs.map +1 -0
  81. package/dist/browser/vercel-ai/index.js +231 -0
  82. package/dist/browser/vercel-ai/index.js.map +1 -0
  83. package/dist/chunk-4R4SHGOK.js +363 -0
  84. package/dist/chunk-4R4SHGOK.js.map +1 -0
  85. package/dist/chunk-7EO7MQBA.cjs +183 -0
  86. package/dist/chunk-7EO7MQBA.cjs.map +1 -0
  87. package/dist/chunk-7YCENA54.cjs +604 -0
  88. package/dist/chunk-7YCENA54.cjs.map +1 -0
  89. package/dist/chunk-CKFOGDUF.js +596 -0
  90. package/dist/chunk-CKFOGDUF.js.map +1 -0
  91. package/dist/chunk-FJUNILZT.cjs +1324 -0
  92. package/dist/chunk-FJUNILZT.cjs.map +1 -0
  93. package/dist/chunk-HDAFUKQ3.js +171 -0
  94. package/dist/chunk-HDAFUKQ3.js.map +1 -0
  95. package/dist/chunk-KBWPNIH4.cjs +234 -0
  96. package/dist/chunk-KBWPNIH4.cjs.map +1 -0
  97. package/dist/chunk-KJEO52QS.cjs +365 -0
  98. package/dist/chunk-KJEO52QS.cjs.map +1 -0
  99. package/dist/chunk-KZBCOZIQ.cjs +177 -0
  100. package/dist/chunk-KZBCOZIQ.cjs.map +1 -0
  101. package/dist/chunk-ME5JALGT.js +53 -0
  102. package/dist/chunk-ME5JALGT.js.map +1 -0
  103. package/dist/chunk-PVHDEPRE.cjs +56 -0
  104. package/dist/chunk-PVHDEPRE.cjs.map +1 -0
  105. package/dist/chunk-RTL23YOQ.js +178 -0
  106. package/dist/chunk-RTL23YOQ.js.map +1 -0
  107. package/dist/chunk-TQWI4UYO.js +1277 -0
  108. package/dist/chunk-TQWI4UYO.js.map +1 -0
  109. package/dist/chunk-VXDBDPDR.cjs +415 -0
  110. package/dist/chunk-VXDBDPDR.cjs.map +1 -0
  111. package/dist/chunk-XTKMUJWI.js +232 -0
  112. package/dist/chunk-XTKMUJWI.js.map +1 -0
  113. package/dist/chunk-ZKUGOWER.js +412 -0
  114. package/dist/chunk-ZKUGOWER.js.map +1 -0
  115. package/dist/index.cjs +843 -0
  116. package/dist/index.cjs.map +1 -0
  117. package/dist/index.d.cts +464 -0
  118. package/dist/index.d.ts +464 -0
  119. package/dist/index.js +778 -0
  120. package/dist/index.js.map +1 -0
  121. package/dist/integrations/pino.cjs +89 -0
  122. package/dist/integrations/pino.cjs.map +1 -0
  123. package/dist/integrations/pino.d.cts +65 -0
  124. package/dist/integrations/pino.d.ts +65 -0
  125. package/dist/integrations/pino.js +86 -0
  126. package/dist/integrations/pino.js.map +1 -0
  127. package/dist/langchain/index.cjs +535 -0
  128. package/dist/langchain/index.cjs.map +1 -0
  129. package/dist/langchain/index.d.cts +265 -0
  130. package/dist/langchain/index.d.ts +265 -0
  131. package/dist/langchain/index.js +528 -0
  132. package/dist/langchain/index.js.map +1 -0
  133. package/dist/langgraph/index.cjs +377 -0
  134. package/dist/langgraph/index.cjs.map +1 -0
  135. package/dist/langgraph/index.d.cts +324 -0
  136. package/dist/langgraph/index.d.ts +324 -0
  137. package/dist/langgraph/index.js +371 -0
  138. package/dist/langgraph/index.js.map +1 -0
  139. package/dist/openai/index.cjs +125 -0
  140. package/dist/openai/index.cjs.map +1 -0
  141. package/dist/openai/index.d.cts +136 -0
  142. package/dist/openai/index.d.ts +136 -0
  143. package/dist/openai/index.js +122 -0
  144. package/dist/openai/index.js.map +1 -0
  145. package/dist/openai-agents/index.cjs +689 -0
  146. package/dist/openai-agents/index.cjs.map +1 -0
  147. package/dist/openai-agents/index.d.cts +502 -0
  148. package/dist/openai-agents/index.d.ts +502 -0
  149. package/dist/openai-agents/index.js +678 -0
  150. package/dist/openai-agents/index.js.map +1 -0
  151. package/dist/spans-DZtMuBvc.d.cts +73 -0
  152. package/dist/spans-DZtMuBvc.d.ts +73 -0
  153. package/dist/tracing-BYAqjT5Q.d.cts +114 -0
  154. package/dist/tracing-rz9cWQ8d.d.ts +114 -0
  155. package/dist/vercel-ai/index.cjs +233 -0
  156. package/dist/vercel-ai/index.cjs.map +1 -0
  157. package/dist/vercel-ai/index.d.cts +93 -0
  158. package/dist/vercel-ai/index.d.ts +93 -0
  159. package/dist/vercel-ai/index.js +231 -0
  160. package/dist/vercel-ai/index.js.map +1 -0
  161. package/package.json +182 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/_internal/sentry-reporter.ts","../src/_internal/errors.ts"],"names":[],"mappings":";;;AA0BA,QAAA,EAAA;AAWA,IAAM,UAAA,GACJ,iGAAA;AAGF,IAAM,iBAAiB,EAAA,GAAK,GAAA;AAC5B,IAAM,qBAAA,GAAwB,GAAA;AAE9B,IAAM,WAAA,uBAAyC,GAAA,EAAI;AAKnD,IAAI,OAAA,GAA4B,IAAA;AAChC,IAAI,gBAAA,GAAmB,KAAA;AAEvB,IAAM,eAAA,uBAA2C,GAAA,CAAI;AAAA,EACnD,SAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,SAAS,eAAe,WAAA,EAA8B;AACpD,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,EAAA,MAAM,SAAS,GAAA,GAAM,cAAA;AACrB,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,GAAA,CAAI,WAAW,KAAK,EAAC;AAGhD,EAAA,OAAO,OAAO,MAAA,GAAS,CAAA,IAAM,MAAA,CAAO,CAAC,IAAe,MAAA,EAAQ;AAC1D,IAAA,MAAA,CAAO,KAAA,EAAM;AAAA,EACf;AACA,EAAA,IAAI,MAAA,CAAO,UAAU,qBAAA,EAAuB;AAC1C,IAAA,WAAA,CAAY,GAAA,CAAI,aAAa,MAAM,CAAA;AACnC,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AACf,EAAA,WAAA,CAAY,GAAA,CAAI,aAAa,MAAM,CAAA;AACnC,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,WAAW,KAAA,EAAqE;AACvF,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC1C,IAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAA,EAAG;AAC1B,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AAAA,IACX;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAaA,eAAe,YAAA,GAA0C;AAEvD,EAAA,IAAI,OAAA,KAAY,MAAM,OAAO,OAAA;AAC7B,EAAA,IAAI,kBAAkB,OAAO,IAAA;AAC7B,EAAA,IAAI;AAGF,IAAA,IAAI,GAAA,GAAe,IAAA;AACnB,IAAA,IAAI,MAAA,GAAS,IAAA;AACb,IAAA,IAAI;AAEF,MAAA,GAAA,GAAM,MAAO,QAAA,CAAS,GAAA,EAAK,kBAAkB,EAAU,cAAc,CAAA;AAAA,IACvE,CAAA,CAAA,MAAQ;AACN,MAAA,IAAI;AAEF,QAAA,GAAA,GAAM,MAAO,QAAA,CAAS,GAAA,EAAK,kBAAkB,EAAU,iBAAiB,CAAA;AACxE,QAAA,MAAA,GAAS,KAAA;AAAA,MACX,CAAA,CAAA,MAAQ;AACN,QAAA,gBAAA,GAAmB,IAAA;AACnB,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,gBAAA,GAAmB,IAAA;AACnB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAA,GAAS,GAAA;AAEf,IAAA,MAAM,UAAA,GAAa,MAAA,GAAS,MAAA,CAAO,UAAA,GAAa,MAAA,CAAO,aAAA;AACvD,IAAA,MAAM,SAAA,GAAY,MAAA,GAAS,MAAA,CAAO,iBAAA,GAAoB,MAAA,CAAO,kBAAA;AAC7D,IAAA,IAAI,OAAO,UAAA,KAAe,UAAA,IAAc,OAAO,cAAc,UAAA,EAAY;AACvE,MAAA,gBAAA,GAAmB,IAAA;AACnB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW;AAAA,MAC5B,GAAA,EAAK,UAAA;AAAA,MACL,SAAA;AAAA,MACA,aAAa,MAAA,CAAO,kBAAA;AAAA;AAAA;AAAA;AAAA,MAIpB,cAAc,EAAC;AAAA,MACf,gBAAA,EAAkB,CAAA;AAAA,MAClB,mBAAA,EAAqB,KAAA;AAAA,MACrB,cAAA,EAAgB,KAAA;AAAA;AAAA,MAEhB,cAAA,EAAgB;AAAA,KACjB,CAAA;AACD,IAAA,IAAI,OAAO,MAAA,CAAO,IAAA,KAAS,UAAA,SAAmB,IAAA,EAAK;AAEnD,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,MAAA,EAAQ,MAAM,CAAA;AACzC,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,gBAAA,GAAmB,IAAA;AACnB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAA,GAAU,KAAA;AACV,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,gBAAA,GAAmB,IAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAYO,SAAS,YAAA,CAAa,QAAa,MAAA,EAA+B;AACvE,EAAA,IAAI,OAAO,MAAA,CAAO,KAAA,KAAU,cAAc,MAAA,CAAO,KAAA,CAAM,WAAW,SAAA,EAAW;AAE3E,IAAA,OAAO,CAAC,KAAA,EAAO,WAAA,EAAa,KAAA,KAAU;AACpC,MAAA,MAAM,KAAA,GAAQ,IAAI,MAAA,CAAO,KAAA,EAAM;AAC/B,MAAA,KAAA,CAAM,UAAU,MAAM,CAAA;AACtB,MAAA,KAAA,CAAM,cAAA,CAAe,CAAC,WAAW,CAAC,CAAA;AAClC,MAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG,KAAA,CAAM,QAAA,CAAS,CAAA,EAAG,CAAC,CAAA;AAC/D,MAAA,KAAA,CAAM,iBAAiB,KAAK,CAAA;AAAA,IAC9B,CAAA;AAAA,EACF;AACA,EAAA,IAAI,OAAO,MAAA,CAAO,GAAA,KAAQ,UAAA,EAAY;AAEpC,IAAA,MAAM,GAAA,GAAM,IAAI,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA;AACjC,IAAA,OAAO,CAAC,KAAA,EAAO,WAAA,EAAa,KAAA,KAAU;AAEpC,MAAA,GAAA,CAAI,SAAA,CAAU,CAAC,KAAA,KAAe;AAC5B,QAAA,KAAA,CAAM,cAAA,CAAe,CAAC,WAAW,CAAC,CAAA;AAClC,QAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG,KAAA,CAAM,QAAA,CAAS,CAAA,EAAG,CAAC,CAAA;AAC/D,QAAA,GAAA,CAAI,iBAAiB,KAAK,CAAA;AAAA,MAC5B,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAcO,SAAS,MAAA,CAAO,OAAgB,OAAA,EAA8B;AACnE,EAAA,IAAI;AACF,IAAA,IAAI,qBAAoB,EAAG;AAC3B,IAAA,IAAI,CAAC,cAAA,CAAe,OAAA,CAAQ,WAAW,CAAA,EAAG;AAE1C,IAAA,MAAM,QAAA,GAAW,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,IAAA,GAAO,OAAA;AACvD,IAAA,MAAM,aAAa,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAExE,IAAA,IAAI,SAAQ,EAAG;AACb,MAAA,OAAA,CAAQ,KAAA;AAAA,QACN,yBAAyB,OAAA,CAAQ,WAAW,CAAA,GAAA,EAAM,QAAQ,KAAK,UAAU,CAAA,CAAA;AAAA,QACzE;AAAA,OACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAA,CAAK,yBAAyB,OAAA,CAAQ,WAAW,MAAM,QAAQ,CAAA,EAAA,EAAK,UAAU,CAAA,CAAE,CAAA;AAAA,IAC1F;AAEA,IAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,IAAA,KAAK,YAAA,EAAa,CAAE,IAAA,CAAK,CAAC,SAAA,KAAc;AACtC,MAAA,IAAI,CAAC,SAAA,EAAW;AAChB,MAAA,IAAI;AACF,QAAA,SAAA,CAAU,OAAO,OAAA,CAAQ,WAAA,EAAa,UAAA,CAAW,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MACjE,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAOO,SAAS,gBAAA,GAAyB;AACvC,EAAA,WAAA,CAAY,KAAA,EAAM;AAClB,EAAA,OAAA,GAAU,IAAA;AACV,EAAA,gBAAA,GAAmB,KAAA;AACrB;;;AC1NO,SAAS,gBAAA,CACd,IACA,OAAA,EACyC;AACzC,EAAA,OAAO,IAAI,IAAA,KAAqC;AAC9C,IAAA,IAAI;AACF,MAAA,OAAO,EAAA,CAAG,GAAG,IAAI,CAAA;AAAA,IACnB,SAAS,GAAA,EAAK;AACZ,MAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AACnB,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF,CAAA;AACF;AAOO,SAAS,iBAAA,CACd,IACA,OAAA,EACkD;AAClD,EAAA,OAAO,UAAU,IAAA,KAA8C;AAC7D,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,EAAA,CAAG,GAAG,IAAI,CAAA;AAAA,IACzB,SAAS,GAAA,EAAK;AACZ,MAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AACnB,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF,CAAA;AACF","file":"chunk-RTL23YOQ.js","sourcesContent":["/**\n * Out-of-band error reporting to Morse's internal Sentry instance.\n *\n * Mirrors the Python SDK's `_internal/sentry_reporter.py`. When the SDK\n * absorbs an internal exception (per the non-invasive guarantee), it\n * reports the error here. Everything in this module is itself wrapped\n * to swallow errors — if Sentry reporting fails, that failure must not\n * propagate either.\n *\n * Customer data is NEVER included. Reports carry only:\n * - Error class + message\n * - Sanitized stack trace (file paths kept, locals stripped)\n * - SDK version\n * - Adapter name (when applicable)\n * - Runtime / OS metadata\n * - Content-free fingerprint of the call site\n *\n * The Sentry DSN is a build-time constant. Write-only — even if the DSN\n * leaks, it can only post errors to Morse's project, never read.\n *\n * Phase 6c status: DSN is a placeholder (`\"\"`). When Sanji provides the\n * real DSN, the constant below is updated and reports start flowing.\n * Until then, errors fall back to `console.warn` (or the host logger\n * once we add a logger abstraction).\n */\n\nimport { isDebug, isTelemetryDisabled } from \"./env\";\n\n// ---------------------------------------------------------------------------\n// Hardcoded DSN constant — Morse-owned, write-only.\n//\n// ISOLATION (MHQ-729): we must never call `Sentry.init()`. That binds a client\n// process-wide, so a host app that already uses Sentry would have ITS errors\n// redirected into Morse's project the first time we absorb an internal error.\n// `ensureSentry` builds a private Client on its own Scope instead.\n// ---------------------------------------------------------------------------\n\nconst SENTRY_DSN =\n \"https://f2f3d4d8c324fe5e439b6d83678116bd@o4511340656656384.ingest.us.sentry.io/4511340719833088\";\n\n// Rate limit: max 100 events per fingerprint per 60-second sliding window.\nconst RATE_WINDOW_MS = 60 * 1000;\nconst RATE_LIMIT_PER_WINDOW = 100;\n\nconst rateBuckets: Map<string, number[]> = new Map();\n\n/** `(error, fingerprint, safeExtra) => void`, bound to a Morse-private client. */\ntype CaptureFn = (error: unknown, fingerprint: string, extra: Record<string, unknown>) => void;\n\nlet capture: CaptureFn | null = null;\nlet sentryInitFailed = false;\n\nconst SAFE_EXTRA_KEYS: ReadonlySet<string> = new Set([\n \"adapter\",\n \"module\",\n \"function\",\n \"operation\",\n \"endpoint_host\",\n \"sdk_version\",\n \"runtime\",\n \"platform\",\n]);\n\nfunction checkRateLimit(fingerprint: string): boolean {\n const now = Date.now();\n const cutoff = now - RATE_WINDOW_MS;\n const bucket = rateBuckets.get(fingerprint) ?? [];\n\n // Evict old entries.\n while (bucket.length > 0 && (bucket[0] as number) < cutoff) {\n bucket.shift();\n }\n if (bucket.length >= RATE_LIMIT_PER_WINDOW) {\n rateBuckets.set(fingerprint, bucket);\n return false;\n }\n bucket.push(now);\n rateBuckets.set(fingerprint, bucket);\n return true;\n}\n\nfunction scrubExtra(extra: Record<string, unknown> | undefined): Record<string, unknown> {\n if (!extra) return {};\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(extra)) {\n if (SAFE_EXTRA_KEYS.has(k)) {\n out[k] = v;\n }\n }\n return out;\n}\n\n/**\n * Build a capture function bound to a PRIVATE Sentry client.\n *\n * MHQ-729: never calls `Sentry.init()`. We construct a Client directly and\n * attach it to a Scope we own, so the host application's global Sentry client\n * (if any) is left exactly as its owner configured it.\n *\n * Returns `null` when no Sentry package is installed or the version exposes\n * neither the v8 `Scope.setClient` nor the v7 `Hub` isolation primitive — in\n * that case reports stay local-log-only, which is the safe direction.\n */\nasync function ensureSentry(): Promise<CaptureFn | null> {\n if (!SENTRY_DSN) return null;\n if (capture !== null) return capture;\n if (sentryInitFailed) return null;\n try {\n // Import dynamically so the SDK doesn't pay the cost when DSN is unset.\n // @sentry/node first, falling back to @sentry/browser.\n let mod: unknown = null;\n let isNode = true;\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mod = await (Function(\"m\", \"return import(m)\") as any)(\"@sentry/node\");\n } catch {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mod = await (Function(\"m\", \"return import(m)\") as any)(\"@sentry/browser\");\n isNode = false;\n } catch {\n sentryInitFailed = true;\n return null;\n }\n }\n if (!mod) {\n sentryInitFailed = true;\n return null;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const sentry = mod as any;\n\n const ClientCtor = isNode ? sentry.NodeClient : sentry.BrowserClient;\n const transport = isNode ? sentry.makeNodeTransport : sentry.makeFetchTransport;\n if (typeof ClientCtor !== \"function\" || typeof transport !== \"function\") {\n sentryInitFailed = true;\n return null;\n }\n\n const client = new ClientCtor({\n dsn: SENTRY_DSN,\n transport,\n stackParser: sentry.defaultStackParser,\n // No integrations: every default one instruments the HOST app (global\n // handlers, console, fetch/http breadcrumbs). We only ever report\n // exceptions we hand over explicitly.\n integrations: [],\n tracesSampleRate: 0,\n autoSessionTracking: false,\n sendDefaultPii: false,\n // Breadcrumbs are host-application activity, not ours. Never collect.\n maxBreadcrumbs: 0,\n });\n if (typeof client.init === \"function\") client.init();\n\n const built = buildCapture(sentry, client);\n if (built === null) {\n sentryInitFailed = true;\n return null;\n }\n capture = built;\n return capture;\n } catch {\n sentryInitFailed = true;\n return null;\n }\n}\n\n/**\n * Bind `client` to an isolated scope, preferring the v8 API over v7's Hub.\n *\n * Exported for tests: the dynamic import in `ensureSentry` goes through\n * `Function(\"m\", \"return import(m)\")`, which sidesteps vitest's module mocking,\n * so this — where the actual isolation decision lives — is tested directly.\n *\n * @internal\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function buildCapture(sentry: any, client: any): CaptureFn | null {\n if (typeof sentry.Scope === \"function\" && sentry.Scope.prototype?.setClient) {\n // @sentry/* v8+: a Scope carries its own client.\n return (error, fingerprint, extra) => {\n const scope = new sentry.Scope();\n scope.setClient(client);\n scope.setFingerprint([fingerprint]);\n for (const [k, v] of Object.entries(extra)) scope.setExtra(k, v);\n scope.captureException(error);\n };\n }\n if (typeof sentry.Hub === \"function\") {\n // @sentry/* v7: an isolated Hub owns the client.\n const hub = new sentry.Hub(client);\n return (error, fingerprint, extra) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n hub.withScope((scope: any) => {\n scope.setFingerprint([fingerprint]);\n for (const [k, v] of Object.entries(extra)) scope.setExtra(k, v);\n hub.captureException(error);\n });\n };\n }\n return null;\n}\n\nexport interface ReportOptions {\n fingerprint: string;\n extra?: Record<string, unknown>;\n}\n\n/**\n * Report an internal SDK error out-of-band. Never throws.\n *\n * @param error The exception caught.\n * @param options fingerprint used for grouping + rate limiting; extra\n * is scrubbed against an allow-list before sending.\n */\nexport function report(error: unknown, options: ReportOptions): void {\n try {\n if (isTelemetryDisabled()) return;\n if (!checkRateLimit(options.fingerprint)) return;\n\n const errClass = error instanceof Error ? error.name : \"Error\";\n const errMessage = error instanceof Error ? error.message : String(error);\n\n if (isDebug()) {\n console.error(\n `morse internal error [${options.fingerprint}]: ${errClass}: ${errMessage}`,\n error,\n );\n } else {\n console.warn(`morse internal error [${options.fingerprint}]: ${errClass}: ${errMessage}`);\n }\n\n if (!SENTRY_DSN) return;\n\n void ensureSentry().then((captureFn) => {\n if (!captureFn) return;\n try {\n captureFn(error, options.fingerprint, scrubExtra(options.extra));\n } catch {\n // Sentry send error — swallow.\n }\n });\n } catch {\n // Absolute last-resort: nothing here may propagate.\n }\n}\n\n/**\n * Test-only reset hook — clears rate limits and sentry init state.\n *\n * @internal\n */\nexport function _resetForTesting(): void {\n rateBuckets.clear();\n capture = null;\n sentryInitFailed = false;\n}\n","/**\n * Non-invasive error isolation — the foundational SDK guarantee.\n *\n * Mirrors Python's `_internal/errors.py` `@absorb_errors` decorator. Every\n * public SDK function and every adapter-installed wrapper is wrapped with\n * `absorbErrors()`. The wrapper catches all exceptions and reports them\n * out-of-band to the Sentry reporter, then returns a benign value\n * (typically `undefined`) instead of propagating.\n *\n * Foundational principle:\n *\n * Telemetry must never break the host application.\n *\n * The customer's call returns its original result (or `undefined`)\n * regardless of whether the SDK's recording path succeeded.\n *\n * Note on async: TypeScript-land has no `KeyboardInterrupt` equivalent —\n * the analogue is \"no exceptions are special\". We absorb everything,\n * and rely on Node's `process.exit` / browser navigation to tear down\n * the runtime cleanly.\n */\n\nimport { report } from \"./sentry-reporter\";\n\nexport interface AbsorbErrorsOptions {\n /**\n * Stable identifier for grouping. Used for Sentry fingerprinting and\n * the rate limiter (max 100 events per fingerprint per minute).\n */\n fingerprint: string;\n /** Optional metadata attached to the report; scrubbed against an allow-list. */\n extra?: Record<string, unknown>;\n}\n\n/**\n * Wrap a synchronous function so that any thrown exception is absorbed\n * (reported out-of-band) instead of propagating. Returns `undefined` on\n * absorbed error.\n */\nexport function absorbErrorsSync<TArgs extends unknown[], TReturn>(\n fn: (...args: TArgs) => TReturn,\n options: AbsorbErrorsOptions,\n): (...args: TArgs) => TReturn | undefined {\n return (...args: TArgs): TReturn | undefined => {\n try {\n return fn(...args);\n } catch (err) {\n report(err, options);\n return undefined;\n }\n };\n}\n\n/**\n * Wrap an async function so that any rejection or thrown exception is\n * absorbed (reported out-of-band) instead of propagating. Returns\n * `undefined` on absorbed error.\n */\nexport function absorbErrorsAsync<TArgs extends unknown[], TReturn>(\n fn: (...args: TArgs) => Promise<TReturn>,\n options: AbsorbErrorsOptions,\n): (...args: TArgs) => Promise<TReturn | undefined> {\n return async (...args: TArgs): Promise<TReturn | undefined> => {\n try {\n return await fn(...args);\n } catch (err) {\n report(err, options);\n return undefined;\n }\n };\n}\n\n/**\n * Higher-order alias chosen to read like the Python decorator: pass a\n * function in, get a wrapped version back. Resolves to the sync or async\n * variant based on the runtime return value (a Promise). Defaults to\n * sync at the type level; use `absorbErrorsAsync` directly for proper\n * async typing.\n */\nexport const absorbErrors = absorbErrorsSync;\n"]}