@jerry_aurora/sky-monitor-sdk 0.2.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 (148) hide show
  1. package/README.md +355 -0
  2. package/dist/chunk-2EV6VMEO.js +2 -0
  3. package/dist/chunk-2EV6VMEO.js.map +1 -0
  4. package/dist/chunk-2R7LNQYV.js +4 -0
  5. package/dist/chunk-2R7LNQYV.js.map +1 -0
  6. package/dist/chunk-4DK7RV2K.js +2 -0
  7. package/dist/chunk-4DK7RV2K.js.map +1 -0
  8. package/dist/chunk-4GL6IXHZ.cjs +2 -0
  9. package/dist/chunk-4GL6IXHZ.cjs.map +1 -0
  10. package/dist/chunk-4K5NIPXS.cjs +2 -0
  11. package/dist/chunk-4K5NIPXS.cjs.map +1 -0
  12. package/dist/chunk-5RS6LIZN.js +2 -0
  13. package/dist/chunk-5RS6LIZN.js.map +1 -0
  14. package/dist/chunk-5VYMD33V.cjs +2 -0
  15. package/dist/chunk-5VYMD33V.cjs.map +1 -0
  16. package/dist/chunk-647GK2XE.js +2 -0
  17. package/dist/chunk-647GK2XE.js.map +1 -0
  18. package/dist/chunk-6KJXTS2V.js +2 -0
  19. package/dist/chunk-6KJXTS2V.js.map +1 -0
  20. package/dist/chunk-6YTKBMJD.cjs +2 -0
  21. package/dist/chunk-6YTKBMJD.cjs.map +1 -0
  22. package/dist/chunk-ACIPNVBT.cjs +2 -0
  23. package/dist/chunk-ACIPNVBT.cjs.map +1 -0
  24. package/dist/chunk-BEGDR54W.js +2 -0
  25. package/dist/chunk-BEGDR54W.js.map +1 -0
  26. package/dist/chunk-BVOILM65.cjs +2 -0
  27. package/dist/chunk-BVOILM65.cjs.map +1 -0
  28. package/dist/chunk-FBQC6XIY.cjs +2 -0
  29. package/dist/chunk-FBQC6XIY.cjs.map +1 -0
  30. package/dist/chunk-GBREIA45.js +2 -0
  31. package/dist/chunk-GBREIA45.js.map +1 -0
  32. package/dist/chunk-GU7O5MWM.js +2 -0
  33. package/dist/chunk-GU7O5MWM.js.map +1 -0
  34. package/dist/chunk-JMHMJVBJ.cjs +2 -0
  35. package/dist/chunk-JMHMJVBJ.cjs.map +1 -0
  36. package/dist/chunk-LAATIQ3Y.cjs +2 -0
  37. package/dist/chunk-LAATIQ3Y.cjs.map +1 -0
  38. package/dist/chunk-LFJTX6FJ.cjs +2 -0
  39. package/dist/chunk-LFJTX6FJ.cjs.map +1 -0
  40. package/dist/chunk-LKBNR7RI.js +2 -0
  41. package/dist/chunk-LKBNR7RI.js.map +1 -0
  42. package/dist/chunk-NM4RALDJ.cjs +2 -0
  43. package/dist/chunk-NM4RALDJ.cjs.map +1 -0
  44. package/dist/chunk-O32X45L3.js +2 -0
  45. package/dist/chunk-O32X45L3.js.map +1 -0
  46. package/dist/chunk-S3ROE6GJ.js +2 -0
  47. package/dist/chunk-S3ROE6GJ.js.map +1 -0
  48. package/dist/chunk-SNOBW3V4.js +2 -0
  49. package/dist/chunk-SNOBW3V4.js.map +1 -0
  50. package/dist/chunk-XOLMXHFL.js +2 -0
  51. package/dist/chunk-XOLMXHFL.js.map +1 -0
  52. package/dist/chunk-Y2IWAJSY.cjs +4 -0
  53. package/dist/chunk-Y2IWAJSY.cjs.map +1 -0
  54. package/dist/chunk-Y46XWPAC.cjs +2 -0
  55. package/dist/chunk-Y46XWPAC.cjs.map +1 -0
  56. package/dist/chunk-ZIKPTR2L.cjs +2 -0
  57. package/dist/chunk-ZIKPTR2L.cjs.map +1 -0
  58. package/dist/index-Bh5S5dim.d.ts +203 -0
  59. package/dist/index-D6soZ1u6.d.cts +203 -0
  60. package/dist/index.cjs +2 -0
  61. package/dist/index.cjs.map +1 -0
  62. package/dist/index.d.cts +32 -0
  63. package/dist/index.d.ts +32 -0
  64. package/dist/index.js +2 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/platforms/browser.cjs +2 -0
  67. package/dist/platforms/browser.cjs.map +1 -0
  68. package/dist/platforms/browser.d.cts +10 -0
  69. package/dist/platforms/browser.d.ts +10 -0
  70. package/dist/platforms/browser.js +2 -0
  71. package/dist/platforms/browser.js.map +1 -0
  72. package/dist/plugins/dedupe.cjs +2 -0
  73. package/dist/plugins/dedupe.cjs.map +1 -0
  74. package/dist/plugins/dedupe.d.cts +39 -0
  75. package/dist/plugins/dedupe.d.ts +39 -0
  76. package/dist/plugins/dedupe.js +2 -0
  77. package/dist/plugins/dedupe.js.map +1 -0
  78. package/dist/plugins/error.cjs +2 -0
  79. package/dist/plugins/error.cjs.map +1 -0
  80. package/dist/plugins/error.d.cts +51 -0
  81. package/dist/plugins/error.d.ts +51 -0
  82. package/dist/plugins/error.js +2 -0
  83. package/dist/plugins/error.js.map +1 -0
  84. package/dist/plugins/fetch.cjs +2 -0
  85. package/dist/plugins/fetch.cjs.map +1 -0
  86. package/dist/plugins/fetch.d.cts +35 -0
  87. package/dist/plugins/fetch.d.ts +35 -0
  88. package/dist/plugins/fetch.js +2 -0
  89. package/dist/plugins/fetch.js.map +1 -0
  90. package/dist/plugins/offline-queue.cjs +2 -0
  91. package/dist/plugins/offline-queue.cjs.map +1 -0
  92. package/dist/plugins/offline-queue.d.cts +93 -0
  93. package/dist/plugins/offline-queue.d.ts +93 -0
  94. package/dist/plugins/offline-queue.js +2 -0
  95. package/dist/plugins/offline-queue.js.map +1 -0
  96. package/dist/plugins/performance.cjs +2 -0
  97. package/dist/plugins/performance.cjs.map +1 -0
  98. package/dist/plugins/performance.d.cts +31 -0
  99. package/dist/plugins/performance.d.ts +31 -0
  100. package/dist/plugins/performance.js +2 -0
  101. package/dist/plugins/performance.js.map +1 -0
  102. package/dist/plugins/replay.cjs +77 -0
  103. package/dist/plugins/replay.cjs.map +1 -0
  104. package/dist/plugins/replay.js +77 -0
  105. package/dist/plugins/replay.js.map +1 -0
  106. package/dist/plugins/sampling.cjs +2 -0
  107. package/dist/plugins/sampling.cjs.map +1 -0
  108. package/dist/plugins/sampling.d.cts +56 -0
  109. package/dist/plugins/sampling.d.ts +56 -0
  110. package/dist/plugins/sampling.js +2 -0
  111. package/dist/plugins/sampling.js.map +1 -0
  112. package/dist/plugins/session.cjs +2 -0
  113. package/dist/plugins/session.cjs.map +1 -0
  114. package/dist/plugins/session.d.cts +74 -0
  115. package/dist/plugins/session.d.ts +74 -0
  116. package/dist/plugins/session.js +2 -0
  117. package/dist/plugins/session.js.map +1 -0
  118. package/dist/plugins/trace.cjs +2 -0
  119. package/dist/plugins/trace.cjs.map +1 -0
  120. package/dist/plugins/trace.d.cts +125 -0
  121. package/dist/plugins/trace.d.ts +125 -0
  122. package/dist/plugins/trace.js +2 -0
  123. package/dist/plugins/trace.js.map +1 -0
  124. package/dist/plugins/transport.cjs +2 -0
  125. package/dist/plugins/transport.cjs.map +1 -0
  126. package/dist/plugins/transport.d.cts +231 -0
  127. package/dist/plugins/transport.d.ts +231 -0
  128. package/dist/plugins/transport.js +2 -0
  129. package/dist/plugins/transport.js.map +1 -0
  130. package/dist/plugins/xhr.cjs +2 -0
  131. package/dist/plugins/xhr.cjs.map +1 -0
  132. package/dist/plugins/xhr.d.cts +35 -0
  133. package/dist/plugins/xhr.d.ts +35 -0
  134. package/dist/plugins/xhr.js +2 -0
  135. package/dist/plugins/xhr.js.map +1 -0
  136. package/dist/presets.cjs +2 -0
  137. package/dist/presets.cjs.map +1 -0
  138. package/dist/presets.d.cts +45 -0
  139. package/dist/presets.d.ts +45 -0
  140. package/dist/presets.js +2 -0
  141. package/dist/presets.js.map +1 -0
  142. package/dist/sky-monitor-replay.umd.js +77 -0
  143. package/dist/sky-monitor-replay.umd.js.map +1 -0
  144. package/dist/sky-monitor.umd.js +4 -0
  145. package/dist/sky-monitor.umd.js.map +1 -0
  146. package/dist/types-BGUJGEpp.d.cts +90 -0
  147. package/dist/types-BGUJGEpp.d.ts +90 -0
  148. package/package.json +122 -0
@@ -0,0 +1,2 @@
1
+ import {a,d}from'./chunk-647GK2XE.js';var i=class{constructor(t,e){this._state="idle";this._startTime=null;this._firstChunkTime=null;this._phases=new Map;this._tools=new Map;this._imageLoads=new Map;this._lastChunkTime=null;this._stallTimer=null;this._isStalled=false;this._monitor=t,this._traceId=a(),this._aiMessageId=e.aiMessageId,this._previousTraceId=e.previousTraceId,this._stallThreshold=e.stallThreshold??5e3;}get id(){return this._traceId}get traceId(){return this._traceId}get state(){return this._state}start(){this._state==="idle"&&(this._state="started",this._startTime=Date.now(),this._monitor.track("sse_start",{traceId:this._traceId,aiMessageId:this._aiMessageId}),this._previousTraceId&&this._monitor.track("user_retry",{traceId:this._traceId,previousTraceId:this._previousTraceId}));}firstChunk(){if(this._state!=="started"||this._firstChunkTime!==null)return;this._firstChunkTime=Date.now();let t=this._firstChunkTime-(this._startTime||this._firstChunkTime);this._monitor.track("sse_first_chunk",{traceId:this._traceId,ttfb:t});}complete(){if(this._state!=="started")return;this._state="ended",this._stopStallDetection();let t=Date.now()-(this._startTime||Date.now());this._monitor.track("sse_complete",{traceId:this._traceId,ttlb:t});}error(t){if(this._state!=="started")return;this._state="ended",this._stopStallDetection();let e=Date.now()-(this._startTime||Date.now());this._monitor.track("sse_error",{traceId:this._traceId,error:t,duration:e});}abort(t){if(this._state!=="started")return;this._state="ended",this._stopStallDetection();let e=Date.now()-(this._startTime||Date.now());this._monitor.track("sse_abort",{traceId:this._traceId,reason:t,duration:e});}phaseStart(t){this._state==="started"&&(this._phases.set(t,Date.now()),this._monitor.track("phase_start",{traceId:this._traceId,phase:t}));}phaseEnd(t){if(this._state!=="started")return;let e=this._phases.get(t);if(e===void 0)return;let r=Date.now()-e;this._phases.delete(t),this._monitor.track("phase_end",{traceId:this._traceId,phase:t,duration:r});}toolStart(t,e,r){if(this._state!=="started")return "";let s=r||d();return this._tools.set(s,{name:t,startTime:Date.now()}),this._monitor.track("tool_start",{traceId:this._traceId,toolCallId:s,name:t,args:e}),s}toolEnd(t,e){if(this._state!=="started")return;let r=null,s=null;if(e.toolCallId)s=this._tools.get(e.toolCallId)||null,r=e.toolCallId;else for(let[c,a]of this._tools)if(a.name===t){r=c,s=a;break}if(!r||!s)return;let h=Date.now()-s.startTime;this._tools.delete(r),this._monitor.track("tool_end",{traceId:this._traceId,toolCallId:r,name:t,success:e.success,duration:h,...e.imageUrl&&{imageUrl:e.imageUrl},...e.width&&{width:e.width},...e.height&&{height:e.height},...e.resultCount!==void 0&&{resultCount:e.resultCount},...e.sources&&{sources:e.sources},...e.error&&{error:e.error}});}imageLoadStart(t){this._state==="started"&&(this._imageLoads.set(t,Date.now()),this._monitor.track("image_load_start",{traceId:this._traceId,imageUrl:t}));}imageLoadEnd(t,e){if(this._state!=="started")return;let r=this._imageLoads.get(t);if(r===void 0)return;let s=Date.now()-r;this._imageLoads.delete(t),e.success?this._monitor.track("image_load_complete",{traceId:this._traceId,imageUrl:t,duration:s,...e.size!==void 0&&{size:e.size}}):this._monitor.track("image_load_error",{traceId:this._traceId,imageUrl:t,error:e.error||"Unknown error",duration:s});}recordChunk(){if(this._state!=="started")return;let t=Date.now();if(this._isStalled&&this._lastChunkTime){let e=t-this._lastChunkTime;this._monitor.track("sse_resume",{traceId:this._traceId,stallDuration:e}),this._isStalled=false;}this._lastChunkTime=t,this._startStallDetection();}_startStallDetection(){this._stopStallDetection(),this._stallTimer=setTimeout(()=>this._onStall(),this._stallThreshold);}_stopStallDetection(){this._stallTimer&&(clearTimeout(this._stallTimer),this._stallTimer=null);}_onStall(){this._state==="started"&&(this._isStalled=true,this._monitor.track("sse_stall",{traceId:this._traceId,stallDuration:this._stallThreshold,lastChunkTime:this._lastChunkTime}),this._startStallDetection());}};var l=class{constructor(){this.name="trace";this.priority=100;this._monitor=null;this._currentTrace=null;}setupOnce(t){this._monitor=t;let e=this;Object.defineProperties(t,{createTrace:{value:r=>new i(t,r),writable:false},setCurrentTrace:{value:r=>{e._currentTrace=r;},writable:false},getCurrentTrace:{value:()=>e._currentTrace,writable:false}});}processEvent(t){return this._currentTrace&&(t.context.traceId=this._currentTrace.id),t}teardown(){this._currentTrace=null,this._monitor=null;}};export{i as a,l as b};//# sourceMappingURL=chunk-S3ROE6GJ.js.map
2
+ //# sourceMappingURL=chunk-S3ROE6GJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/plugins/trace/trace.ts","../src/plugins/trace/index.ts"],"names":["Trace","monitor","options","generateTraceId","ttfb","ttlb","message","duration","reason","phase","startTime","name","args","externalToolCallId","toolCallId","generateToolCallId","result","matchedId","matchedTool","id","tool","imageUrl","now","stallDuration","TracePlugin","self","trace","event"],"mappings":"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","file":"chunk-S3ROE6GJ.js","sourcesContent":["/**\n * Trace 类 - SSE 链路追踪\n */\n\nimport type { IMonitor } from '../../core/types'\nimport type { TraceOptions, TraceOptionsExtended, TraceState, Phase, ToolResult, ImageLoadResult } from './types'\nimport { generateTraceId, generateToolCallId } from '../../core/utils'\n\n/**\n * SSE 链路追踪类\n */\nexport class Trace {\n private _traceId: string\n private _aiMessageId: string\n private _state: TraceState = 'idle'\n private _monitor: IMonitor\n\n private _startTime: number | null = null\n private _firstChunkTime: number | null = null\n private _phases: Map<Phase, number> = new Map()\n private _tools: Map<string, { name: string; startTime: number }> = new Map()\n private _imageLoads: Map<string, number> = new Map()\n\n private _previousTraceId?: string\n private _lastChunkTime: number | null = null\n private _stallTimer: ReturnType<typeof setTimeout> | null = null\n private _stallThreshold: number\n private _isStalled: boolean = false\n\n constructor(monitor: IMonitor, options: TraceOptions | TraceOptionsExtended) {\n this._monitor = monitor\n this._traceId = generateTraceId()\n this._aiMessageId = options.aiMessageId\n this._previousTraceId = (options as TraceOptionsExtended).previousTraceId\n this._stallThreshold = (options as TraceOptionsExtended).stallThreshold ?? 5000\n }\n\n get id(): string {\n return this._traceId\n }\n\n get traceId(): string {\n return this._traceId\n }\n\n get state(): TraceState {\n return this._state\n }\n\n start(): void {\n if (this._state !== 'idle') return\n this._state = 'started'\n this._startTime = Date.now()\n\n this._monitor.track('sse_start', {\n traceId: this._traceId,\n aiMessageId: this._aiMessageId,\n })\n\n if (this._previousTraceId) {\n this._monitor.track('user_retry', {\n traceId: this._traceId,\n previousTraceId: this._previousTraceId,\n })\n }\n }\n\n firstChunk(): void {\n if (this._state !== 'started' || this._firstChunkTime !== null) return\n this._firstChunkTime = Date.now()\n const ttfb = this._firstChunkTime - (this._startTime || this._firstChunkTime)\n\n this._monitor.track('sse_first_chunk', { traceId: this._traceId, ttfb })\n }\n\n complete(): void {\n if (this._state !== 'started') return\n this._state = 'ended'\n this._stopStallDetection()\n const ttlb = Date.now() - (this._startTime || Date.now())\n\n this._monitor.track('sse_complete', { traceId: this._traceId, ttlb })\n }\n\n error(message: string): void {\n if (this._state !== 'started') return\n this._state = 'ended'\n this._stopStallDetection()\n const duration = Date.now() - (this._startTime || Date.now())\n\n this._monitor.track('sse_error', { traceId: this._traceId, error: message, duration })\n }\n\n abort(reason?: string): void {\n if (this._state !== 'started') return\n this._state = 'ended'\n this._stopStallDetection()\n const duration = Date.now() - (this._startTime || Date.now())\n\n this._monitor.track('sse_abort', { traceId: this._traceId, reason, duration })\n }\n\n phaseStart(phase: Phase): void {\n if (this._state !== 'started') return\n this._phases.set(phase, Date.now())\n this._monitor.track('phase_start', { traceId: this._traceId, phase })\n }\n\n phaseEnd(phase: Phase): void {\n if (this._state !== 'started') return\n const startTime = this._phases.get(phase)\n if (startTime === undefined) return\n\n const duration = Date.now() - startTime\n this._phases.delete(phase)\n this._monitor.track('phase_end', { traceId: this._traceId, phase, duration })\n }\n\n\n toolStart(name: string, args?: Record<string, unknown>, externalToolCallId?: string): string {\n if (this._state !== 'started') return ''\n const toolCallId = externalToolCallId || generateToolCallId()\n this._tools.set(toolCallId, { name, startTime: Date.now() })\n this._monitor.track('tool_start', { traceId: this._traceId, toolCallId, name, args })\n return toolCallId\n }\n\n toolEnd(name: string, result: ToolResult): void {\n if (this._state !== 'started') return\n\n let matchedId: string | null = null\n let matchedTool: { name: string; startTime: number } | null = null\n\n if (result.toolCallId) {\n matchedTool = this._tools.get(result.toolCallId) || null\n matchedId = result.toolCallId\n } else {\n for (const [id, tool] of this._tools) {\n if (tool.name === name) {\n matchedId = id\n matchedTool = tool\n break\n }\n }\n }\n\n if (!matchedId || !matchedTool) return\n\n const duration = Date.now() - matchedTool.startTime\n this._tools.delete(matchedId)\n\n this._monitor.track('tool_end', {\n traceId: this._traceId,\n toolCallId: matchedId,\n name,\n success: result.success,\n duration,\n ...(result.imageUrl && { imageUrl: result.imageUrl }),\n ...(result.width && { width: result.width }),\n ...(result.height && { height: result.height }),\n ...(result.resultCount !== undefined && { resultCount: result.resultCount }),\n ...(result.sources && { sources: result.sources }),\n ...(result.error && { error: result.error }),\n })\n }\n\n imageLoadStart(imageUrl: string): void {\n if (this._state !== 'started') return\n this._imageLoads.set(imageUrl, Date.now())\n this._monitor.track('image_load_start', { traceId: this._traceId, imageUrl })\n }\n\n imageLoadEnd(imageUrl: string, result: ImageLoadResult): void {\n if (this._state !== 'started') return\n const startTime = this._imageLoads.get(imageUrl)\n if (startTime === undefined) return\n\n const duration = Date.now() - startTime\n this._imageLoads.delete(imageUrl)\n\n if (result.success) {\n this._monitor.track('image_load_complete', {\n traceId: this._traceId,\n imageUrl,\n duration,\n ...(result.size !== undefined && { size: result.size }),\n })\n } else {\n this._monitor.track('image_load_error', {\n traceId: this._traceId,\n imageUrl,\n error: result.error || 'Unknown error',\n duration,\n })\n }\n }\n\n recordChunk(): void {\n if (this._state !== 'started') return\n const now = Date.now()\n\n if (this._isStalled && this._lastChunkTime) {\n const stallDuration = now - this._lastChunkTime\n this._monitor.track('sse_resume', { traceId: this._traceId, stallDuration })\n this._isStalled = false\n }\n\n this._lastChunkTime = now\n this._startStallDetection()\n }\n\n private _startStallDetection(): void {\n this._stopStallDetection()\n this._stallTimer = setTimeout(() => this._onStall(), this._stallThreshold)\n }\n\n private _stopStallDetection(): void {\n if (this._stallTimer) {\n clearTimeout(this._stallTimer)\n this._stallTimer = null\n }\n }\n\n private _onStall(): void {\n if (this._state !== 'started') return\n this._isStalled = true\n\n this._monitor.track('sse_stall', {\n traceId: this._traceId,\n stallDuration: this._stallThreshold,\n lastChunkTime: this._lastChunkTime,\n })\n\n this._startStallDetection()\n }\n}\n","/**\n * Trace 插件 - AI 对话链路追踪\n */\n\nimport type { Plugin, IMonitor, MonitorEvent } from '../../core/types'\nimport type { TraceOptions, TraceOptionsExtended } from './types'\nimport { Trace } from './trace'\n\nexport type { TraceOptions, TraceOptionsExtended, TraceState, Phase, ToolResult, ImageLoadResult } from './types'\nexport { Trace } from './trace'\n\n/**\n * Trace 插件\n * 提供 AI 对话链路追踪能力\n */\nexport class TracePlugin implements Plugin {\n name = 'trace'\n priority = 100\n\n private _monitor: IMonitor | null = null\n private _currentTrace: Trace | null = null\n\n /**\n * 插件初始化\n */\n setupOnce(monitor: IMonitor): void {\n this._monitor = monitor\n\n // 扩展 Monitor API\n const self = this\n Object.defineProperties(monitor, {\n createTrace: {\n value: (options: TraceOptions | TraceOptionsExtended) => {\n return new Trace(monitor, options)\n },\n writable: false,\n },\n setCurrentTrace: {\n value: (trace: Trace | null) => {\n self._currentTrace = trace\n },\n writable: false,\n },\n getCurrentTrace: {\n value: () => self._currentTrace,\n writable: false,\n },\n })\n }\n\n /**\n * 事件处理:关联 traceId\n */\n processEvent(event: MonitorEvent): MonitorEvent {\n if (this._currentTrace) {\n event.context.traceId = this._currentTrace.id\n }\n return event\n }\n\n /**\n * 插件销毁\n */\n teardown(): void {\n this._currentTrace = null\n this._monitor = null\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ var s=class{constructor(){this._observers=[];this._visibilityHandler=null;this._beforeUnloadHandler=null;}setupOnce(r){typeof window>"u"||typeof PerformanceObserver>"u"||(this._observeFCP(r),this._observeLCP(r),this._observeCLS(r),this._observeINP(r),this._setupVisibilityHandler(r));}teardown(){for(let r of this._observers)r.disconnect();this._observers=[],this._visibilityHandler&&typeof document<"u"&&(document.removeEventListener("visibilitychange",this._visibilityHandler),this._visibilityHandler=null),this._beforeUnloadHandler&&typeof window<"u"&&(window.removeEventListener("beforeunload",this._beforeUnloadHandler),this._beforeUnloadHandler=null);}_observeFCP(r){try{let e=new PerformanceObserver(t=>{for(let i of t.getEntries())i.name==="first-contentful-paint"&&r.onFCP(i.startTime);});e.observe({type:"paint",buffered:!0}),this._observers.push(e);}catch(e){console.warn("[SkyMonitor] FCP observer failed:",e);}}_observeLCP(r){try{let e=new PerformanceObserver(t=>{let i=t.getEntries();if(i.length>0){let n=i[i.length-1];r.onLCP(n.startTime);}});e.observe({type:"largest-contentful-paint",buffered:!0}),this._observers.push(e);}catch(e){console.warn("[SkyMonitor] LCP observer failed:",e);}}_observeCLS(r){try{let e=0,t=new PerformanceObserver(n=>{for(let a of n.getEntries()){let o=a;o.hadRecentInput||(e+=o.value);}});t.observe({type:"layout-shift",buffered:!0}),this._observers.push(t);let i=this._visibilityHandler;this._visibilityHandler=()=>{document.hidden&&e>0&&(r.onCLS(e),e=0),i?.();};}catch(e){console.warn("[SkyMonitor] CLS observer failed:",e);}}_observeINP(r){try{let e=0,t=new PerformanceObserver(n=>{for(let a of n.getEntries()){let o=a;o.duration>e&&(e=o.duration);}});t.observe({type:"event",buffered:!0}),this._observers.push(t);let i=this._visibilityHandler;this._visibilityHandler=()=>{document.hidden&&e>0&&(r.onINP(e),e=0),i?.();};}catch(e){console.warn("[SkyMonitor] INP observer failed:",e);}}_setupVisibilityHandler(r){this._visibilityHandler||(this._visibilityHandler=()=>{}),document.addEventListener("visibilitychange",this._visibilityHandler),this._beforeUnloadHandler=()=>{},window.addEventListener("beforeunload",this._beforeUnloadHandler);}};var l=class{constructor(){this.name="performance";this.priority=150;this._monitor=null;this._lcpValue=0;this._clsValue=0;this._inpValue=0;this._platformAdapter=new s;}setupOnce(r){this._monitor=r,this._platformAdapter.setupOnce({onFCP:e=>{this._monitor.track("web_vital",{name:"FCP",value:e});},onLCP:e=>{this._lcpValue=e,this._reportIfHidden();},onCLS:e=>{this._clsValue+=e,this._reportIfHidden();},onINP:e=>{this._inpValue=e,this._reportIfHidden();}});}teardown(){this._platformAdapter.teardown(),this._monitor=null;}_reportIfHidden(){typeof document>"u"||document.hidden&&(this._lcpValue>0&&(this._monitor.track("web_vital",{name:"LCP",value:this._lcpValue}),this._lcpValue=0),this._clsValue>0&&(this._monitor.track("web_vital",{name:"CLS",value:this._clsValue}),this._clsValue=0),this._inpValue>0&&(this._monitor.track("web_vital",{name:"INP",value:this._inpValue}),this._inpValue=0));}};export{l as a};//# sourceMappingURL=chunk-SNOBW3V4.js.map
2
+ //# sourceMappingURL=chunk-SNOBW3V4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/plugins/performance/platforms/browser/index.ts","../src/plugins/performance/index.ts"],"names":["BrowserPerformanceAdapter","callbacks","observer","list","entry","entries","lastEntry","clsValue","layoutShift","originalVisibilityHandler","inpValue","eventEntry","PerformancePlugin","monitor","value"],"mappings":"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","file":"chunk-SNOBW3V4.js","sourcesContent":["/**\n * Performance 插件 - 浏览器平台实现\n *\n * 负责浏览器特定的性能指标采集:\n * - PerformanceObserver\n * - document.hidden\n * - visibilitychange 事件\n */\n\nexport interface BrowserPerformanceCallbacks {\n onFCP: (value: number) => void\n onLCP: (value: number) => void\n onCLS: (value: number) => void\n onINP: (value: number) => void\n}\n\n/**\n * 浏览器平台适配\n * 管理 PerformanceObserver 和可见性事件\n */\nexport class BrowserPerformanceAdapter {\n private _observers: PerformanceObserver[] = []\n private _visibilityHandler: (() => void) | null = null\n private _beforeUnloadHandler: (() => void) | null = null\n\n /**\n * 初始化性能监听\n */\n setupOnce(callbacks: BrowserPerformanceCallbacks): void {\n if (typeof window === 'undefined' || typeof PerformanceObserver === 'undefined') return\n\n this._observeFCP(callbacks)\n this._observeLCP(callbacks)\n this._observeCLS(callbacks)\n this._observeINP(callbacks)\n this._setupVisibilityHandler(callbacks)\n }\n\n /**\n * 清理性能监听\n */\n teardown(): void {\n for (const observer of this._observers) {\n observer.disconnect()\n }\n this._observers = []\n\n if (this._visibilityHandler && typeof document !== 'undefined') {\n document.removeEventListener('visibilitychange', this._visibilityHandler)\n this._visibilityHandler = null\n }\n\n if (this._beforeUnloadHandler && typeof window !== 'undefined') {\n window.removeEventListener('beforeunload', this._beforeUnloadHandler)\n this._beforeUnloadHandler = null\n }\n }\n\n private _observeFCP(callbacks: BrowserPerformanceCallbacks): void {\n try {\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (entry.name === 'first-contentful-paint') {\n callbacks.onFCP(entry.startTime)\n }\n }\n })\n observer.observe({ type: 'paint', buffered: true })\n this._observers.push(observer)\n } catch (e) {\n console.warn('[SkyMonitor] FCP observer failed:', e)\n }\n }\n\n private _observeLCP(callbacks: BrowserPerformanceCallbacks): void {\n try {\n const observer = new PerformanceObserver((list) => {\n const entries = list.getEntries()\n if (entries.length > 0) {\n const lastEntry = entries[entries.length - 1] as PerformanceEntry & { startTime: number }\n callbacks.onLCP(lastEntry.startTime)\n }\n })\n observer.observe({ type: 'largest-contentful-paint', buffered: true })\n this._observers.push(observer)\n } catch (e) {\n console.warn('[SkyMonitor] LCP observer failed:', e)\n }\n }\n\n private _observeCLS(callbacks: BrowserPerformanceCallbacks): void {\n try {\n let clsValue = 0\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n const layoutShift = entry as PerformanceEntry & { hadRecentInput: boolean; value: number }\n if (!layoutShift.hadRecentInput) {\n clsValue += layoutShift.value\n }\n }\n })\n observer.observe({ type: 'layout-shift', buffered: true })\n this._observers.push(observer)\n\n // 页面隐藏时上报\n const originalVisibilityHandler = this._visibilityHandler\n this._visibilityHandler = () => {\n if (document.hidden && clsValue > 0) {\n callbacks.onCLS(clsValue)\n clsValue = 0\n }\n originalVisibilityHandler?.()\n }\n } catch (e) {\n console.warn('[SkyMonitor] CLS observer failed:', e)\n }\n }\n\n private _observeINP(callbacks: BrowserPerformanceCallbacks): void {\n try {\n let inpValue = 0\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n const eventEntry = entry as PerformanceEntry & { duration: number }\n if (eventEntry.duration > inpValue) {\n inpValue = eventEntry.duration\n }\n }\n })\n observer.observe({ type: 'event', buffered: true })\n this._observers.push(observer)\n\n // 页面隐藏时上报\n const originalVisibilityHandler = this._visibilityHandler\n this._visibilityHandler = () => {\n if (document.hidden && inpValue > 0) {\n callbacks.onINP(inpValue)\n inpValue = 0\n }\n originalVisibilityHandler?.()\n }\n } catch (e) {\n console.warn('[SkyMonitor] INP observer failed:', e)\n }\n }\n\n private _setupVisibilityHandler(callbacks: BrowserPerformanceCallbacks): void {\n if (!this._visibilityHandler) {\n this._visibilityHandler = () => {\n // 由各个 observer 处理\n }\n }\n\n document.addEventListener('visibilitychange', this._visibilityHandler)\n\n // beforeunload 兜底\n this._beforeUnloadHandler = () => {\n // 由各个 observer 处理\n }\n window.addEventListener('beforeunload', this._beforeUnloadHandler)\n }\n}\n","/**\n * Performance 插件 - Web Vitals 采集\n */\n\nimport type { Plugin, IMonitor } from '../../core/types'\nimport { BrowserPerformanceAdapter } from './platforms/browser'\n\n/**\n * Performance 插件\n * 采集 FCP、LCP、CLS、INP\n */\nexport class PerformancePlugin implements Plugin {\n name = 'performance'\n priority = 150\n\n private _monitor: IMonitor | null = null\n private _platformAdapter: BrowserPerformanceAdapter\n private _lcpValue: number = 0\n private _clsValue: number = 0\n private _inpValue: number = 0\n\n constructor() {\n this._platformAdapter = new BrowserPerformanceAdapter()\n }\n\n /**\n * 插件初始化\n */\n setupOnce(monitor: IMonitor): void {\n this._monitor = monitor\n this._platformAdapter.setupOnce({\n onFCP: (value) => {\n this._monitor!.track('web_vital', {\n name: 'FCP',\n value,\n })\n },\n onLCP: (value) => {\n this._lcpValue = value\n this._reportIfHidden()\n },\n onCLS: (value) => {\n this._clsValue += value\n this._reportIfHidden()\n },\n onINP: (value) => {\n this._inpValue = value\n this._reportIfHidden()\n },\n })\n }\n\n /**\n * 插件销毁\n */\n teardown(): void {\n this._platformAdapter.teardown()\n this._monitor = null\n }\n\n private _reportIfHidden(): void {\n if (typeof document === 'undefined') return\n\n if (document.hidden) {\n if (this._lcpValue > 0) {\n this._monitor!.track('web_vital', { name: 'LCP', value: this._lcpValue })\n this._lcpValue = 0\n }\n if (this._clsValue > 0) {\n this._monitor!.track('web_vital', { name: 'CLS', value: this._clsValue })\n this._clsValue = 0\n }\n if (this._inpValue > 0) {\n this._monitor!.track('web_vital', { name: 'INP', value: this._inpValue })\n this._inpValue = 0\n }\n }\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ var r=class{constructor(n={}){this.name="dedupe";this.priority=20;this._seen=new Map;this._windowMs=n.windowMs??5e3;}processEvent(n){let t=this._getFingerprint(n),e=Date.now();this._cleanup(e);let i=this._seen.get(t);return i&&e-i<this._windowMs?null:(this._seen.set(t,e),n)}_getFingerprint(n){let t=`${n.type}:${JSON.stringify(n.data)}`;return this._hash(t)}_hash(n){let t=0;for(let e=0;e<n.length;e++){let i=n.charCodeAt(e);t=(t<<5)-t+i,t=t&t;}return t.toString(36)}_cleanup(n){for(let[t,e]of this._seen)n-e>=this._windowMs&&this._seen.delete(t);}};export{r as a};//# sourceMappingURL=chunk-XOLMXHFL.js.map
2
+ //# sourceMappingURL=chunk-XOLMXHFL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/plugins/dedupe/index.ts"],"names":["DedupePlugin","options","event","fingerprint","now","lastSeen","key","str","hash","i","char","timestamp"],"mappings":"AAeO,IAAMA,CAAAA,CAAN,KAAqC,CAO1C,WAAA,CAAYC,CAAAA,CAA+B,EAAC,CAAG,CAN/C,IAAA,CAAA,IAAA,CAAO,QAAA,CACP,IAAA,CAAA,QAAA,CAAW,EAAA,CAGX,KAAQ,KAAA,CAA6B,IAAI,GAAA,CAGvC,IAAA,CAAK,SAAA,CAAYA,CAAAA,CAAQ,QAAA,EAAY,IACvC,CAKA,YAAA,CAAaC,CAAAA,CAA0C,CACrD,IAAMC,CAAAA,CAAc,IAAA,CAAK,eAAA,CAAgBD,CAAK,EACxCE,CAAAA,CAAM,IAAA,CAAK,GAAA,EAAI,CAGrB,IAAA,CAAK,QAAA,CAASA,CAAG,CAAA,CAGjB,IAAMC,CAAAA,CAAW,IAAA,CAAK,KAAA,CAAM,GAAA,CAAIF,CAAW,CAAA,CAC3C,OAAIE,GAAYD,CAAAA,CAAMC,CAAAA,CAAW,IAAA,CAAK,SAAA,CAC7B,IAAA,EAGT,IAAA,CAAK,KAAA,CAAM,GAAA,CAAIF,EAAaC,CAAG,CAAA,CACxBF,CAAAA,CACT,CAKQ,eAAA,CAAgBA,CAAAA,CAA6B,CACnD,IAAMI,EAAM,CAAA,EAAGJ,CAAAA,CAAM,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,SAAA,CAAUA,CAAAA,CAAM,IAAI,CAAC,CAAA,CAAA,CACvD,OAAO,IAAA,CAAK,KAAA,CAAMI,CAAG,CACvB,CAKQ,MAAMC,CAAAA,CAAqB,CACjC,IAAIC,CAAAA,CAAO,CAAA,CACX,IAAA,IAASC,CAAAA,CAAI,CAAA,CAAGA,EAAIF,CAAAA,CAAI,MAAA,CAAQE,CAAAA,EAAAA,CAAK,CACnC,IAAMC,CAAAA,CAAOH,CAAAA,CAAI,UAAA,CAAWE,CAAC,CAAA,CAC7BD,CAAAA,CAAAA,CAASA,CAAAA,EAAQ,CAAA,EAAKA,CAAAA,CAAQE,CAAAA,CAC9BF,CAAAA,CAAOA,CAAAA,CAAOA,EAChB,CACA,OAAOA,CAAAA,CAAK,QAAA,CAAS,EAAE,CACzB,CAKQ,SAASJ,CAAAA,CAAmB,CAClC,IAAA,GAAW,CAACD,CAAAA,CAAaQ,CAAS,CAAA,GAAK,IAAA,CAAK,MACtCP,CAAAA,CAAMO,CAAAA,EAAa,IAAA,CAAK,SAAA,EAC1B,IAAA,CAAK,KAAA,CAAM,MAAA,CAAOR,CAAW,EAGnC,CACF","file":"chunk-XOLMXHFL.js","sourcesContent":["/**\n * Dedupe 插件 - 事件去重\n */\n\nimport type { Plugin, MonitorEvent } from '../../core/types'\n\nexport interface DedupePluginOptions {\n /** 去重窗口(毫秒),默认 5000 */\n windowMs?: number\n}\n\n/**\n * 去重插件\n * 基于事件指纹在时间窗口内去重\n */\nexport class DedupePlugin implements Plugin {\n name = 'dedupe'\n priority = 20\n\n private _windowMs: number\n private _seen: Map<string, number> = new Map()\n\n constructor(options: DedupePluginOptions = {}) {\n this._windowMs = options.windowMs ?? 5000\n }\n\n /**\n * 事件处理:按指纹去重\n */\n processEvent(event: MonitorEvent): MonitorEvent | null {\n const fingerprint = this._getFingerprint(event)\n const now = Date.now()\n\n // 清理过期指纹\n this._cleanup(now)\n\n // 检查是否重复\n const lastSeen = this._seen.get(fingerprint)\n if (lastSeen && now - lastSeen < this._windowMs) {\n return null\n }\n\n this._seen.set(fingerprint, now)\n return event\n }\n\n /**\n * 生成事件指纹\n */\n private _getFingerprint(event: MonitorEvent): string {\n const key = `${event.type}:${JSON.stringify(event.data)}`\n return this._hash(key)\n }\n\n /**\n * 简单 hash 函数\n */\n private _hash(str: string): string {\n let hash = 0\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i)\n hash = ((hash << 5) - hash) + char\n hash = hash & hash\n }\n return hash.toString(36)\n }\n\n /**\n * 清理过期指纹\n */\n private _cleanup(now: number): void {\n for (const [fingerprint, timestamp] of this._seen) {\n if (now - timestamp >= this._windowMs) {\n this._seen.delete(fingerprint)\n }\n }\n }\n}\n"]}
@@ -0,0 +1,4 @@
1
+ 'use strict';var l=class{constructor(){this._originalOnerror=null;this._unhandledRejectionHandler=null;this._resourceErrorHandler=null;this._originalConsoleError=null;}setupOnce(e,r){typeof window>"u"||(this._setupOnerror(r),this._setupUnhandledRejection(r),this._setupResourceError(r),e&&this._setupConsoleError(r));}teardown(){typeof window>"u"||(this._originalOnerror!==null&&(window.onerror=this._originalOnerror),this._unhandledRejectionHandler&&window.removeEventListener("unhandledrejection",this._unhandledRejectionHandler),this._resourceErrorHandler&&window.removeEventListener("error",this._resourceErrorHandler,true),this._originalConsoleError&&(console.error=this._originalConsoleError));}_setupOnerror(e){this._originalOnerror=window.onerror,window.onerror=(r,n,o,t,s)=>{e.onJSError(typeof r=="string"?r:r?.type||"Unknown error",n,o,t,s),this._originalOnerror?.call(window,r,n,o,t,s);};}_setupUnhandledRejection(e){this._unhandledRejectionHandler=r=>{e.onPromiseError(r.reason);},window.addEventListener("unhandledrejection",this._unhandledRejectionHandler);}_setupResourceError(e){this._resourceErrorHandler=r=>{let n=r.target;!n||n===window||!n.tagName||e.onResourceError(n);},window.addEventListener("error",this._resourceErrorHandler,true);}_setupConsoleError(e){this._originalConsoleError=console.error,console.error=(...r)=>{e.onConsoleError(r),this._originalConsoleError.apply(console,r);};}};var d=class{constructor(e={}){this.name="error";this.priority=150;this._monitor=null;this._seen=new Map;this._options={captureConsoleError:false,dedupeWindow:5e3,ignoreErrors:[],ignoreUrls:[],...e},this._platformAdapter=new l;}setupOnce(e){this._monitor=e,this._platformAdapter.setupOnce(this._options.captureConsoleError,{onJSError:(r,n,o,t,s)=>this._handleJSError(r,n,o,t,s),onPromiseError:r=>this._handlePromiseError(r),onResourceError:r=>this._handleResourceError(r),onConsoleError:r=>this._handleConsoleError(r)});}teardown(){this._platformAdapter.teardown(),this._monitor=null;}_handleJSError(e,r,n,o,t){let s=e,a=this._isCrossOriginError(s,r,n,o);if(this._shouldIgnore(s,r||""))return;let i=this._getFingerprint(t?.stack||`${r}:${n}:${o}`);this._isDuplicate(i)||(a?this._monitor.track("js_error",{message:"Script error (cross-origin)",isCrossOrigin:true,hint:'Add crossorigin="anonymous" to script tag and ensure CORS headers'}):this._monitor.track("js_error",{message:s,filename:r,lineno:n,colno:o,stack:t?.stack,parsedStack:this._parseStack(t?.stack)}));}_handlePromiseError(e){let r=e instanceof Error?e.message:String(e),n=e instanceof Error?e.stack:void 0;if(this._shouldIgnore(r,""))return;let o=this._getFingerprint(n||r);this._isDuplicate(o)||this._monitor.track("promise_error",{message:r,stack:n});}_handleResourceError(e){let r=e.tagName.toLowerCase(),n=e.src||e.href||"";if(!n||this._shouldIgnore("",n))return;let o=this._getResourceType(r),t=this._getFingerprint(n);this._isDuplicate(t)||this._monitor.track("resource_error",{resourceUrl:n,resourceType:o,tagName:r});}_handleConsoleError(e){let r=e.map(n=>String(n)).join(" ");if(!this._shouldIgnore(r,"")){let n=this._getFingerprint(r);this._isDuplicate(n)||this._monitor.track("console_error",{message:r});}}_isCrossOriginError(e,r,n,o){return e==="Script error."||e==="Script error"||e.toLowerCase().includes("script error")&&!r&&!n&&!o}_parseStack(e){if(!e)return;let r=[],n=/^\s*at\s+(?:(.+?)\s+\()?(.+?):(\d+):(\d+)\)?$/,o=/^(.+?)@(.+?):(\d+):(\d+)$/,t=e.split(`
2
+ `).slice(0,5);for(let s of t){let a=s.trim();if(!a||a.startsWith("Error:"))continue;let i=n.exec(a);if(i){r.push({function:i[1]||"<anonymous>",filename:i[2],lineno:parseInt(i[3],10),colno:parseInt(i[4],10)});continue}i=o.exec(a),i&&r.push({function:i[1]||"<anonymous>",filename:i[2],lineno:parseInt(i[3],10),colno:parseInt(i[4],10)});}return r.length>0?r:void 0}_shouldIgnore(e,r){return !!(this._options.ignoreErrors.some(n=>n.test(e))||r&&this._options.ignoreUrls.some(n=>n.test(r)))}_getFingerprint(e){let r=e.split(`
3
+ `).slice(0,3).join("");return this._hash(r)}_hash(e){let r=0;for(let n=0;n<e.length;n++){let o=e.charCodeAt(n);r=(r<<5)-r+o,r=r&r;}return r.toString(36)}_isDuplicate(e){let r=Date.now(),n=this._seen.get(e);return n&&r-n<this._options.dedupeWindow?true:(this._seen.set(e,r),this._cleanup(r),false)}_cleanup(e){for(let[r,n]of this._seen)e-n>=this._options.dedupeWindow&&this._seen.delete(r);}_getResourceType(e){return {img:"image",script:"script",link:"stylesheet",video:"video",audio:"audio"}[e]||"unknown"}};exports.a=d;//# sourceMappingURL=chunk-Y2IWAJSY.cjs.map
4
+ //# sourceMappingURL=chunk-Y2IWAJSY.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/plugins/error/platforms/browser/index.ts","../src/plugins/error/index.ts"],"names":["BrowserErrorAdapter","captureConsoleError","callbacks","msg","url","line","col","error","e","target","args","ErrorPlugin","options","monitor","reason","element","message","isCrossOrigin","fingerprint","stack","tagName","resourceUrl","resourceType","a","frames","chromeRegex","firefoxRegex","lines","trimmed","match","re","str","hash","i","char","now","lastSeen","fp","ts"],"mappings":"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","file":"chunk-Y2IWAJSY.cjs","sourcesContent":["/**\n * Error 插件 - 浏览器平台实现\n *\n * 负责浏览器特定的错误捕获:\n * - window.onerror\n * - unhandledrejection 事件\n * - 资源加载失败事件\n * - console.error 劫持\n */\n\nexport interface BrowserErrorCallbacks {\n onJSError: (msg: string, url: string | undefined, line: number | undefined, col: number | undefined, error: Error | undefined) => void\n onPromiseError: (reason: unknown) => void\n onResourceError: (element: HTMLElement) => void\n onConsoleError: (args: unknown[]) => void\n}\n\n/**\n * 浏览器平台适配\n * 管理错误事件监听\n */\nexport class BrowserErrorAdapter {\n private _originalOnerror: OnErrorEventHandler | null = null\n private _unhandledRejectionHandler: ((e: PromiseRejectionEvent) => void) | null = null\n private _resourceErrorHandler: ((e: Event) => void) | null = null\n private _originalConsoleError: typeof console.error | null = null\n\n /**\n * 初始化错误监听\n */\n setupOnce(\n captureConsoleError: boolean,\n callbacks: BrowserErrorCallbacks\n ): void {\n if (typeof window === 'undefined') return\n\n this._setupOnerror(callbacks)\n this._setupUnhandledRejection(callbacks)\n this._setupResourceError(callbacks)\n\n if (captureConsoleError) {\n this._setupConsoleError(callbacks)\n }\n }\n\n /**\n * 清理错误监听\n */\n teardown(): void {\n if (typeof window === 'undefined') return\n\n if (this._originalOnerror !== null) {\n window.onerror = this._originalOnerror\n }\n if (this._unhandledRejectionHandler) {\n window.removeEventListener('unhandledrejection', this._unhandledRejectionHandler)\n }\n if (this._resourceErrorHandler) {\n window.removeEventListener('error', this._resourceErrorHandler, true)\n }\n if (this._originalConsoleError) {\n console.error = this._originalConsoleError\n }\n }\n\n private _setupOnerror(callbacks: BrowserErrorCallbacks): void {\n this._originalOnerror = window.onerror\n\n window.onerror = (msg, url, line, col, error) => {\n callbacks.onJSError(\n typeof msg === 'string' ? msg : msg?.type || 'Unknown error',\n url,\n line,\n col,\n error\n )\n this._originalOnerror?.call(window, msg, url, line, col, error)\n }\n }\n\n private _setupUnhandledRejection(callbacks: BrowserErrorCallbacks): void {\n this._unhandledRejectionHandler = (e: PromiseRejectionEvent) => {\n callbacks.onPromiseError(e.reason)\n }\n\n window.addEventListener('unhandledrejection', this._unhandledRejectionHandler)\n }\n\n private _setupResourceError(callbacks: BrowserErrorCallbacks): void {\n this._resourceErrorHandler = (e: Event) => {\n const target = e.target\n if (!target || target === window || !(target as HTMLElement).tagName) return\n\n callbacks.onResourceError(target as HTMLElement)\n }\n\n window.addEventListener('error', this._resourceErrorHandler, true)\n }\n\n private _setupConsoleError(callbacks: BrowserErrorCallbacks): void {\n this._originalConsoleError = console.error\n\n console.error = (...args: unknown[]) => {\n callbacks.onConsoleError(args)\n this._originalConsoleError!.apply(console, args)\n }\n }\n}\n","/**\n * Error 插件 - JS 异常捕获\n */\n\nimport type { Plugin, IMonitor } from '../../core/types'\nimport { BrowserErrorAdapter } from './platforms/browser'\n\nexport interface ErrorPluginOptions {\n /** 是否劫持 console.error,默认 false */\n captureConsoleError?: boolean\n /** 去重窗口(毫秒),默认 5000 */\n dedupeWindow?: number\n /** 忽略的错误消息正则 */\n ignoreErrors?: RegExp[]\n /** 忽略的脚本 URL 正则 */\n ignoreUrls?: RegExp[]\n}\n\n/**\n * Error 插件\n * 捕获 JS 运行时错误、Promise 错误、资源加载失败\n */\nexport class ErrorPlugin implements Plugin {\n name = 'error'\n priority = 150\n\n private _monitor: IMonitor | null = null\n private _options: Required<ErrorPluginOptions>\n private _seen: Map<string, number> = new Map()\n private _platformAdapter: BrowserErrorAdapter\n\n constructor(options: ErrorPluginOptions = {}) {\n this._options = {\n captureConsoleError: false,\n dedupeWindow: 5000,\n ignoreErrors: [],\n ignoreUrls: [],\n ...options,\n }\n this._platformAdapter = new BrowserErrorAdapter()\n }\n\n /**\n * 插件初始化\n */\n setupOnce(monitor: IMonitor): void {\n this._monitor = monitor\n this._platformAdapter.setupOnce(this._options.captureConsoleError, {\n onJSError: (msg, url, line, col, error) => this._handleJSError(msg, url, line, col, error),\n onPromiseError: (reason) => this._handlePromiseError(reason),\n onResourceError: (element) => this._handleResourceError(element),\n onConsoleError: (args) => this._handleConsoleError(args),\n })\n }\n\n /**\n * 插件销毁\n */\n teardown(): void {\n this._platformAdapter.teardown()\n this._monitor = null\n }\n\n private _handleJSError(\n msg: string,\n url: string | undefined,\n line: number | undefined,\n col: number | undefined,\n error: Error | undefined\n ): void {\n const message = msg\n\n // 检测跨域脚本错误\n const isCrossOrigin = this._isCrossOriginError(message, url, line, col)\n\n if (this._shouldIgnore(message, url || '')) return\n\n const fingerprint = this._getFingerprint(error?.stack || `${url}:${line}:${col}`)\n if (this._isDuplicate(fingerprint)) return\n\n if (isCrossOrigin) {\n this._monitor!.track('js_error', {\n message: 'Script error (cross-origin)',\n isCrossOrigin: true,\n hint: 'Add crossorigin=\"anonymous\" to script tag and ensure CORS headers',\n })\n } else {\n this._monitor!.track('js_error', {\n message,\n filename: url,\n lineno: line,\n colno: col,\n stack: error?.stack,\n parsedStack: this._parseStack(error?.stack),\n })\n }\n }\n\n private _handlePromiseError(reason: unknown): void {\n const message = reason instanceof Error ? reason.message : String(reason)\n const stack = reason instanceof Error ? reason.stack : undefined\n\n if (this._shouldIgnore(message, '')) return\n\n const fingerprint = this._getFingerprint(stack || message)\n if (this._isDuplicate(fingerprint)) return\n\n this._monitor!.track('promise_error', {\n message,\n stack,\n })\n }\n\n private _handleResourceError(element: HTMLElement): void {\n const tagName = element.tagName.toLowerCase()\n const resourceUrl =\n (element as HTMLImageElement).src ||\n (element as HTMLLinkElement).href ||\n ''\n\n if (!resourceUrl) return\n if (this._shouldIgnore('', resourceUrl)) return\n\n const resourceType = this._getResourceType(tagName)\n const fingerprint = this._getFingerprint(resourceUrl)\n if (this._isDuplicate(fingerprint)) return\n\n this._monitor!.track('resource_error', {\n resourceUrl,\n resourceType,\n tagName,\n })\n }\n\n private _handleConsoleError(args: unknown[]): void {\n const message = args.map((a) => String(a)).join(' ')\n\n if (!this._shouldIgnore(message, '')) {\n const fingerprint = this._getFingerprint(message)\n if (!this._isDuplicate(fingerprint)) {\n this._monitor!.track('console_error', { message })\n }\n }\n }\n\n private _isCrossOriginError(\n message: string,\n url: string | undefined,\n line: number | undefined,\n col: number | undefined\n ): boolean {\n return (\n message === 'Script error.' ||\n message === 'Script error' ||\n (message.toLowerCase().includes('script error') && !url && !line && !col)\n )\n }\n\n private _parseStack(stack?: string): Array<{\n filename?: string\n function?: string\n lineno?: number\n colno?: number\n }> | undefined {\n if (!stack) return undefined\n\n const frames: Array<{\n filename?: string\n function?: string\n lineno?: number\n colno?: number\n }> = []\n\n const chromeRegex = /^\\s*at\\s+(?:(.+?)\\s+\\()?(.+?):(\\d+):(\\d+)\\)?$/\n const firefoxRegex = /^(.+?)@(.+?):(\\d+):(\\d+)$/\n\n const lines = stack.split('\\n').slice(0, 5)\n\n for (const line of lines) {\n const trimmed = line.trim()\n if (!trimmed || trimmed.startsWith('Error:')) continue\n\n let match = chromeRegex.exec(trimmed)\n if (match) {\n frames.push({\n function: match[1] || '<anonymous>',\n filename: match[2],\n lineno: parseInt(match[3], 10),\n colno: parseInt(match[4], 10),\n })\n continue\n }\n\n match = firefoxRegex.exec(trimmed)\n if (match) {\n frames.push({\n function: match[1] || '<anonymous>',\n filename: match[2],\n lineno: parseInt(match[3], 10),\n colno: parseInt(match[4], 10),\n })\n }\n }\n\n return frames.length > 0 ? frames : undefined\n }\n\n private _shouldIgnore(message: string, url: string): boolean {\n if (this._options.ignoreErrors.some((re) => re.test(message))) return true\n if (url && this._options.ignoreUrls.some((re) => re.test(url))) return true\n return false\n }\n\n private _getFingerprint(stack: string): string {\n const frames = stack.split('\\n').slice(0, 3).join('')\n return this._hash(frames)\n }\n\n private _hash(str: string): string {\n let hash = 0\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i)\n hash = ((hash << 5) - hash) + char\n hash = hash & hash\n }\n return hash.toString(36)\n }\n\n private _isDuplicate(fingerprint: string): boolean {\n const now = Date.now()\n const lastSeen = this._seen.get(fingerprint)\n\n if (lastSeen && now - lastSeen < this._options.dedupeWindow) {\n return true\n }\n\n this._seen.set(fingerprint, now)\n this._cleanup(now)\n return false\n }\n\n private _cleanup(now: number): void {\n for (const [fp, ts] of this._seen) {\n if (now - ts >= this._options.dedupeWindow) {\n this._seen.delete(fp)\n }\n }\n }\n\n private _getResourceType(tagName: string): string {\n const map: Record<string, string> = {\n img: 'image',\n script: 'script',\n link: 'stylesheet',\n video: 'video',\n audio: 'audio',\n }\n return map[tagName] || 'unknown'\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';var e=0,i=0;function t(r=""){let n=Date.now();n===i?e++:(e=0,i=n);let s=n.toString(36),a=Math.random().toString(36).slice(2,7),o=[s,e.toString(36),a];return r?`${r}_${o.join("_")}`:o.join("_")}function g(){return t("trc")}function c(){return t("ses")}function u(){return t("evt")}function l(){return t("tool")}exports.a=g;exports.b=c;exports.c=u;exports.d=l;//# sourceMappingURL=chunk-Y46XWPAC.cjs.map
2
+ //# sourceMappingURL=chunk-Y46XWPAC.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/utils.ts"],"names":["counter","lastTimestamp","generateId","prefix","now","timestamp","random","parts","generateTraceId","generateSessionId","generateEventId","generateToolCallId"],"mappings":"aAKA,IAAIA,CAAAA,CAAU,EACVC,CAAAA,CAAgB,CAAA,CAUb,SAASC,CAAAA,CAAWC,CAAAA,CAAiB,GAAY,CACtD,IAAMC,EAAM,IAAA,CAAK,GAAA,GAGbA,CAAAA,GAAQH,CAAAA,CACVD,KAEAA,CAAAA,CAAU,CAAA,CACVC,EAAgBG,CAAAA,CAAAA,CAGlB,IAAMC,EAAYD,CAAAA,CAAI,QAAA,CAAS,EAAE,CAAA,CAC3BE,CAAAA,CAAS,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,MAAM,CAAA,CAAG,CAAC,EAC9CC,CAAAA,CAAQ,CAACF,EAAWL,CAAAA,CAAQ,QAAA,CAAS,EAAE,CAAA,CAAGM,CAAM,EAEtD,OAAOH,CAAAA,CAAS,GAAGA,CAAM,CAAA,CAAA,EAAII,EAAM,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAKA,CAAAA,CAAM,KAAK,GAAG,CACjE,CAKO,SAASC,CAAAA,EAA0B,CACxC,OAAON,CAAAA,CAAW,KAAK,CACzB,CAKO,SAASO,CAAAA,EAA4B,CAC1C,OAAOP,CAAAA,CAAW,KAAK,CACzB,CAKO,SAASQ,GAA0B,CACxC,OAAOR,EAAW,KAAK,CACzB,CAKO,SAASS,CAAAA,EAA6B,CAC3C,OAAOT,CAAAA,CAAW,MAAM,CAC1B","file":"chunk-Y46XWPAC.cjs","sourcesContent":["/**\n * 工具函数\n */\n\n// 计数器,用于同一毫秒内生成不同 ID\nlet counter = 0\nlet lastTimestamp = 0\n\n/**\n * 生成唯一 ID(类 ULID 格式)\n * 格式: 前缀_时间戳(base36)_计数器_随机数\n * 示例: trc_m5x2k8_0_a3b7c\n *\n * @param prefix - ID 前缀,用于区分类型\n * @returns 唯一标识符\n */\nexport function generateId(prefix: string = ''): string {\n const now = Date.now()\n\n // 同一毫秒内递增计数器\n if (now === lastTimestamp) {\n counter++\n } else {\n counter = 0\n lastTimestamp = now\n }\n\n const timestamp = now.toString(36)\n const random = Math.random().toString(36).slice(2, 7)\n const parts = [timestamp, counter.toString(36), random]\n\n return prefix ? `${prefix}_${parts.join('_')}` : parts.join('_')\n}\n\n/**\n * 生成 Trace ID\n */\nexport function generateTraceId(): string {\n return generateId('trc')\n}\n\n/**\n * 生成 Session ID\n */\nexport function generateSessionId(): string {\n return generateId('ses')\n}\n\n/**\n * 生成 Event ID\n */\nexport function generateEventId(): string {\n return generateId('evt')\n}\n\n/**\n * 生成 Tool Call ID\n */\nexport function generateToolCallId(): string {\n return generateId('tool')\n}\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';var t={development:{debug:true,transport:{mode:"immediate",maxRetries:1},sampling:{rate:1},plugins:["error","performance","fetch","xhr","session","dedupe"]},production:{debug:false,transport:{mode:"batch",batchSize:10,flushInterval:5e3,maxRetries:3},sampling:{rate:.1,mode:"session"},plugins:["error","performance","fetch","sampling","dedupe"]},minimal:{debug:false,transport:{mode:"batch",batchSize:20,flushInterval:1e4},sampling:{rate:.05,mode:"session"},plugins:["error","sampling"]}};function n(e){return t[e]}function i(e,r){return {debug:r.debug??e.debug,transport:{...e.transport,...r.transport},sampling:{...e.sampling,...r.sampling},plugins:r.plugins??e.plugins}}exports.a=t;exports.b=n;exports.c=i;//# sourceMappingURL=chunk-ZIKPTR2L.cjs.map
2
+ //# sourceMappingURL=chunk-ZIKPTR2L.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/presets.ts"],"names":["PRESETS","getPreset","preset","mergePreset","overrides"],"mappings":"aAuCO,IAAMA,CAAAA,CAA+C,CAC1D,WAAA,CAAa,CACX,KAAA,CAAO,IAAA,CACP,SAAA,CAAW,CACT,IAAA,CAAM,WAAA,CACN,UAAA,CAAY,CACd,CAAA,CACA,QAAA,CAAU,CACR,IAAA,CAAM,CACR,CAAA,CACA,OAAA,CAAS,CAAC,OAAA,CAAS,aAAA,CAAe,OAAA,CAAS,KAAA,CAAO,SAAA,CAAW,QAAQ,CACvE,CAAA,CACA,WAAY,CACV,KAAA,CAAO,KAAA,CACP,SAAA,CAAW,CACT,IAAA,CAAM,OAAA,CACN,SAAA,CAAW,EAAA,CACX,aAAA,CAAe,GAAA,CACf,UAAA,CAAY,CACd,CAAA,CACA,QAAA,CAAU,CACR,KAAM,EAAA,CACN,IAAA,CAAM,SACR,CAAA,CACA,OAAA,CAAS,CAAC,OAAA,CAAS,aAAA,CAAe,OAAA,CAAS,UAAA,CAAY,QAAQ,CACjE,CAAA,CACA,OAAA,CAAS,CACP,KAAA,CAAO,MACP,SAAA,CAAW,CACT,IAAA,CAAM,OAAA,CACN,SAAA,CAAW,EAAA,CACX,aAAA,CAAe,GACjB,CAAA,CACA,QAAA,CAAU,CACR,IAAA,CAAM,GAAA,CACN,IAAA,CAAM,SACR,CAAA,CACA,OAAA,CAAS,CAAC,OAAA,CAAS,UAAU,CAC/B,CACF,EAOO,SAASC,CAAAA,CAAUC,CAAAA,CAAqC,CAC7D,OAAOF,CAAAA,CAAQE,CAAM,CACvB,CAQO,SAASC,CAAAA,CACdD,CAAAA,CACAE,CAAAA,CACc,CACd,OAAO,CACL,KAAA,CAAOA,CAAAA,CAAU,KAAA,EAASF,CAAAA,CAAO,KAAA,CACjC,SAAA,CAAW,CACT,GAAGA,CAAAA,CAAO,SAAA,CACV,GAAGE,CAAAA,CAAU,SACf,CAAA,CACA,QAAA,CAAU,CACR,GAAGF,CAAAA,CAAO,QAAA,CACV,GAAGE,CAAAA,CAAU,QACf,CAAA,CACA,OAAA,CAASA,CAAAA,CAAU,OAAA,EAAWF,CAAAA,CAAO,OACvC,CACF","file":"chunk-ZIKPTR2L.cjs","sourcesContent":["/**\n * 预设配置\n *\n * 提供三种预设:\n * - development: 开发环境,即时发送,详细日志\n * - production: 生产环境,批量发送,采样\n * - minimal: 最小化,只采集错误\n */\n\nimport type { SamplingPluginOptions } from './plugins/sampling'\nimport type { TransportPluginOptions } from './plugins/transport'\n\n/** 预设名称 */\nexport type MonitorPreset = 'development' | 'production' | 'minimal'\n\n/** 插件名称 */\nexport type PluginName =\n | 'error'\n | 'performance'\n | 'fetch'\n | 'xhr'\n | 'session'\n | 'trace'\n | 'dedupe'\n | 'sampling'\n\n/** 预设配置内容 */\nexport interface PresetConfig {\n /** 调试模式 */\n debug: boolean\n /** 传输配置 */\n transport: Partial<TransportPluginOptions>\n /** 采样配置 */\n sampling: Partial<SamplingPluginOptions>\n /** 启用的插件 */\n plugins: PluginName[]\n}\n\n/** 预设配置定义 */\nexport const PRESETS: Record<MonitorPreset, PresetConfig> = {\n development: {\n debug: true,\n transport: {\n mode: 'immediate',\n maxRetries: 1,\n },\n sampling: {\n rate: 1.0,\n },\n plugins: ['error', 'performance', 'fetch', 'xhr', 'session', 'dedupe'],\n },\n production: {\n debug: false,\n transport: {\n mode: 'batch',\n batchSize: 10,\n flushInterval: 5000,\n maxRetries: 3,\n },\n sampling: {\n rate: 0.1,\n mode: 'session',\n },\n plugins: ['error', 'performance', 'fetch', 'sampling', 'dedupe'],\n },\n minimal: {\n debug: false,\n transport: {\n mode: 'batch',\n batchSize: 20,\n flushInterval: 10000,\n },\n sampling: {\n rate: 0.05,\n mode: 'session',\n },\n plugins: ['error', 'sampling'],\n },\n}\n\n/**\n * 获取预设配置\n * @param preset - 预设名称\n * @returns 预设配置\n */\nexport function getPreset(preset: MonitorPreset): PresetConfig {\n return PRESETS[preset]\n}\n\n/**\n * 合并预设配置和用户配置\n * @param preset - 预设配置\n * @param overrides - 用户覆盖配置\n * @returns 合并后的配置\n */\nexport function mergePreset(\n preset: PresetConfig,\n overrides: Partial<PresetConfig>\n): PresetConfig {\n return {\n debug: overrides.debug ?? preset.debug,\n transport: {\n ...preset.transport,\n ...overrides.transport,\n },\n sampling: {\n ...preset.sampling,\n ...overrides.sampling,\n },\n plugins: overrides.plugins ?? preset.plugins,\n }\n}\n"]}
@@ -0,0 +1,203 @@
1
+ import { I as IMonitor, M as MonitorOptions, P as Plugin, b as MonitorContext, c as IStorage, a as MonitorEvent, d as ITransport } from './types-BGUJGEpp.js';
2
+ import { MonitorPreset, PluginName } from './presets.js';
3
+ import { TransportPluginOptions } from './plugins/transport.js';
4
+ import { OfflineQueuePluginOptions } from './plugins/offline-queue.js';
5
+ import { ErrorPluginOptions } from './plugins/error.js';
6
+ import { FetchPluginOptions } from './plugins/fetch.js';
7
+ import { XHRPluginOptions } from './plugins/xhr.js';
8
+ import { DedupePluginOptions } from './plugins/dedupe.js';
9
+ import { SamplingPluginOptions } from './plugins/sampling.js';
10
+
11
+ /**
12
+ * Monitor 核心类 - 微内核架构
13
+ *
14
+ * 职责:
15
+ * - track() 上报事件
16
+ * - use() 注册插件
17
+ * - setContext() 设置上下文
18
+ * - 事件管道调度
19
+ */
20
+
21
+ /**
22
+ * 监控核心类
23
+ */
24
+ declare class Monitor implements IMonitor {
25
+ private _options;
26
+ private _context;
27
+ private _plugins;
28
+ private _sortedPlugins;
29
+ constructor(options: MonitorOptions);
30
+ /**
31
+ * 注册插件
32
+ * @param plugin - 插件实例
33
+ * @returns this(支持链式调用)
34
+ */
35
+ use(plugin: Plugin): this;
36
+ /**
37
+ * 手动上报事件
38
+ * @param type - 事件类型
39
+ * @param data - 事件数据
40
+ */
41
+ track(type: string, data?: Record<string, unknown>): void;
42
+ /**
43
+ * 设置全局上下文
44
+ * @param ctx - 上下文对象(会合并到现有上下文)
45
+ */
46
+ setContext(ctx: MonitorContext): void;
47
+ /**
48
+ * 获取当前上下文
49
+ */
50
+ getContext(): MonitorContext;
51
+ /**
52
+ * 获取配置选项
53
+ */
54
+ getOptions(): MonitorOptions;
55
+ /**
56
+ * 清空上下文
57
+ */
58
+ clearContext(): void;
59
+ /**
60
+ * 检查插件是否已注册
61
+ * @param name - 插件名称
62
+ */
63
+ hasPlugin(name: string): boolean;
64
+ /**
65
+ * 获取插件实例
66
+ * @param name - 插件名称
67
+ */
68
+ getPlugin<T extends Plugin>(name: string): T | undefined;
69
+ /**
70
+ * 销毁所有插件
71
+ */
72
+ destroy(): void;
73
+ /**
74
+ * 按优先级排序插件
75
+ */
76
+ private _sortPlugins;
77
+ }
78
+
79
+ /**
80
+ * Replay 插件 - rrweb 会话录制
81
+ */
82
+
83
+ interface ReplayPluginOptions {
84
+ /** 全量快照间隔(毫秒),默认 30000 */
85
+ checkoutEveryNms?: number;
86
+ /** buffer 最大事件数,默认 1000 */
87
+ bufferSize?: number;
88
+ /** 上报间隔(毫秒),默认 10000 */
89
+ flushInterval?: number;
90
+ /** 不录制的元素选择器 */
91
+ blockSelector?: string;
92
+ /** 输入脱敏配置 */
93
+ maskInputOptions?: {
94
+ password?: boolean;
95
+ email?: boolean;
96
+ };
97
+ /** 采样配置 */
98
+ sampling?: {
99
+ mousemove?: boolean;
100
+ scroll?: number;
101
+ input?: 'last' | 'all';
102
+ };
103
+ }
104
+
105
+ /**
106
+ * 浏览器存储适配器 - IndexedDB
107
+ */
108
+
109
+ /**
110
+ * IndexedDB 存储实现
111
+ */
112
+ declare class BrowserStorage implements IStorage {
113
+ private _db;
114
+ private _dbPromise;
115
+ /**
116
+ * 保存事件
117
+ */
118
+ save(event: MonitorEvent): Promise<void>;
119
+ /**
120
+ * 获取所有事件
121
+ */
122
+ getAll(): Promise<MonitorEvent[]>;
123
+ /**
124
+ * 清空所有事件
125
+ */
126
+ clear(): Promise<void>;
127
+ /**
128
+ * 获取数据库连接(单例)
129
+ */
130
+ private _getDB;
131
+ /**
132
+ * 打开数据库
133
+ */
134
+ private _openDB;
135
+ }
136
+
137
+ /**
138
+ * 浏览器传输适配器 - sendBeacon + fetch
139
+ */
140
+
141
+ /**
142
+ * 浏览器传输实现
143
+ */
144
+ declare class BrowserTransport implements ITransport {
145
+ private _endpoint;
146
+ constructor(endpoint?: string);
147
+ /**
148
+ * 发送事件(fetch)
149
+ */
150
+ send(events: MonitorEvent[]): Promise<boolean>;
151
+ /**
152
+ * 发送事件(sendBeacon,用于页面关闭)
153
+ */
154
+ sendBeacon(events: MonitorEvent[]): boolean;
155
+ }
156
+
157
+ /**
158
+ * 浏览器平台入口
159
+ */
160
+
161
+ /** 扩展的监控配置 - 全量插件映射 */
162
+ interface MonitorConfig {
163
+ /** 应用标识(必填) */
164
+ appId: string;
165
+ /** 上报地址,默认 '/api/monitor' */
166
+ endpoint?: string;
167
+ /** 调试模式 */
168
+ debug?: boolean;
169
+ /** 预设配置 */
170
+ preset?: MonitorPreset;
171
+ /** 启用的插件列表 */
172
+ plugins?: PluginName[];
173
+ /** 传输配置 */
174
+ transport?: Partial<TransportPluginOptions>;
175
+ /** 采样配置 */
176
+ sampling?: Partial<SamplingPluginOptions>;
177
+ /** 错误监控配置 */
178
+ error?: ErrorPluginOptions;
179
+ /** Fetch 拦截配置 */
180
+ fetch?: FetchPluginOptions;
181
+ /** XHR 拦截配置 */
182
+ xhr?: XHRPluginOptions;
183
+ /** 去重配置 */
184
+ dedupe?: DedupePluginOptions;
185
+ /** 离线队列配置 */
186
+ offlineQueue?: OfflineQueuePluginOptions;
187
+ /** 会话录制配置 */
188
+ replay?: ReplayPluginOptions;
189
+ }
190
+ /**
191
+ * 创建浏览器监控实例(简化版)
192
+ * @param options - 配置选项
193
+ * @returns Monitor 实例
194
+ */
195
+ declare function createBrowserMonitor(options: MonitorOptions): Monitor;
196
+ /**
197
+ * 创建浏览器监控实例(完整版,支持预设)
198
+ * @param config - 配置选项
199
+ * @returns Monitor 实例
200
+ */
201
+ declare function createMonitorWithPreset(config: MonitorConfig): Monitor;
202
+
203
+ export { BrowserStorage as B, type MonitorConfig as M, type ReplayPluginOptions as R, createMonitorWithPreset as a, Monitor as b, createBrowserMonitor as c, BrowserTransport as d };
@@ -0,0 +1,203 @@
1
+ import { I as IMonitor, M as MonitorOptions, P as Plugin, b as MonitorContext, c as IStorage, a as MonitorEvent, d as ITransport } from './types-BGUJGEpp.cjs';
2
+ import { MonitorPreset, PluginName } from './presets.cjs';
3
+ import { TransportPluginOptions } from './plugins/transport.cjs';
4
+ import { OfflineQueuePluginOptions } from './plugins/offline-queue.cjs';
5
+ import { ErrorPluginOptions } from './plugins/error.cjs';
6
+ import { FetchPluginOptions } from './plugins/fetch.cjs';
7
+ import { XHRPluginOptions } from './plugins/xhr.cjs';
8
+ import { DedupePluginOptions } from './plugins/dedupe.cjs';
9
+ import { SamplingPluginOptions } from './plugins/sampling.cjs';
10
+
11
+ /**
12
+ * Monitor 核心类 - 微内核架构
13
+ *
14
+ * 职责:
15
+ * - track() 上报事件
16
+ * - use() 注册插件
17
+ * - setContext() 设置上下文
18
+ * - 事件管道调度
19
+ */
20
+
21
+ /**
22
+ * 监控核心类
23
+ */
24
+ declare class Monitor implements IMonitor {
25
+ private _options;
26
+ private _context;
27
+ private _plugins;
28
+ private _sortedPlugins;
29
+ constructor(options: MonitorOptions);
30
+ /**
31
+ * 注册插件
32
+ * @param plugin - 插件实例
33
+ * @returns this(支持链式调用)
34
+ */
35
+ use(plugin: Plugin): this;
36
+ /**
37
+ * 手动上报事件
38
+ * @param type - 事件类型
39
+ * @param data - 事件数据
40
+ */
41
+ track(type: string, data?: Record<string, unknown>): void;
42
+ /**
43
+ * 设置全局上下文
44
+ * @param ctx - 上下文对象(会合并到现有上下文)
45
+ */
46
+ setContext(ctx: MonitorContext): void;
47
+ /**
48
+ * 获取当前上下文
49
+ */
50
+ getContext(): MonitorContext;
51
+ /**
52
+ * 获取配置选项
53
+ */
54
+ getOptions(): MonitorOptions;
55
+ /**
56
+ * 清空上下文
57
+ */
58
+ clearContext(): void;
59
+ /**
60
+ * 检查插件是否已注册
61
+ * @param name - 插件名称
62
+ */
63
+ hasPlugin(name: string): boolean;
64
+ /**
65
+ * 获取插件实例
66
+ * @param name - 插件名称
67
+ */
68
+ getPlugin<T extends Plugin>(name: string): T | undefined;
69
+ /**
70
+ * 销毁所有插件
71
+ */
72
+ destroy(): void;
73
+ /**
74
+ * 按优先级排序插件
75
+ */
76
+ private _sortPlugins;
77
+ }
78
+
79
+ /**
80
+ * Replay 插件 - rrweb 会话录制
81
+ */
82
+
83
+ interface ReplayPluginOptions {
84
+ /** 全量快照间隔(毫秒),默认 30000 */
85
+ checkoutEveryNms?: number;
86
+ /** buffer 最大事件数,默认 1000 */
87
+ bufferSize?: number;
88
+ /** 上报间隔(毫秒),默认 10000 */
89
+ flushInterval?: number;
90
+ /** 不录制的元素选择器 */
91
+ blockSelector?: string;
92
+ /** 输入脱敏配置 */
93
+ maskInputOptions?: {
94
+ password?: boolean;
95
+ email?: boolean;
96
+ };
97
+ /** 采样配置 */
98
+ sampling?: {
99
+ mousemove?: boolean;
100
+ scroll?: number;
101
+ input?: 'last' | 'all';
102
+ };
103
+ }
104
+
105
+ /**
106
+ * 浏览器存储适配器 - IndexedDB
107
+ */
108
+
109
+ /**
110
+ * IndexedDB 存储实现
111
+ */
112
+ declare class BrowserStorage implements IStorage {
113
+ private _db;
114
+ private _dbPromise;
115
+ /**
116
+ * 保存事件
117
+ */
118
+ save(event: MonitorEvent): Promise<void>;
119
+ /**
120
+ * 获取所有事件
121
+ */
122
+ getAll(): Promise<MonitorEvent[]>;
123
+ /**
124
+ * 清空所有事件
125
+ */
126
+ clear(): Promise<void>;
127
+ /**
128
+ * 获取数据库连接(单例)
129
+ */
130
+ private _getDB;
131
+ /**
132
+ * 打开数据库
133
+ */
134
+ private _openDB;
135
+ }
136
+
137
+ /**
138
+ * 浏览器传输适配器 - sendBeacon + fetch
139
+ */
140
+
141
+ /**
142
+ * 浏览器传输实现
143
+ */
144
+ declare class BrowserTransport implements ITransport {
145
+ private _endpoint;
146
+ constructor(endpoint?: string);
147
+ /**
148
+ * 发送事件(fetch)
149
+ */
150
+ send(events: MonitorEvent[]): Promise<boolean>;
151
+ /**
152
+ * 发送事件(sendBeacon,用于页面关闭)
153
+ */
154
+ sendBeacon(events: MonitorEvent[]): boolean;
155
+ }
156
+
157
+ /**
158
+ * 浏览器平台入口
159
+ */
160
+
161
+ /** 扩展的监控配置 - 全量插件映射 */
162
+ interface MonitorConfig {
163
+ /** 应用标识(必填) */
164
+ appId: string;
165
+ /** 上报地址,默认 '/api/monitor' */
166
+ endpoint?: string;
167
+ /** 调试模式 */
168
+ debug?: boolean;
169
+ /** 预设配置 */
170
+ preset?: MonitorPreset;
171
+ /** 启用的插件列表 */
172
+ plugins?: PluginName[];
173
+ /** 传输配置 */
174
+ transport?: Partial<TransportPluginOptions>;
175
+ /** 采样配置 */
176
+ sampling?: Partial<SamplingPluginOptions>;
177
+ /** 错误监控配置 */
178
+ error?: ErrorPluginOptions;
179
+ /** Fetch 拦截配置 */
180
+ fetch?: FetchPluginOptions;
181
+ /** XHR 拦截配置 */
182
+ xhr?: XHRPluginOptions;
183
+ /** 去重配置 */
184
+ dedupe?: DedupePluginOptions;
185
+ /** 离线队列配置 */
186
+ offlineQueue?: OfflineQueuePluginOptions;
187
+ /** 会话录制配置 */
188
+ replay?: ReplayPluginOptions;
189
+ }
190
+ /**
191
+ * 创建浏览器监控实例(简化版)
192
+ * @param options - 配置选项
193
+ * @returns Monitor 实例
194
+ */
195
+ declare function createBrowserMonitor(options: MonitorOptions): Monitor;
196
+ /**
197
+ * 创建浏览器监控实例(完整版,支持预设)
198
+ * @param config - 配置选项
199
+ * @returns Monitor 实例
200
+ */
201
+ declare function createMonitorWithPreset(config: MonitorConfig): Monitor;
202
+
203
+ export { BrowserStorage as B, type MonitorConfig as M, type ReplayPluginOptions as R, createMonitorWithPreset as a, Monitor as b, createBrowserMonitor as c, BrowserTransport as d };
package/dist/index.cjs ADDED
@@ -0,0 +1,2 @@
1
+ 'use strict';var chunkLFJTX6FJ_cjs=require('./chunk-LFJTX6FJ.cjs'),chunkFBQC6XIY_cjs=require('./chunk-FBQC6XIY.cjs'),chunkJMHMJVBJ_cjs=require('./chunk-JMHMJVBJ.cjs'),chunkNM4RALDJ_cjs=require('./chunk-NM4RALDJ.cjs');require('./chunk-BVOILM65.cjs');var chunkZIKPTR2L_cjs=require('./chunk-ZIKPTR2L.cjs'),chunk5VYMD33V_cjs=require('./chunk-5VYMD33V.cjs'),chunk6YTKBMJD_cjs=require('./chunk-6YTKBMJD.cjs'),chunkY46XWPAC_cjs=require('./chunk-Y46XWPAC.cjs'),chunkACIPNVBT_cjs=require('./chunk-ACIPNVBT.cjs'),chunk4K5NIPXS_cjs=require('./chunk-4K5NIPXS.cjs'),chunk4GL6IXHZ_cjs=require('./chunk-4GL6IXHZ.cjs'),chunkLAATIQ3Y_cjs=require('./chunk-LAATIQ3Y.cjs'),chunkY2IWAJSY_cjs=require('./chunk-Y2IWAJSY.cjs');var S=["js_error","promise_error","resource_error"];Object.defineProperty(exports,"Monitor",{enumerable:true,get:function(){return chunkLFJTX6FJ_cjs.a}});Object.defineProperty(exports,"createMonitor",{enumerable:true,get:function(){return chunkLFJTX6FJ_cjs.b}});Object.defineProperty(exports,"createMonitorWithPreset",{enumerable:true,get:function(){return chunkLFJTX6FJ_cjs.c}});Object.defineProperty(exports,"PerformancePlugin",{enumerable:true,get:function(){return chunkFBQC6XIY_cjs.a}});Object.defineProperty(exports,"BrowserTransport",{enumerable:true,get:function(){return chunkJMHMJVBJ_cjs.a}});Object.defineProperty(exports,"TransportPlugin",{enumerable:true,get:function(){return chunkJMHMJVBJ_cjs.d}});Object.defineProperty(exports,"BrowserStorage",{enumerable:true,get:function(){return chunkNM4RALDJ_cjs.a}});Object.defineProperty(exports,"OfflineQueuePlugin",{enumerable:true,get:function(){return chunkNM4RALDJ_cjs.b}});Object.defineProperty(exports,"PRESETS",{enumerable:true,get:function(){return chunkZIKPTR2L_cjs.a}});Object.defineProperty(exports,"getPreset",{enumerable:true,get:function(){return chunkZIKPTR2L_cjs.b}});Object.defineProperty(exports,"mergePreset",{enumerable:true,get:function(){return chunkZIKPTR2L_cjs.c}});Object.defineProperty(exports,"Trace",{enumerable:true,get:function(){return chunk5VYMD33V_cjs.a}});Object.defineProperty(exports,"TracePlugin",{enumerable:true,get:function(){return chunk5VYMD33V_cjs.b}});Object.defineProperty(exports,"Session",{enumerable:true,get:function(){return chunk6YTKBMJD_cjs.a}});Object.defineProperty(exports,"SessionPlugin",{enumerable:true,get:function(){return chunk6YTKBMJD_cjs.b}});Object.defineProperty(exports,"generateEventId",{enumerable:true,get:function(){return chunkY46XWPAC_cjs.c}});Object.defineProperty(exports,"generateSessionId",{enumerable:true,get:function(){return chunkY46XWPAC_cjs.b}});Object.defineProperty(exports,"generateToolCallId",{enumerable:true,get:function(){return chunkY46XWPAC_cjs.d}});Object.defineProperty(exports,"generateTraceId",{enumerable:true,get:function(){return chunkY46XWPAC_cjs.a}});Object.defineProperty(exports,"SamplingPlugin",{enumerable:true,get:function(){return chunkACIPNVBT_cjs.a}});Object.defineProperty(exports,"DedupePlugin",{enumerable:true,get:function(){return chunk4K5NIPXS_cjs.a}});Object.defineProperty(exports,"FetchPlugin",{enumerable:true,get:function(){return chunk4GL6IXHZ_cjs.a}});Object.defineProperty(exports,"XHRPlugin",{enumerable:true,get:function(){return chunkLAATIQ3Y_cjs.a}});Object.defineProperty(exports,"ErrorPlugin",{enumerable:true,get:function(){return chunkY2IWAJSY_cjs.a}});exports.DEFAULT_CRITICAL_TYPES=S;//# sourceMappingURL=index.cjs.map
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/types.ts"],"names":["DEFAULT_CRITICAL_TYPES"],"mappings":"+rBAsCO,IAAMA,CAAAA,CAAyB,CACpC,UAAA,CACA,eAAA,CACA,gBACF","file":"index.cjs","sourcesContent":["/**\n * Sky Monitor SDK 核心类型定义\n */\n\n// ============ 平台适配器接口 ============\n\n/** 存储适配器接口 */\nexport interface IStorage {\n save(event: MonitorEvent): Promise<void>\n getAll(): Promise<MonitorEvent[]>\n clear(): Promise<void>\n}\n\n/** 传输适配器接口 */\nexport interface ITransport {\n send(events: MonitorEvent[]): Promise<boolean>\n sendBeacon?(events: MonitorEvent[]): boolean\n}\n\n// ============ 传输层类型 ============\n\n/** 发送模式 */\nexport type TransportMode = 'immediate' | 'batch' | 'throttle'\n\n/** 事件优先级 */\nexport type EventPriority = 'high' | 'normal' | 'low'\n\n/** 带优先级的事件 */\nexport interface PrioritizedEvent {\n /** 原始事件 */\n event: MonitorEvent\n /** 优先级 */\n priority: EventPriority\n /** 重试次数 */\n retryCount: number\n}\n\n/** 默认高优先级事件类型 */\nexport const DEFAULT_CRITICAL_TYPES = [\n 'js_error',\n 'promise_error',\n 'resource_error',\n] as const\n\n// ============ 核心类型 ============\n\n/** SDK 配置选项 */\nexport interface MonitorOptions {\n /** 应用标识 */\n appId: string\n /** 调试模式 */\n debug?: boolean\n /** 存储适配器(可选,默认使用平台适配器) */\n storage?: IStorage\n /** 传输适配器(可选,默认使用平台适配器) */\n transport?: ITransport\n}\n\n/** 标准化监控事件 */\nexport interface MonitorEvent {\n /** 事件唯一 ID */\n id: string\n /** 事件类型 */\n type: string\n /** 时间戳 */\n timestamp: number\n /** 事件数据 */\n data: Record<string, unknown>\n /** 上下文信息 */\n context: Record<string, unknown>\n}\n\n/** 上下文类型 */\nexport type MonitorContext = Record<string, unknown>\n\n// ============ 插件系统类型 ============\n\n/** 前向声明 Monitor 类型(避免循环依赖) */\nexport interface IMonitor {\n track(type: string, data?: Record<string, unknown>): void\n setContext(ctx: MonitorContext): void\n hasPlugin(name: string): boolean\n getContext(): MonitorContext\n getOptions(): MonitorOptions\n}\n\n/**\n * 插件接口\n * 所有插件必须实现此接口\n */\nexport interface Plugin {\n /** 插件名称(唯一标识) */\n name: string\n\n /** 优先级,数字越小越先执行,默认 100 */\n priority?: number\n\n /**\n * 插件初始化,只执行一次\n * @param monitor - Monitor 实例\n */\n setupOnce?(monitor: IMonitor): void\n\n /**\n * 事件处理管道\n * @param event - 待处理事件\n * @returns 处理后的事件,返回 null 则丢弃\n */\n processEvent?(event: MonitorEvent): MonitorEvent | null\n\n /**\n * 插件销毁,清理资源\n */\n teardown?(): void\n}\n"]}