@darkiceinteractive/mcp-conductor 2.0.0-alpha.1 → 3.0.0-beta.2

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 (276) hide show
  1. package/README.md +35 -5
  2. package/dist/bin/cli.d.ts +20 -0
  3. package/dist/bin/cli.d.ts.map +1 -0
  4. package/dist/bin/cli.js +260 -0
  5. package/dist/bin/cli.js.map +1 -0
  6. package/dist/bridge/http-server.d.ts +35 -0
  7. package/dist/bridge/http-server.d.ts.map +1 -1
  8. package/dist/bridge/http-server.js +51 -2
  9. package/dist/bridge/http-server.js.map +1 -1
  10. package/dist/bridge/index.d.ts +1 -0
  11. package/dist/bridge/index.d.ts.map +1 -1
  12. package/dist/bridge/index.js +1 -0
  13. package/dist/bridge/index.js.map +1 -1
  14. package/dist/bridge/pool.d.ts +95 -0
  15. package/dist/bridge/pool.d.ts.map +1 -0
  16. package/dist/bridge/pool.js +384 -0
  17. package/dist/bridge/pool.js.map +1 -0
  18. package/dist/cache/cache.d.ts +64 -0
  19. package/dist/cache/cache.d.ts.map +1 -0
  20. package/dist/cache/cache.js +209 -0
  21. package/dist/cache/cache.js.map +1 -0
  22. package/dist/cache/delta.d.ts +32 -0
  23. package/dist/cache/delta.d.ts.map +1 -0
  24. package/dist/cache/delta.js +131 -0
  25. package/dist/cache/delta.js.map +1 -0
  26. package/dist/cache/disk.d.ts +65 -0
  27. package/dist/cache/disk.d.ts.map +1 -0
  28. package/dist/cache/disk.js +238 -0
  29. package/dist/cache/disk.js.map +1 -0
  30. package/dist/cache/index.d.ts +53 -0
  31. package/dist/cache/index.d.ts.map +1 -0
  32. package/dist/cache/index.js +12 -0
  33. package/dist/cache/index.js.map +1 -0
  34. package/dist/cache/key.d.ts +44 -0
  35. package/dist/cache/key.d.ts.map +1 -0
  36. package/dist/cache/key.js +83 -0
  37. package/dist/cache/key.js.map +1 -0
  38. package/dist/cache/lru.d.ts +57 -0
  39. package/dist/cache/lru.d.ts.map +1 -0
  40. package/dist/cache/lru.js +112 -0
  41. package/dist/cache/lru.js.map +1 -0
  42. package/dist/cache/policy.d.ts +34 -0
  43. package/dist/cache/policy.d.ts.map +1 -0
  44. package/dist/cache/policy.js +95 -0
  45. package/dist/cache/policy.js.map +1 -0
  46. package/dist/cli/commands/doctor.d.ts +33 -0
  47. package/dist/cli/commands/doctor.d.ts.map +1 -0
  48. package/dist/cli/commands/doctor.js +135 -0
  49. package/dist/cli/commands/doctor.js.map +1 -0
  50. package/dist/cli/commands/export-servers.d.ts +22 -0
  51. package/dist/cli/commands/export-servers.d.ts.map +1 -0
  52. package/dist/cli/commands/export-servers.js +45 -0
  53. package/dist/cli/commands/export-servers.js.map +1 -0
  54. package/dist/cli/commands/import-servers.d.ts +57 -0
  55. package/dist/cli/commands/import-servers.d.ts.map +1 -0
  56. package/dist/cli/commands/import-servers.js +137 -0
  57. package/dist/cli/commands/import-servers.js.map +1 -0
  58. package/dist/cli/commands/routing.d.ts +34 -0
  59. package/dist/cli/commands/routing.d.ts.map +1 -0
  60. package/dist/cli/commands/routing.js +60 -0
  61. package/dist/cli/commands/routing.js.map +1 -0
  62. package/dist/cli/commands/test-server.d.ts +34 -0
  63. package/dist/cli/commands/test-server.d.ts.map +1 -0
  64. package/dist/cli/commands/test-server.js +86 -0
  65. package/dist/cli/commands/test-server.js.map +1 -0
  66. package/dist/cli/daemon.d.ts +60 -0
  67. package/dist/cli/daemon.d.ts.map +1 -0
  68. package/dist/cli/daemon.js +244 -0
  69. package/dist/cli/daemon.js.map +1 -0
  70. package/dist/cli/replay.d.ts +16 -0
  71. package/dist/cli/replay.d.ts.map +1 -0
  72. package/dist/cli/replay.js +89 -0
  73. package/dist/cli/replay.js.map +1 -0
  74. package/dist/cli/wizard/setup.d.ts +12 -0
  75. package/dist/cli/wizard/setup.d.ts.map +1 -0
  76. package/dist/cli/wizard/setup.js +71 -0
  77. package/dist/cli/wizard/setup.js.map +1 -0
  78. package/dist/config/defaults.d.ts.map +1 -1
  79. package/dist/config/defaults.js +4 -1
  80. package/dist/config/defaults.js.map +1 -1
  81. package/dist/config/schema.d.ts +34 -0
  82. package/dist/config/schema.d.ts.map +1 -1
  83. package/dist/daemon/client.d.ts +99 -0
  84. package/dist/daemon/client.d.ts.map +1 -0
  85. package/dist/daemon/client.js +292 -0
  86. package/dist/daemon/client.js.map +1 -0
  87. package/dist/daemon/discovery.d.ts +50 -0
  88. package/dist/daemon/discovery.d.ts.map +1 -0
  89. package/dist/daemon/discovery.js +104 -0
  90. package/dist/daemon/discovery.js.map +1 -0
  91. package/dist/daemon/index.d.ts +16 -0
  92. package/dist/daemon/index.d.ts.map +1 -0
  93. package/dist/daemon/index.js +11 -0
  94. package/dist/daemon/index.js.map +1 -0
  95. package/dist/daemon/sandbox-api.d.ts +45 -0
  96. package/dist/daemon/sandbox-api.d.ts.map +1 -0
  97. package/dist/daemon/sandbox-api.js +74 -0
  98. package/dist/daemon/sandbox-api.js.map +1 -0
  99. package/dist/daemon/server.d.ts +65 -0
  100. package/dist/daemon/server.d.ts.map +1 -0
  101. package/dist/daemon/server.js +373 -0
  102. package/dist/daemon/server.js.map +1 -0
  103. package/dist/daemon/shared-kv.d.ts +81 -0
  104. package/dist/daemon/shared-kv.d.ts.map +1 -0
  105. package/dist/daemon/shared-kv.js +215 -0
  106. package/dist/daemon/shared-kv.js.map +1 -0
  107. package/dist/daemon/shared-lock.d.ts +71 -0
  108. package/dist/daemon/shared-lock.d.ts.map +1 -0
  109. package/dist/daemon/shared-lock.js +119 -0
  110. package/dist/daemon/shared-lock.js.map +1 -0
  111. package/dist/hub/mcp-hub.d.ts +23 -0
  112. package/dist/hub/mcp-hub.d.ts.map +1 -1
  113. package/dist/hub/mcp-hub.js +34 -1
  114. package/dist/hub/mcp-hub.js.map +1 -1
  115. package/dist/index.js +7 -0
  116. package/dist/index.js.map +1 -1
  117. package/dist/observability/anomaly.d.ts +67 -0
  118. package/dist/observability/anomaly.d.ts.map +1 -0
  119. package/dist/observability/anomaly.js +141 -0
  120. package/dist/observability/anomaly.js.map +1 -0
  121. package/dist/observability/cost-predictor.d.ts +49 -0
  122. package/dist/observability/cost-predictor.d.ts.map +1 -0
  123. package/dist/observability/cost-predictor.js +145 -0
  124. package/dist/observability/cost-predictor.js.map +1 -0
  125. package/dist/observability/hot-path.d.ts +49 -0
  126. package/dist/observability/hot-path.d.ts.map +1 -0
  127. package/dist/observability/hot-path.js +125 -0
  128. package/dist/observability/hot-path.js.map +1 -0
  129. package/dist/observability/index.d.ts +10 -0
  130. package/dist/observability/index.d.ts.map +1 -0
  131. package/dist/observability/index.js +10 -0
  132. package/dist/observability/index.js.map +1 -0
  133. package/dist/observability/replay.d.ts +104 -0
  134. package/dist/observability/replay.d.ts.map +1 -0
  135. package/dist/observability/replay.js +239 -0
  136. package/dist/observability/replay.js.map +1 -0
  137. package/dist/registry/built-in-recommendations.d.ts +54 -0
  138. package/dist/registry/built-in-recommendations.d.ts.map +1 -0
  139. package/dist/registry/built-in-recommendations.js +65 -0
  140. package/dist/registry/built-in-recommendations.js.map +1 -0
  141. package/dist/registry/events.d.ts +26 -0
  142. package/dist/registry/events.d.ts.map +1 -0
  143. package/dist/registry/events.js +22 -0
  144. package/dist/registry/events.js.map +1 -0
  145. package/dist/registry/index.d.ts +159 -0
  146. package/dist/registry/index.d.ts.map +1 -0
  147. package/dist/registry/index.js +12 -0
  148. package/dist/registry/index.js.map +1 -0
  149. package/dist/registry/registry.d.ts +87 -0
  150. package/dist/registry/registry.d.ts.map +1 -0
  151. package/dist/registry/registry.js +294 -0
  152. package/dist/registry/registry.js.map +1 -0
  153. package/dist/registry/snapshot.d.ts +42 -0
  154. package/dist/registry/snapshot.d.ts.map +1 -0
  155. package/dist/registry/snapshot.js +71 -0
  156. package/dist/registry/snapshot.js.map +1 -0
  157. package/dist/registry/typegen.d.ts +48 -0
  158. package/dist/registry/typegen.d.ts.map +1 -0
  159. package/dist/registry/typegen.js +200 -0
  160. package/dist/registry/typegen.js.map +1 -0
  161. package/dist/registry/validator.d.ts +23 -0
  162. package/dist/registry/validator.d.ts.map +1 -0
  163. package/dist/registry/validator.js +50 -0
  164. package/dist/registry/validator.js.map +1 -0
  165. package/dist/reliability/breaker.d.ts +57 -0
  166. package/dist/reliability/breaker.d.ts.map +1 -0
  167. package/dist/reliability/breaker.js +130 -0
  168. package/dist/reliability/breaker.js.map +1 -0
  169. package/dist/reliability/errors.d.ts +78 -0
  170. package/dist/reliability/errors.d.ts.map +1 -0
  171. package/dist/reliability/errors.js +160 -0
  172. package/dist/reliability/errors.js.map +1 -0
  173. package/dist/reliability/gateway.d.ts +88 -0
  174. package/dist/reliability/gateway.d.ts.map +1 -0
  175. package/dist/reliability/gateway.js +180 -0
  176. package/dist/reliability/gateway.js.map +1 -0
  177. package/dist/reliability/index.d.ts +20 -0
  178. package/dist/reliability/index.d.ts.map +1 -0
  179. package/dist/reliability/index.js +16 -0
  180. package/dist/reliability/index.js.map +1 -0
  181. package/dist/reliability/profile.d.ts +49 -0
  182. package/dist/reliability/profile.d.ts.map +1 -0
  183. package/dist/reliability/profile.js +58 -0
  184. package/dist/reliability/profile.js.map +1 -0
  185. package/dist/reliability/retry.d.ts +39 -0
  186. package/dist/reliability/retry.d.ts.map +1 -0
  187. package/dist/reliability/retry.js +51 -0
  188. package/dist/reliability/retry.js.map +1 -0
  189. package/dist/reliability/timeout.d.ts +34 -0
  190. package/dist/reliability/timeout.d.ts.map +1 -0
  191. package/dist/reliability/timeout.js +53 -0
  192. package/dist/reliability/timeout.js.map +1 -0
  193. package/dist/runtime/executor.d.ts.map +1 -1
  194. package/dist/runtime/executor.js +122 -14
  195. package/dist/runtime/executor.js.map +1 -1
  196. package/dist/runtime/findtool/embed.d.ts +28 -0
  197. package/dist/runtime/findtool/embed.d.ts.map +1 -0
  198. package/dist/runtime/findtool/embed.js +85 -0
  199. package/dist/runtime/findtool/embed.js.map +1 -0
  200. package/dist/runtime/findtool/index.d.ts +52 -0
  201. package/dist/runtime/findtool/index.d.ts.map +1 -0
  202. package/dist/runtime/findtool/index.js +78 -0
  203. package/dist/runtime/findtool/index.js.map +1 -0
  204. package/dist/runtime/findtool/vector-index.d.ts +53 -0
  205. package/dist/runtime/findtool/vector-index.d.ts.map +1 -0
  206. package/dist/runtime/findtool/vector-index.js +71 -0
  207. package/dist/runtime/findtool/vector-index.js.map +1 -0
  208. package/dist/runtime/helpers/budget.d.ts +27 -0
  209. package/dist/runtime/helpers/budget.d.ts.map +1 -0
  210. package/dist/runtime/helpers/budget.js +103 -0
  211. package/dist/runtime/helpers/budget.js.map +1 -0
  212. package/dist/runtime/helpers/compact.d.ts +32 -0
  213. package/dist/runtime/helpers/compact.d.ts.map +1 -0
  214. package/dist/runtime/helpers/compact.js +93 -0
  215. package/dist/runtime/helpers/compact.js.map +1 -0
  216. package/dist/runtime/helpers/delta.d.ts +45 -0
  217. package/dist/runtime/helpers/delta.d.ts.map +1 -0
  218. package/dist/runtime/helpers/delta.js +116 -0
  219. package/dist/runtime/helpers/delta.js.map +1 -0
  220. package/dist/runtime/helpers/index.d.ts +16 -0
  221. package/dist/runtime/helpers/index.d.ts.map +1 -0
  222. package/dist/runtime/helpers/index.js +13 -0
  223. package/dist/runtime/helpers/index.js.map +1 -0
  224. package/dist/runtime/helpers/summarize.d.ts +24 -0
  225. package/dist/runtime/helpers/summarize.d.ts.map +1 -0
  226. package/dist/runtime/helpers/summarize.js +124 -0
  227. package/dist/runtime/helpers/summarize.js.map +1 -0
  228. package/dist/runtime/helpers/worker-preload.d.ts +25 -0
  229. package/dist/runtime/helpers/worker-preload.d.ts.map +1 -0
  230. package/dist/runtime/helpers/worker-preload.js +223 -0
  231. package/dist/runtime/helpers/worker-preload.js.map +1 -0
  232. package/dist/runtime/index.d.ts +1 -0
  233. package/dist/runtime/index.d.ts.map +1 -1
  234. package/dist/runtime/index.js +1 -0
  235. package/dist/runtime/index.js.map +1 -1
  236. package/dist/runtime/pool/index.d.ts +11 -0
  237. package/dist/runtime/pool/index.d.ts.map +1 -0
  238. package/dist/runtime/pool/index.js +8 -0
  239. package/dist/runtime/pool/index.js.map +1 -0
  240. package/dist/runtime/pool/recycle.d.ts +44 -0
  241. package/dist/runtime/pool/recycle.d.ts.map +1 -0
  242. package/dist/runtime/pool/recycle.js +50 -0
  243. package/dist/runtime/pool/recycle.js.map +1 -0
  244. package/dist/runtime/pool/worker-pool.d.ts +77 -0
  245. package/dist/runtime/pool/worker-pool.d.ts.map +1 -0
  246. package/dist/runtime/pool/worker-pool.js +216 -0
  247. package/dist/runtime/pool/worker-pool.js.map +1 -0
  248. package/dist/runtime/pool/worker.d.ts +80 -0
  249. package/dist/runtime/pool/worker.d.ts.map +1 -0
  250. package/dist/runtime/pool/worker.js +324 -0
  251. package/dist/runtime/pool/worker.js.map +1 -0
  252. package/dist/server/mcp-server.d.ts +3 -0
  253. package/dist/server/mcp-server.d.ts.map +1 -1
  254. package/dist/server/mcp-server.js +457 -3
  255. package/dist/server/mcp-server.js.map +1 -1
  256. package/dist/server/passthrough-registrar.d.ts +123 -0
  257. package/dist/server/passthrough-registrar.d.ts.map +1 -0
  258. package/dist/server/passthrough-registrar.js +199 -0
  259. package/dist/server/passthrough-registrar.js.map +1 -0
  260. package/dist/skills/skills-engine.d.ts +9 -1
  261. package/dist/skills/skills-engine.d.ts.map +1 -1
  262. package/dist/skills/skills-engine.js +20 -3
  263. package/dist/skills/skills-engine.js.map +1 -1
  264. package/dist/utils/index.d.ts +1 -0
  265. package/dist/utils/index.d.ts.map +1 -1
  266. package/dist/utils/index.js +1 -0
  267. package/dist/utils/index.js.map +1 -1
  268. package/dist/utils/tokenize.d.ts +55 -0
  269. package/dist/utils/tokenize.d.ts.map +1 -0
  270. package/dist/utils/tokenize.js +205 -0
  271. package/dist/utils/tokenize.js.map +1 -0
  272. package/dist/version.d.ts +3 -3
  273. package/dist/version.d.ts.map +1 -1
  274. package/dist/version.js +3 -3
  275. package/dist/version.js.map +1 -1
  276. package/package.json +13 -3
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Anomaly Detector
3
+ *
4
+ * For each (server, tool), tracks the distribution of result sizes and
5
+ * latencies. Flags any call whose value is more than stdDevThreshold
6
+ * standard deviations from the running mean. Detected anomalies are
7
+ * emitted on the EventEmitter and accessible via getAnomalies().
8
+ */
9
+ import { EventEmitter } from 'node:events';
10
+ export interface AnomalyConfig {
11
+ enabled: boolean;
12
+ /** Z-score threshold above which a sample is flagged (default: 3) */
13
+ stdDevThreshold: number;
14
+ /** Minimum samples before anomaly detection activates */
15
+ minSamplesForDetection: number;
16
+ /** Maximum anomaly records to retain in memory */
17
+ maxAnomalyHistory: number;
18
+ }
19
+ export declare const DEFAULT_ANOMALY_CONFIG: AnomalyConfig;
20
+ export interface AnomalyEvent {
21
+ server: string;
22
+ tool: string;
23
+ metric: 'latencyMs' | 'resultSizeBytes';
24
+ value: number;
25
+ mean: number;
26
+ stdDev: number;
27
+ zScore: number;
28
+ timestamp: number;
29
+ }
30
+ export declare class AnomalyDetector extends EventEmitter {
31
+ private config;
32
+ private stats;
33
+ private anomalies;
34
+ constructor(config?: Partial<AnomalyConfig>);
35
+ private bucketKey;
36
+ private getOrCreateBucket;
37
+ private checkAndRecord;
38
+ /**
39
+ * Record a completed call. Updates running stats and checks for anomalies.
40
+ */
41
+ record(server: string, tool: string, latencyMs: number, resultSizeBytes: number): void;
42
+ /** Return all recorded anomaly events (most recent last). */
43
+ getAnomalies(options?: {
44
+ server?: string;
45
+ tool?: string;
46
+ sinceMs?: number;
47
+ }): AnomalyEvent[];
48
+ /** Return current running stats for diagnostics. */
49
+ getStats(): Array<{
50
+ server: string;
51
+ tool: string;
52
+ latency: {
53
+ n: number;
54
+ mean: number;
55
+ stdDev: number;
56
+ };
57
+ resultSize: {
58
+ n: number;
59
+ mean: number;
60
+ stdDev: number;
61
+ };
62
+ }>;
63
+ reset(): void;
64
+ }
65
+ export declare function getAnomalyDetector(config?: Partial<AnomalyConfig>): AnomalyDetector;
66
+ export declare function shutdownAnomalyDetector(): void;
67
+ //# sourceMappingURL=anomaly.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anomaly.d.ts","sourceRoot":"","sources":["../../src/observability/anomaly.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,qEAAqE;IACrE,eAAe,EAAE,MAAM,CAAC;IACxB,yDAAyD;IACzD,sBAAsB,EAAE,MAAM,CAAC;IAC/B,kDAAkD;IAClD,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,eAAO,MAAM,sBAAsB,EAAE,aAKpC,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,GAAG,iBAAiB,CAAC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAgCD,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,SAAS,CAAsB;gBAE3B,MAAM,GAAE,OAAO,CAAC,aAAa,CAAM;IAK/C,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,cAAc;IA4CtB;;OAEG;IACH,MAAM,CACJ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,GACtB,IAAI;IAcP,6DAA6D;IAC7D,YAAY,CAAC,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,YAAY,EAAE;IAUhG,oDAAoD;IACpD,QAAQ,IAAI,KAAK,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QACrD,UAAU,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;KACzD,CAAC;IAcF,KAAK,IAAI,IAAI;CAId;AAMD,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,eAAe,CAKnF;AAED,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * Anomaly Detector
3
+ *
4
+ * For each (server, tool), tracks the distribution of result sizes and
5
+ * latencies. Flags any call whose value is more than stdDevThreshold
6
+ * standard deviations from the running mean. Detected anomalies are
7
+ * emitted on the EventEmitter and accessible via getAnomalies().
8
+ */
9
+ import { EventEmitter } from 'node:events';
10
+ import { logger } from '../utils/index.js';
11
+ export const DEFAULT_ANOMALY_CONFIG = {
12
+ enabled: true,
13
+ stdDevThreshold: 3,
14
+ minSamplesForDetection: 5,
15
+ maxAnomalyHistory: 500,
16
+ };
17
+ function updateStats(stats, value) {
18
+ stats.n += 1;
19
+ const delta = value - stats.mean;
20
+ stats.mean += delta / stats.n;
21
+ const delta2 = value - stats.mean;
22
+ stats.m2 += delta * delta2;
23
+ }
24
+ function stdDev(stats) {
25
+ if (stats.n < 2)
26
+ return 0;
27
+ return Math.sqrt(stats.m2 / (stats.n - 1));
28
+ }
29
+ function emptyStats() {
30
+ return { n: 0, mean: 0, m2: 0 };
31
+ }
32
+ export class AnomalyDetector extends EventEmitter {
33
+ config;
34
+ stats = new Map();
35
+ anomalies = [];
36
+ constructor(config = {}) {
37
+ super();
38
+ this.config = { ...DEFAULT_ANOMALY_CONFIG, ...config };
39
+ }
40
+ bucketKey(server, tool) {
41
+ return `${server}::${tool}`;
42
+ }
43
+ getOrCreateBucket(server, tool) {
44
+ const key = this.bucketKey(server, tool);
45
+ let bucket = this.stats.get(key);
46
+ if (!bucket) {
47
+ bucket = { latency: emptyStats(), resultSize: emptyStats() };
48
+ this.stats.set(key, bucket);
49
+ }
50
+ return bucket;
51
+ }
52
+ checkAndRecord(server, tool, metric, value, statsEntry) {
53
+ const sd = stdDev(statsEntry);
54
+ if (statsEntry.n >= this.config.minSamplesForDetection &&
55
+ sd > 0) {
56
+ const zScore = Math.abs((value - statsEntry.mean) / sd);
57
+ if (zScore > this.config.stdDevThreshold) {
58
+ const anomaly = {
59
+ server,
60
+ tool,
61
+ metric,
62
+ value,
63
+ mean: statsEntry.mean,
64
+ stdDev: sd,
65
+ zScore,
66
+ timestamp: Date.now(),
67
+ };
68
+ this.anomalies.push(anomaly);
69
+ if (this.anomalies.length > this.config.maxAnomalyHistory) {
70
+ this.anomalies.shift();
71
+ }
72
+ logger.warn('AnomalyDetector: anomaly detected', {
73
+ server,
74
+ tool,
75
+ metric,
76
+ value,
77
+ mean: statsEntry.mean,
78
+ zScore: zScore.toFixed(2),
79
+ });
80
+ this.emit('anomaly', anomaly);
81
+ }
82
+ }
83
+ }
84
+ /**
85
+ * Record a completed call. Updates running stats and checks for anomalies.
86
+ */
87
+ record(server, tool, latencyMs, resultSizeBytes) {
88
+ if (!this.config.enabled)
89
+ return;
90
+ const bucket = this.getOrCreateBucket(server, tool);
91
+ // Check before updating (so we compare against the existing distribution)
92
+ this.checkAndRecord(server, tool, 'latencyMs', latencyMs, bucket.latency);
93
+ this.checkAndRecord(server, tool, 'resultSizeBytes', resultSizeBytes, bucket.resultSize);
94
+ // Now update the running stats
95
+ updateStats(bucket.latency, latencyMs);
96
+ updateStats(bucket.resultSize, resultSizeBytes);
97
+ }
98
+ /** Return all recorded anomaly events (most recent last). */
99
+ getAnomalies(options = {}) {
100
+ const cutoff = options.sinceMs !== undefined ? Date.now() - options.sinceMs : 0;
101
+ return this.anomalies.filter((a) => {
102
+ if (a.timestamp < cutoff)
103
+ return false;
104
+ if (options.server && a.server !== options.server)
105
+ return false;
106
+ if (options.tool && a.tool !== options.tool)
107
+ return false;
108
+ return true;
109
+ });
110
+ }
111
+ /** Return current running stats for diagnostics. */
112
+ getStats() {
113
+ return Array.from(this.stats.entries()).map(([key, b]) => {
114
+ const parts = key.split('::');
115
+ const server = parts[0] ?? key;
116
+ const tool = parts[1] ?? '';
117
+ return {
118
+ server,
119
+ tool,
120
+ latency: { n: b.latency.n, mean: b.latency.mean, stdDev: stdDev(b.latency) },
121
+ resultSize: { n: b.resultSize.n, mean: b.resultSize.mean, stdDev: stdDev(b.resultSize) },
122
+ };
123
+ });
124
+ }
125
+ reset() {
126
+ this.stats.clear();
127
+ this.anomalies = [];
128
+ }
129
+ }
130
+ // Module-level singleton
131
+ let _instance = null;
132
+ export function getAnomalyDetector(config) {
133
+ if (!_instance) {
134
+ _instance = new AnomalyDetector(config);
135
+ }
136
+ return _instance;
137
+ }
138
+ export function shutdownAnomalyDetector() {
139
+ _instance = null;
140
+ }
141
+ //# sourceMappingURL=anomaly.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anomaly.js","sourceRoot":"","sources":["../../src/observability/anomaly.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Cost Predictor
3
+ *
4
+ * Maintains rolling history per (tool, args-shape-fingerprint) and predicts
5
+ * token cost and latency for future calls. Args-shape fingerprint is derived
6
+ * from the JSON schema of the args (types only, not values) so structurally
7
+ * equivalent calls are grouped together.
8
+ */
9
+ export interface CostPredictorConfig {
10
+ enabled: boolean;
11
+ minSamplesForPrediction: number;
12
+ maxSamplesPerBucket: number;
13
+ }
14
+ export declare const DEFAULT_COST_PREDICTOR_CONFIG: CostPredictorConfig;
15
+ export interface CostSample {
16
+ inputTokens: number;
17
+ outputTokens: number;
18
+ latencyMs: number;
19
+ timestamp: number;
20
+ }
21
+ export interface CostPrediction {
22
+ estimatedInputTokens: number;
23
+ estimatedOutputTokens: number;
24
+ estimatedLatencyMs: number;
25
+ basedOn: number;
26
+ }
27
+ /**
28
+ * Derive a stable string fingerprint from the shape (types) of an args object.
29
+ * Values are replaced with their typeof string so { path: '/foo' } and
30
+ * { path: '/bar' } produce the same fingerprint {"path":"string"}.
31
+ */
32
+ export declare function argsShapeFingerprint(args: Record<string, unknown>): string;
33
+ export declare class CostPredictor {
34
+ private config;
35
+ private buckets;
36
+ constructor(config?: Partial<CostPredictorConfig>);
37
+ record(server: string, tool: string, args: Record<string, unknown>, result: {
38
+ inputText?: string;
39
+ outputText: string;
40
+ latencyMs: number;
41
+ }): void;
42
+ predict(server: string, tool: string, args: Record<string, unknown>): CostPrediction | null;
43
+ predictFromCode(code: string): CostPrediction | null;
44
+ getBucketStats(): Record<string, number>;
45
+ reset(): void;
46
+ }
47
+ export declare function getCostPredictor(config?: Partial<CostPredictorConfig>): CostPredictor;
48
+ export declare function shutdownCostPredictor(): void;
49
+ //# sourceMappingURL=cost-predictor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-predictor.d.ts","sourceRoot":"","sources":["../../src/observability/cost-predictor.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,uBAAuB,EAAE,MAAM,CAAC;IAChC,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,eAAO,MAAM,6BAA6B,EAAE,mBAI3C,CAAC;AAEF,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAG1E;AA8BD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,OAAO,CAAkC;gBAErC,MAAM,GAAE,OAAO,CAAC,mBAAmB,CAAM;IAIrD,MAAM,CACJ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GACpE,IAAI;IAiCP,OAAO,CACL,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,cAAc,GAAG,IAAI;IAwBxB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IA6BpD,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAQxC,KAAK,IAAI,IAAI;CAGd;AAMD,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,aAAa,CAKrF;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Cost Predictor
3
+ *
4
+ * Maintains rolling history per (tool, args-shape-fingerprint) and predicts
5
+ * token cost and latency for future calls. Args-shape fingerprint is derived
6
+ * from the JSON schema of the args (types only, not values) so structurally
7
+ * equivalent calls are grouped together.
8
+ */
9
+ import { logger } from '../utils/index.js';
10
+ export const DEFAULT_COST_PREDICTOR_CONFIG = {
11
+ enabled: true,
12
+ minSamplesForPrediction: 5,
13
+ maxSamplesPerBucket: 200,
14
+ };
15
+ /**
16
+ * Derive a stable string fingerprint from the shape (types) of an args object.
17
+ * Values are replaced with their typeof string so { path: '/foo' } and
18
+ * { path: '/bar' } produce the same fingerprint {"path":"string"}.
19
+ */
20
+ export function argsShapeFingerprint(args) {
21
+ const shape = buildShape(args);
22
+ return JSON.stringify(shape);
23
+ }
24
+ function buildShape(value) {
25
+ if (value === null)
26
+ return 'null';
27
+ if (Array.isArray(value)) {
28
+ if (value.length === 0)
29
+ return 'array:empty';
30
+ return `array:${typeof buildShape(value[0])}`;
31
+ }
32
+ if (typeof value === 'object') {
33
+ const obj = {};
34
+ for (const [k, v] of Object.entries(value)) {
35
+ obj[k] = buildShape(v);
36
+ }
37
+ return Object.fromEntries(Object.keys(obj)
38
+ .sort()
39
+ .map((k) => [k, obj[k]]));
40
+ }
41
+ return typeof value;
42
+ }
43
+ function bucketKey(server, tool, fingerprint) {
44
+ return `${server}::${tool}::${fingerprint}`;
45
+ }
46
+ function estimateTokens(text) {
47
+ return Math.ceil(text.length / 4);
48
+ }
49
+ export class CostPredictor {
50
+ config;
51
+ buckets = new Map();
52
+ constructor(config = {}) {
53
+ this.config = { ...DEFAULT_COST_PREDICTOR_CONFIG, ...config };
54
+ }
55
+ record(server, tool, args, result) {
56
+ if (!this.config.enabled)
57
+ return;
58
+ const fingerprint = argsShapeFingerprint(args);
59
+ const key = bucketKey(server, tool, fingerprint);
60
+ let bucket = this.buckets.get(key);
61
+ if (!bucket) {
62
+ bucket = { samples: [] };
63
+ this.buckets.set(key, bucket);
64
+ }
65
+ const sample = {
66
+ inputTokens: estimateTokens(result.inputText ?? JSON.stringify(args)),
67
+ outputTokens: estimateTokens(result.outputText),
68
+ latencyMs: result.latencyMs,
69
+ timestamp: Date.now(),
70
+ };
71
+ bucket.samples.push(sample);
72
+ if (bucket.samples.length > this.config.maxSamplesPerBucket) {
73
+ bucket.samples.splice(0, bucket.samples.length - this.config.maxSamplesPerBucket);
74
+ }
75
+ logger.debug('CostPredictor: recorded sample', {
76
+ server,
77
+ tool,
78
+ fingerprint,
79
+ sampleCount: bucket.samples.length,
80
+ });
81
+ }
82
+ predict(server, tool, args) {
83
+ if (!this.config.enabled)
84
+ return null;
85
+ const fingerprint = argsShapeFingerprint(args);
86
+ const key = bucketKey(server, tool, fingerprint);
87
+ const bucket = this.buckets.get(key);
88
+ if (!bucket || bucket.samples.length < this.config.minSamplesForPrediction) {
89
+ return null;
90
+ }
91
+ const n = bucket.samples.length;
92
+ const totalInput = bucket.samples.reduce((s, x) => s + x.inputTokens, 0);
93
+ const totalOutput = bucket.samples.reduce((s, x) => s + x.outputTokens, 0);
94
+ const totalLatency = bucket.samples.reduce((s, x) => s + x.latencyMs, 0);
95
+ return {
96
+ estimatedInputTokens: Math.round(totalInput / n),
97
+ estimatedOutputTokens: Math.round(totalOutput / n),
98
+ estimatedLatencyMs: Math.round(totalLatency / n),
99
+ basedOn: n,
100
+ };
101
+ }
102
+ predictFromCode(code) {
103
+ if (!this.config.enabled)
104
+ return null;
105
+ const allSamples = [];
106
+ for (const bucket of this.buckets.values()) {
107
+ allSamples.push(...bucket.samples);
108
+ }
109
+ if (allSamples.length < this.config.minSamplesForPrediction) {
110
+ return null;
111
+ }
112
+ const inputTokens = estimateTokens(code);
113
+ const n = allSamples.length;
114
+ const avgOutputTokens = Math.round(allSamples.reduce((s, x) => s + x.outputTokens, 0) / n);
115
+ const avgLatency = Math.round(allSamples.reduce((s, x) => s + x.latencyMs, 0) / n);
116
+ return {
117
+ estimatedInputTokens: inputTokens,
118
+ estimatedOutputTokens: avgOutputTokens,
119
+ estimatedLatencyMs: avgLatency,
120
+ basedOn: n,
121
+ };
122
+ }
123
+ getBucketStats() {
124
+ const out = {};
125
+ for (const [k, v] of this.buckets.entries()) {
126
+ out[k] = v.samples.length;
127
+ }
128
+ return out;
129
+ }
130
+ reset() {
131
+ this.buckets.clear();
132
+ }
133
+ }
134
+ // Module-level singleton
135
+ let _instance = null;
136
+ export function getCostPredictor(config) {
137
+ if (!_instance) {
138
+ _instance = new CostPredictor(config);
139
+ }
140
+ return _instance;
141
+ }
142
+ export function shutdownCostPredictor() {
143
+ _instance = null;
144
+ }
145
+ //# sourceMappingURL=cost-predictor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-predictor.js","sourceRoot":"","sources":["../../src/observability/cost-predictor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Hot-Path Profiler
3
+ *
4
+ * Wraps every backend call in a latency tracker and aggregates per (server, tool).
5
+ * Uses a rolling window so old samples expire automatically. Surfaces top-K
6
+ * paths by total time or by p99 latency.
7
+ */
8
+ export interface HotPathConfig {
9
+ enabled: boolean;
10
+ /** Rolling window in milliseconds (default: 1 hour) */
11
+ windowMs: number;
12
+ /** Maximum samples to retain per (server, tool) bucket */
13
+ maxSamplesPerBucket: number;
14
+ }
15
+ export declare const DEFAULT_HOT_PATH_CONFIG: HotPathConfig;
16
+ export interface HotPathEntry {
17
+ server: string;
18
+ tool: string;
19
+ callCount: number;
20
+ totalLatencyMs: number;
21
+ meanLatencyMs: number;
22
+ p99LatencyMs: number;
23
+ }
24
+ export declare class HotPathProfiler {
25
+ private config;
26
+ private buckets;
27
+ constructor(config?: Partial<HotPathConfig>);
28
+ private bucketKey;
29
+ /** Record a completed call with its measured latency. */
30
+ record(server: string, tool: string, latencyMs: number): void;
31
+ /** Evict samples older than windowMs from all buckets. */
32
+ private evictExpired;
33
+ private computeEntry;
34
+ /**
35
+ * Return top-K paths. sortBy controls ranking:
36
+ * 'totalLatency' — highest cumulative cost first (default)
37
+ * 'p99' — highest tail latency first
38
+ * 'callCount' — most called first
39
+ */
40
+ getHotPaths(options?: {
41
+ sinceMs?: number;
42
+ topK?: number;
43
+ sortBy?: 'totalLatency' | 'p99' | 'callCount';
44
+ }): HotPathEntry[];
45
+ reset(): void;
46
+ }
47
+ export declare function getHotPathProfiler(config?: Partial<HotPathConfig>): HotPathProfiler;
48
+ export declare function shutdownHotPathProfiler(): void;
49
+ //# sourceMappingURL=hot-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hot-path.d.ts","sourceRoot":"","sources":["../../src/observability/hot-path.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,eAAO,MAAM,uBAAuB,EAAE,aAIrC,CAAC;AAaF,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB;AAQD,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,OAAO,CAAsC;gBAEzC,MAAM,GAAE,OAAO,CAAC,aAAa,CAAM;IAI/C,OAAO,CAAC,SAAS;IAIjB,yDAAyD;IACzD,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAoB7D,0DAA0D;IAC1D,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,YAAY;IAcpB;;;;;OAKG;IACH,WAAW,CAAC,OAAO,GAAE;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,cAAc,GAAG,KAAK,GAAG,WAAW,CAAC;KAC1C,GAAG,YAAY,EAAE;IAiCvB,KAAK,IAAI,IAAI;CAGd;AAMD,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,eAAe,CAKnF;AAED,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Hot-Path Profiler
3
+ *
4
+ * Wraps every backend call in a latency tracker and aggregates per (server, tool).
5
+ * Uses a rolling window so old samples expire automatically. Surfaces top-K
6
+ * paths by total time or by p99 latency.
7
+ */
8
+ import { logger } from '../utils/index.js';
9
+ export const DEFAULT_HOT_PATH_CONFIG = {
10
+ enabled: true,
11
+ windowMs: 3_600_000,
12
+ maxSamplesPerBucket: 1_000,
13
+ };
14
+ function p99(sorted) {
15
+ if (sorted.length === 0)
16
+ return 0;
17
+ const idx = Math.ceil(sorted.length * 0.99) - 1;
18
+ return sorted[Math.max(0, idx)] ?? 0;
19
+ }
20
+ export class HotPathProfiler {
21
+ config;
22
+ buckets = new Map();
23
+ constructor(config = {}) {
24
+ this.config = { ...DEFAULT_HOT_PATH_CONFIG, ...config };
25
+ }
26
+ bucketKey(server, tool) {
27
+ return `${server}::${tool}`;
28
+ }
29
+ /** Record a completed call with its measured latency. */
30
+ record(server, tool, latencyMs) {
31
+ if (!this.config.enabled)
32
+ return;
33
+ const key = this.bucketKey(server, tool);
34
+ let bucket = this.buckets.get(key);
35
+ if (!bucket) {
36
+ bucket = { server, tool, samples: [] };
37
+ this.buckets.set(key, bucket);
38
+ }
39
+ bucket.samples.push({ latencyMs, timestamp: Date.now() });
40
+ // Trim to max window size
41
+ if (bucket.samples.length > this.config.maxSamplesPerBucket) {
42
+ bucket.samples.splice(0, bucket.samples.length - this.config.maxSamplesPerBucket);
43
+ }
44
+ logger.debug('HotPathProfiler: recorded', { server, tool, latencyMs });
45
+ }
46
+ /** Evict samples older than windowMs from all buckets. */
47
+ evictExpired() {
48
+ const cutoff = Date.now() - this.config.windowMs;
49
+ for (const [key, bucket] of this.buckets.entries()) {
50
+ bucket.samples = bucket.samples.filter((s) => s.timestamp >= cutoff);
51
+ if (bucket.samples.length === 0) {
52
+ this.buckets.delete(key);
53
+ }
54
+ }
55
+ }
56
+ computeEntry(bucket, liveSamples) {
57
+ const latencies = liveSamples.map((s) => s.latencyMs).sort((a, b) => a - b);
58
+ const total = latencies.reduce((s, v) => s + v, 0);
59
+ const n = latencies.length;
60
+ return {
61
+ server: bucket.server,
62
+ tool: bucket.tool,
63
+ callCount: n,
64
+ totalLatencyMs: total,
65
+ meanLatencyMs: n > 0 ? Math.round(total / n) : 0,
66
+ p99LatencyMs: p99(latencies),
67
+ };
68
+ }
69
+ /**
70
+ * Return top-K paths. sortBy controls ranking:
71
+ * 'totalLatency' — highest cumulative cost first (default)
72
+ * 'p99' — highest tail latency first
73
+ * 'callCount' — most called first
74
+ */
75
+ getHotPaths(options = {}) {
76
+ this.evictExpired();
77
+ const { sinceMs, topK = 10, sortBy = 'totalLatency' } = options;
78
+ const cutoff = sinceMs !== undefined ? Date.now() - sinceMs : 0;
79
+ const entries = [];
80
+ for (const bucket of this.buckets.values()) {
81
+ const live = sinceMs !== undefined
82
+ ? bucket.samples.filter((s) => s.timestamp >= cutoff)
83
+ : bucket.samples;
84
+ if (live.length === 0)
85
+ continue;
86
+ entries.push(this.computeEntry(bucket, live));
87
+ }
88
+ // Deterministic sort: primary key, then server+tool as tiebreaker
89
+ entries.sort((a, b) => {
90
+ let diff = 0;
91
+ switch (sortBy) {
92
+ case 'p99':
93
+ diff = b.p99LatencyMs - a.p99LatencyMs;
94
+ break;
95
+ case 'callCount':
96
+ diff = b.callCount - a.callCount;
97
+ break;
98
+ default: diff = b.totalLatencyMs - a.totalLatencyMs;
99
+ }
100
+ if (diff !== 0)
101
+ return diff;
102
+ // Tiebreak by server then tool for stable ordering
103
+ const sk = a.server.localeCompare(b.server);
104
+ if (sk !== 0)
105
+ return sk;
106
+ return a.tool.localeCompare(b.tool);
107
+ });
108
+ return entries.slice(0, topK);
109
+ }
110
+ reset() {
111
+ this.buckets.clear();
112
+ }
113
+ }
114
+ // Module-level singleton
115
+ let _instance = null;
116
+ export function getHotPathProfiler(config) {
117
+ if (!_instance) {
118
+ _instance = new HotPathProfiler(config);
119
+ }
120
+ return _instance;
121
+ }
122
+ export function shutdownHotPathProfiler() {
123
+ _instance = null;
124
+ }
125
+ //# sourceMappingURL=hot-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hot-path.js","sourceRoot":"","sources":["../../src/observability/hot-path.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Observability module barrel
3
+ *
4
+ * Cost prediction, hot-path profiling, anomaly detection, and replay.
5
+ */
6
+ export * from './cost-predictor.js';
7
+ export * from './hot-path.js';
8
+ export * from './anomaly.js';
9
+ export * from './replay.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/observability/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC"}