@newrelic/preflight 0.0.1-pre.1 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (578) hide show
  1. package/LICENSE +183 -0
  2. package/README.md +498 -0
  3. package/dist/alerts/alert-log.d.ts +24 -0
  4. package/dist/alerts/alert-log.d.ts.map +1 -0
  5. package/dist/alerts/alert-log.js +159 -0
  6. package/dist/alerts/alert-log.js.map +1 -0
  7. package/dist/alerts/alert-snapshot-collector.d.ts +168 -0
  8. package/dist/alerts/alert-snapshot-collector.d.ts.map +1 -0
  9. package/dist/alerts/alert-snapshot-collector.js +243 -0
  10. package/dist/alerts/alert-snapshot-collector.js.map +1 -0
  11. package/dist/alerts/local-alert-engine.d.ts +86 -0
  12. package/dist/alerts/local-alert-engine.d.ts.map +1 -0
  13. package/dist/alerts/local-alert-engine.js +466 -0
  14. package/dist/alerts/local-alert-engine.js.map +1 -0
  15. package/dist/alerts/local-alert-rule.d.ts +439 -0
  16. package/dist/alerts/local-alert-rule.d.ts.map +1 -0
  17. package/dist/alerts/local-alert-rule.js +139 -0
  18. package/dist/alerts/local-alert-rule.js.map +1 -0
  19. package/dist/alerts/os-notifier.d.ts +39 -0
  20. package/dist/alerts/os-notifier.d.ts.map +1 -0
  21. package/dist/alerts/os-notifier.js +170 -0
  22. package/dist/alerts/os-notifier.js.map +1 -0
  23. package/dist/alerts/types.d.ts +35 -0
  24. package/dist/alerts/types.d.ts.map +1 -0
  25. package/dist/alerts/types.js +8 -0
  26. package/dist/alerts/types.js.map +1 -0
  27. package/dist/config.d.ts +169 -0
  28. package/dist/config.d.ts.map +1 -0
  29. package/dist/config.js +868 -0
  30. package/dist/config.js.map +1 -0
  31. package/dist/dashboard/dashboard-server.d.ts +38 -0
  32. package/dist/dashboard/dashboard-server.d.ts.map +1 -0
  33. package/dist/dashboard/dashboard-server.js +207 -0
  34. package/dist/dashboard/dashboard-server.js.map +1 -0
  35. package/dist/dashboard/index.d.ts +3 -0
  36. package/dist/dashboard/index.d.ts.map +1 -0
  37. package/dist/dashboard/index.js +2 -0
  38. package/dist/dashboard/index.js.map +1 -0
  39. package/dist/dashboard/live-event-bus.d.ts +99 -0
  40. package/dist/dashboard/live-event-bus.d.ts.map +1 -0
  41. package/dist/dashboard/live-event-bus.js +56 -0
  42. package/dist/dashboard/live-event-bus.js.map +1 -0
  43. package/dist/dashboard/routes/api-handler.d.ts +122 -0
  44. package/dist/dashboard/routes/api-handler.d.ts.map +1 -0
  45. package/dist/dashboard/routes/api-handler.js +1414 -0
  46. package/dist/dashboard/routes/api-handler.js.map +1 -0
  47. package/dist/dashboard/routes/replay-analyzer.d.ts +15 -0
  48. package/dist/dashboard/routes/replay-analyzer.d.ts.map +1 -0
  49. package/dist/dashboard/routes/replay-analyzer.js +227 -0
  50. package/dist/dashboard/routes/replay-analyzer.js.map +1 -0
  51. package/dist/dashboard/routes/sse-handler.d.ts +4 -0
  52. package/dist/dashboard/routes/sse-handler.d.ts.map +1 -0
  53. package/dist/dashboard/routes/sse-handler.js +122 -0
  54. package/dist/dashboard/routes/sse-handler.js.map +1 -0
  55. package/dist/dashboard/routes/static-handler.d.ts +3 -0
  56. package/dist/dashboard/routes/static-handler.d.ts.map +1 -0
  57. package/dist/dashboard/routes/static-handler.js +123 -0
  58. package/dist/dashboard/routes/static-handler.js.map +1 -0
  59. package/dist/data/alerts/conditions/01-daily-cost-spike.json +16 -0
  60. package/dist/data/alerts/conditions/02-low-efficiency-score.json +16 -0
  61. package/dist/data/alerts/conditions/03-stuck-loop-rate.json +16 -0
  62. package/dist/data/alerts/conditions/04-anti-pattern-rate.json +16 -0
  63. package/dist/data/alerts/conditions/05-session-cost-budget.json +16 -0
  64. package/dist/data/alerts/conditions-personal/01-personal-daily-cost.json +16 -0
  65. package/dist/data/alerts/conditions-personal/02-personal-session-cost.json +16 -0
  66. package/dist/data/alerts/conditions-personal/03-personal-low-efficiency.json +16 -0
  67. package/dist/data/alerts/conditions-personal/04-personal-anti-pattern-rate.json +16 -0
  68. package/dist/data/alerts/conditions-personal/05-personal-stuck-loop.json +16 -0
  69. package/dist/data/alerts/policy.json +4 -0
  70. package/dist/data/dashboards/ai-coding-assistant-manager-view.json +103 -0
  71. package/dist/data/dashboards/ai-coding-assistant-overview.json +239 -0
  72. package/dist/data/dashboards/ai-coding-assistant-personal.json +442 -0
  73. package/dist/data/dashboards/ai-coding-assistant-platform-comparison.json +320 -0
  74. package/dist/data/dashboards/ai-coding-assistant-security.json +275 -0
  75. package/dist/data/dashboards/ai-coding-assistant-session-detail.json +296 -0
  76. package/dist/data/dashboards/ai-coding-assistant-team-view.json +345 -0
  77. package/dist/deploy/data-paths.d.ts +22 -0
  78. package/dist/deploy/data-paths.d.ts.map +1 -0
  79. package/dist/deploy/data-paths.js +69 -0
  80. package/dist/deploy/data-paths.js.map +1 -0
  81. package/dist/deploy/deploy-alerts.d.ts +58 -0
  82. package/dist/deploy/deploy-alerts.d.ts.map +1 -0
  83. package/dist/deploy/deploy-alerts.js +371 -0
  84. package/dist/deploy/deploy-alerts.js.map +1 -0
  85. package/dist/deploy/deploy-dashboards.d.ts +92 -0
  86. package/dist/deploy/deploy-dashboards.d.ts.map +1 -0
  87. package/dist/deploy/deploy-dashboards.js +282 -0
  88. package/dist/deploy/deploy-dashboards.js.map +1 -0
  89. package/dist/digest/digest-formatter.d.ts +3 -0
  90. package/dist/digest/digest-formatter.d.ts.map +1 -0
  91. package/dist/digest/digest-formatter.js +37 -0
  92. package/dist/digest/digest-formatter.js.map +1 -0
  93. package/dist/digest/digest-sender.d.ts +2 -0
  94. package/dist/digest/digest-sender.d.ts.map +1 -0
  95. package/dist/digest/digest-sender.js +29 -0
  96. package/dist/digest/digest-sender.js.map +1 -0
  97. package/dist/hooks/bash-classifier.d.ts +26 -0
  98. package/dist/hooks/bash-classifier.d.ts.map +1 -0
  99. package/dist/hooks/bash-classifier.js +409 -0
  100. package/dist/hooks/bash-classifier.js.map +1 -0
  101. package/dist/hooks/collector-script.d.ts +47 -0
  102. package/dist/hooks/collector-script.d.ts.map +1 -0
  103. package/dist/hooks/collector-script.js +662 -0
  104. package/dist/hooks/collector-script.js.map +1 -0
  105. package/dist/hooks/event-processor.d.ts +65 -0
  106. package/dist/hooks/event-processor.d.ts.map +1 -0
  107. package/dist/hooks/event-processor.js +342 -0
  108. package/dist/hooks/event-processor.js.map +1 -0
  109. package/dist/hooks/index.d.ts +7 -0
  110. package/dist/hooks/index.d.ts.map +1 -0
  111. package/dist/hooks/index.js +5 -0
  112. package/dist/hooks/index.js.map +1 -0
  113. package/dist/hooks/session-resolver.d.ts +66 -0
  114. package/dist/hooks/session-resolver.d.ts.map +1 -0
  115. package/dist/hooks/session-resolver.js +196 -0
  116. package/dist/hooks/session-resolver.js.map +1 -0
  117. package/dist/hooks/tool-parsers.d.ts +19 -0
  118. package/dist/hooks/tool-parsers.d.ts.map +1 -0
  119. package/dist/hooks/tool-parsers.js +260 -0
  120. package/dist/hooks/tool-parsers.js.map +1 -0
  121. package/dist/index.d.ts +107 -0
  122. package/dist/index.d.ts.map +1 -0
  123. package/dist/index.js +1505 -0
  124. package/dist/index.js.map +1 -0
  125. package/dist/install/cli.d.ts +11 -0
  126. package/dist/install/cli.d.ts.map +1 -0
  127. package/dist/install/cli.js +365 -0
  128. package/dist/install/cli.js.map +1 -0
  129. package/dist/install/index.d.ts +4 -0
  130. package/dist/install/index.d.ts.map +1 -0
  131. package/dist/install/index.js +3 -0
  132. package/dist/install/index.js.map +1 -0
  133. package/dist/install/install-helper.d.ts +35 -0
  134. package/dist/install/install-helper.d.ts.map +1 -0
  135. package/dist/install/install-helper.js +227 -0
  136. package/dist/install/install-helper.js.map +1 -0
  137. package/dist/install/key-validator.d.ts +19 -0
  138. package/dist/install/key-validator.d.ts.map +1 -0
  139. package/dist/install/key-validator.js +122 -0
  140. package/dist/install/key-validator.js.map +1 -0
  141. package/dist/install/migrate.d.ts +12 -0
  142. package/dist/install/migrate.d.ts.map +1 -0
  143. package/dist/install/migrate.js +115 -0
  144. package/dist/install/migrate.js.map +1 -0
  145. package/dist/install/schedule.d.ts +11 -0
  146. package/dist/install/schedule.d.ts.map +1 -0
  147. package/dist/install/schedule.js +114 -0
  148. package/dist/install/schedule.js.map +1 -0
  149. package/dist/install/setup-wizard.d.ts +40 -0
  150. package/dist/install/setup-wizard.d.ts.map +1 -0
  151. package/dist/install/setup-wizard.js +489 -0
  152. package/dist/install/setup-wizard.js.map +1 -0
  153. package/dist/lib/date.d.ts +54 -0
  154. package/dist/lib/date.d.ts.map +1 -0
  155. package/dist/lib/date.js +85 -0
  156. package/dist/lib/date.js.map +1 -0
  157. package/dist/metrics/anti-patterns.d.ts +62 -0
  158. package/dist/metrics/anti-patterns.d.ts.map +1 -0
  159. package/dist/metrics/anti-patterns.js +301 -0
  160. package/dist/metrics/anti-patterns.js.map +1 -0
  161. package/dist/metrics/api-failure-tracker.d.ts +82 -0
  162. package/dist/metrics/api-failure-tracker.d.ts.map +1 -0
  163. package/dist/metrics/api-failure-tracker.js +202 -0
  164. package/dist/metrics/api-failure-tracker.js.map +1 -0
  165. package/dist/metrics/budget-tracker.d.ts +60 -0
  166. package/dist/metrics/budget-tracker.d.ts.map +1 -0
  167. package/dist/metrics/budget-tracker.js +130 -0
  168. package/dist/metrics/budget-tracker.js.map +1 -0
  169. package/dist/metrics/claudemd-tracker.d.ts +108 -0
  170. package/dist/metrics/claudemd-tracker.d.ts.map +1 -0
  171. package/dist/metrics/claudemd-tracker.js +337 -0
  172. package/dist/metrics/claudemd-tracker.js.map +1 -0
  173. package/dist/metrics/collaboration-profile.d.ts +65 -0
  174. package/dist/metrics/collaboration-profile.d.ts.map +1 -0
  175. package/dist/metrics/collaboration-profile.js +231 -0
  176. package/dist/metrics/collaboration-profile.js.map +1 -0
  177. package/dist/metrics/context-composition-tracker.d.ts +74 -0
  178. package/dist/metrics/context-composition-tracker.d.ts.map +1 -0
  179. package/dist/metrics/context-composition-tracker.js +202 -0
  180. package/dist/metrics/context-composition-tracker.js.map +1 -0
  181. package/dist/metrics/context-tracker.d.ts +78 -0
  182. package/dist/metrics/context-tracker.d.ts.map +1 -0
  183. package/dist/metrics/context-tracker.js +222 -0
  184. package/dist/metrics/context-tracker.js.map +1 -0
  185. package/dist/metrics/context-window-tracker.d.ts +18 -0
  186. package/dist/metrics/context-window-tracker.d.ts.map +1 -0
  187. package/dist/metrics/context-window-tracker.js +35 -0
  188. package/dist/metrics/context-window-tracker.js.map +1 -0
  189. package/dist/metrics/cost-forecast.d.ts +36 -0
  190. package/dist/metrics/cost-forecast.d.ts.map +1 -0
  191. package/dist/metrics/cost-forecast.js +91 -0
  192. package/dist/metrics/cost-forecast.js.map +1 -0
  193. package/dist/metrics/cost-per-outcome.d.ts +102 -0
  194. package/dist/metrics/cost-per-outcome.d.ts.map +1 -0
  195. package/dist/metrics/cost-per-outcome.js +266 -0
  196. package/dist/metrics/cost-per-outcome.js.map +1 -0
  197. package/dist/metrics/cost-tracker.d.ts +78 -0
  198. package/dist/metrics/cost-tracker.d.ts.map +1 -0
  199. package/dist/metrics/cost-tracker.js +169 -0
  200. package/dist/metrics/cost-tracker.js.map +1 -0
  201. package/dist/metrics/decision-tracker.d.ts +49 -0
  202. package/dist/metrics/decision-tracker.d.ts.map +1 -0
  203. package/dist/metrics/decision-tracker.js +161 -0
  204. package/dist/metrics/decision-tracker.js.map +1 -0
  205. package/dist/metrics/efficiency-score.d.ts +80 -0
  206. package/dist/metrics/efficiency-score.d.ts.map +1 -0
  207. package/dist/metrics/efficiency-score.js +219 -0
  208. package/dist/metrics/efficiency-score.js.map +1 -0
  209. package/dist/metrics/git-efficiency-tracker.d.ts +165 -0
  210. package/dist/metrics/git-efficiency-tracker.d.ts.map +1 -0
  211. package/dist/metrics/git-efficiency-tracker.js +1056 -0
  212. package/dist/metrics/git-efficiency-tracker.js.map +1 -0
  213. package/dist/metrics/index.d.ts +26 -0
  214. package/dist/metrics/index.d.ts.map +1 -0
  215. package/dist/metrics/index.js +14 -0
  216. package/dist/metrics/index.js.map +1 -0
  217. package/dist/metrics/instruction-drift-tracker.d.ts +69 -0
  218. package/dist/metrics/instruction-drift-tracker.d.ts.map +1 -0
  219. package/dist/metrics/instruction-drift-tracker.js +213 -0
  220. package/dist/metrics/instruction-drift-tracker.js.map +1 -0
  221. package/dist/metrics/latency-decomposition.d.ts +50 -0
  222. package/dist/metrics/latency-decomposition.d.ts.map +1 -0
  223. package/dist/metrics/latency-decomposition.js +112 -0
  224. package/dist/metrics/latency-decomposition.js.map +1 -0
  225. package/dist/metrics/latency-tracker.d.ts +33 -0
  226. package/dist/metrics/latency-tracker.d.ts.map +1 -0
  227. package/dist/metrics/latency-tracker.js +93 -0
  228. package/dist/metrics/latency-tracker.js.map +1 -0
  229. package/dist/metrics/live-session-registry.d.ts +29 -0
  230. package/dist/metrics/live-session-registry.d.ts.map +1 -0
  231. package/dist/metrics/live-session-registry.js +103 -0
  232. package/dist/metrics/live-session-registry.js.map +1 -0
  233. package/dist/metrics/model-usage-tracker.d.ts +21 -0
  234. package/dist/metrics/model-usage-tracker.d.ts.map +1 -0
  235. package/dist/metrics/model-usage-tracker.js +53 -0
  236. package/dist/metrics/model-usage-tracker.js.map +1 -0
  237. package/dist/metrics/percentile.d.ts +5 -0
  238. package/dist/metrics/percentile.d.ts.map +1 -0
  239. package/dist/metrics/percentile.js +10 -0
  240. package/dist/metrics/percentile.js.map +1 -0
  241. package/dist/metrics/personal-coach.d.ts +47 -0
  242. package/dist/metrics/personal-coach.d.ts.map +1 -0
  243. package/dist/metrics/personal-coach.js +241 -0
  244. package/dist/metrics/personal-coach.js.map +1 -0
  245. package/dist/metrics/prompt-feedback.d.ts +75 -0
  246. package/dist/metrics/prompt-feedback.d.ts.map +1 -0
  247. package/dist/metrics/prompt-feedback.js +286 -0
  248. package/dist/metrics/prompt-feedback.js.map +1 -0
  249. package/dist/metrics/proxy-metrics.d.ts +54 -0
  250. package/dist/metrics/proxy-metrics.d.ts.map +1 -0
  251. package/dist/metrics/proxy-metrics.js +228 -0
  252. package/dist/metrics/proxy-metrics.js.map +1 -0
  253. package/dist/metrics/quality-proxy-tracker.d.ts +51 -0
  254. package/dist/metrics/quality-proxy-tracker.d.ts.map +1 -0
  255. package/dist/metrics/quality-proxy-tracker.js +162 -0
  256. package/dist/metrics/quality-proxy-tracker.js.map +1 -0
  257. package/dist/metrics/recommendation-engine.d.ts +72 -0
  258. package/dist/metrics/recommendation-engine.d.ts.map +1 -0
  259. package/dist/metrics/recommendation-engine.js +207 -0
  260. package/dist/metrics/recommendation-engine.js.map +1 -0
  261. package/dist/metrics/retry-detector.d.ts +43 -0
  262. package/dist/metrics/retry-detector.d.ts.map +1 -0
  263. package/dist/metrics/retry-detector.js +179 -0
  264. package/dist/metrics/retry-detector.js.map +1 -0
  265. package/dist/metrics/session-tracker.d.ts +75 -0
  266. package/dist/metrics/session-tracker.d.ts.map +1 -0
  267. package/dist/metrics/session-tracker.js +249 -0
  268. package/dist/metrics/session-tracker.js.map +1 -0
  269. package/dist/metrics/task-completion-tracker.d.ts +15 -0
  270. package/dist/metrics/task-completion-tracker.d.ts.map +1 -0
  271. package/dist/metrics/task-completion-tracker.js +27 -0
  272. package/dist/metrics/task-completion-tracker.js.map +1 -0
  273. package/dist/metrics/task-detector.d.ts +84 -0
  274. package/dist/metrics/task-detector.d.ts.map +1 -0
  275. package/dist/metrics/task-detector.js +302 -0
  276. package/dist/metrics/task-detector.js.map +1 -0
  277. package/dist/metrics/tool-selection-scorer.d.ts +39 -0
  278. package/dist/metrics/tool-selection-scorer.d.ts.map +1 -0
  279. package/dist/metrics/tool-selection-scorer.js +193 -0
  280. package/dist/metrics/tool-selection-scorer.js.map +1 -0
  281. package/dist/metrics/trend-analyzer.d.ts +92 -0
  282. package/dist/metrics/trend-analyzer.d.ts.map +1 -0
  283. package/dist/metrics/trend-analyzer.js +293 -0
  284. package/dist/metrics/trend-analyzer.js.map +1 -0
  285. package/dist/metrics/turn-cost-attributor.d.ts +41 -0
  286. package/dist/metrics/turn-cost-attributor.d.ts.map +1 -0
  287. package/dist/metrics/turn-cost-attributor.js +118 -0
  288. package/dist/metrics/turn-cost-attributor.js.map +1 -0
  289. package/dist/metrics/turn-tracker.d.ts +49 -0
  290. package/dist/metrics/turn-tracker.d.ts.map +1 -0
  291. package/dist/metrics/turn-tracker.js +192 -0
  292. package/dist/metrics/turn-tracker.js.map +1 -0
  293. package/dist/platforms/amazon-q-adapter.d.ts +10 -0
  294. package/dist/platforms/amazon-q-adapter.d.ts.map +1 -0
  295. package/dist/platforms/amazon-q-adapter.js +75 -0
  296. package/dist/platforms/amazon-q-adapter.js.map +1 -0
  297. package/dist/platforms/claude-code-adapter.d.ts +10 -0
  298. package/dist/platforms/claude-code-adapter.d.ts.map +1 -0
  299. package/dist/platforms/claude-code-adapter.js +48 -0
  300. package/dist/platforms/claude-code-adapter.js.map +1 -0
  301. package/dist/platforms/continue-adapter.d.ts +10 -0
  302. package/dist/platforms/continue-adapter.d.ts.map +1 -0
  303. package/dist/platforms/continue-adapter.js +73 -0
  304. package/dist/platforms/continue-adapter.js.map +1 -0
  305. package/dist/platforms/copilot-adapter.d.ts +37 -0
  306. package/dist/platforms/copilot-adapter.d.ts.map +1 -0
  307. package/dist/platforms/copilot-adapter.js +66 -0
  308. package/dist/platforms/copilot-adapter.js.map +1 -0
  309. package/dist/platforms/cursor-adapter.d.ts +10 -0
  310. package/dist/platforms/cursor-adapter.d.ts.map +1 -0
  311. package/dist/platforms/cursor-adapter.js +60 -0
  312. package/dist/platforms/cursor-adapter.js.map +1 -0
  313. package/dist/platforms/generic-mcp-adapter.d.ts +113 -0
  314. package/dist/platforms/generic-mcp-adapter.d.ts.map +1 -0
  315. package/dist/platforms/generic-mcp-adapter.js +139 -0
  316. package/dist/platforms/generic-mcp-adapter.js.map +1 -0
  317. package/dist/platforms/index.d.ts +15 -0
  318. package/dist/platforms/index.d.ts.map +1 -0
  319. package/dist/platforms/index.js +12 -0
  320. package/dist/platforms/index.js.map +1 -0
  321. package/dist/platforms/platform-registry.d.ts +11 -0
  322. package/dist/platforms/platform-registry.d.ts.map +1 -0
  323. package/dist/platforms/platform-registry.js +54 -0
  324. package/dist/platforms/platform-registry.js.map +1 -0
  325. package/dist/platforms/types.d.ts +36 -0
  326. package/dist/platforms/types.d.ts.map +1 -0
  327. package/dist/platforms/types.js +2 -0
  328. package/dist/platforms/types.js.map +1 -0
  329. package/dist/platforms/windsurf-adapter.d.ts +10 -0
  330. package/dist/platforms/windsurf-adapter.d.ts.map +1 -0
  331. package/dist/platforms/windsurf-adapter.js +63 -0
  332. package/dist/platforms/windsurf-adapter.js.map +1 -0
  333. package/dist/platforms/zed-adapter.d.ts +10 -0
  334. package/dist/platforms/zed-adapter.d.ts.map +1 -0
  335. package/dist/platforms/zed-adapter.js +72 -0
  336. package/dist/platforms/zed-adapter.js.map +1 -0
  337. package/dist/proxy/index.d.ts +7 -0
  338. package/dist/proxy/index.d.ts.map +1 -0
  339. package/dist/proxy/index.js +5 -0
  340. package/dist/proxy/index.js.map +1 -0
  341. package/dist/proxy/otlp-receiver.d.ts +28 -0
  342. package/dist/proxy/otlp-receiver.d.ts.map +1 -0
  343. package/dist/proxy/otlp-receiver.js +319 -0
  344. package/dist/proxy/otlp-receiver.js.map +1 -0
  345. package/dist/proxy/proxy-manager.d.ts +47 -0
  346. package/dist/proxy/proxy-manager.d.ts.map +1 -0
  347. package/dist/proxy/proxy-manager.js +338 -0
  348. package/dist/proxy/proxy-manager.js.map +1 -0
  349. package/dist/proxy/types.d.ts +72 -0
  350. package/dist/proxy/types.d.ts.map +1 -0
  351. package/dist/proxy/types.js +33 -0
  352. package/dist/proxy/types.js.map +1 -0
  353. package/dist/proxy/upstream-http.d.ts +26 -0
  354. package/dist/proxy/upstream-http.d.ts.map +1 -0
  355. package/dist/proxy/upstream-http.js +209 -0
  356. package/dist/proxy/upstream-http.js.map +1 -0
  357. package/dist/proxy/upstream-stdio.d.ts +25 -0
  358. package/dist/proxy/upstream-stdio.d.ts.map +1 -0
  359. package/dist/proxy/upstream-stdio.js +256 -0
  360. package/dist/proxy/upstream-stdio.js.map +1 -0
  361. package/dist/security/audit-trail.d.ts +74 -0
  362. package/dist/security/audit-trail.d.ts.map +1 -0
  363. package/dist/security/audit-trail.js +338 -0
  364. package/dist/security/audit-trail.js.map +1 -0
  365. package/dist/security/index.d.ts +5 -0
  366. package/dist/security/index.d.ts.map +1 -0
  367. package/dist/security/index.js +4 -0
  368. package/dist/security/index.js.map +1 -0
  369. package/dist/security/ssrf.d.ts +2 -0
  370. package/dist/security/ssrf.d.ts.map +1 -0
  371. package/dist/security/ssrf.js +126 -0
  372. package/dist/security/ssrf.js.map +1 -0
  373. package/dist/server.d.ts +14 -0
  374. package/dist/server.d.ts.map +1 -0
  375. package/dist/server.js +117 -0
  376. package/dist/server.js.map +1 -0
  377. package/dist/shared/__test-utils__/log-output.d.ts +49 -0
  378. package/dist/shared/__test-utils__/log-output.d.ts.map +1 -0
  379. package/dist/shared/__test-utils__/log-output.js +38 -0
  380. package/dist/shared/__test-utils__/log-output.js.map +1 -0
  381. package/dist/shared/config.d.ts +56 -0
  382. package/dist/shared/config.d.ts.map +1 -0
  383. package/dist/shared/config.js +290 -0
  384. package/dist/shared/config.js.map +1 -0
  385. package/dist/shared/errors.d.ts +139 -0
  386. package/dist/shared/errors.d.ts.map +1 -0
  387. package/dist/shared/errors.js +406 -0
  388. package/dist/shared/errors.js.map +1 -0
  389. package/dist/shared/events/factory.d.ts +143 -0
  390. package/dist/shared/events/factory.d.ts.map +1 -0
  391. package/dist/shared/events/factory.js +351 -0
  392. package/dist/shared/events/factory.js.map +1 -0
  393. package/dist/shared/events/index.d.ts +6 -0
  394. package/dist/shared/events/index.d.ts.map +1 -0
  395. package/dist/shared/events/index.js +3 -0
  396. package/dist/shared/events/index.js.map +1 -0
  397. package/dist/shared/events/serialize.d.ts +87 -0
  398. package/dist/shared/events/serialize.d.ts.map +1 -0
  399. package/dist/shared/events/serialize.js +510 -0
  400. package/dist/shared/events/serialize.js.map +1 -0
  401. package/dist/shared/events/types.d.ts +139 -0
  402. package/dist/shared/events/types.d.ts.map +1 -0
  403. package/dist/shared/events/types.js +2 -0
  404. package/dist/shared/events/types.js.map +1 -0
  405. package/dist/shared/harvest/event-buffer.d.ts +59 -0
  406. package/dist/shared/harvest/event-buffer.d.ts.map +1 -0
  407. package/dist/shared/harvest/event-buffer.js +100 -0
  408. package/dist/shared/harvest/event-buffer.js.map +1 -0
  409. package/dist/shared/harvest/harvest-scheduler.d.ts +200 -0
  410. package/dist/shared/harvest/harvest-scheduler.d.ts.map +1 -0
  411. package/dist/shared/harvest/harvest-scheduler.js +647 -0
  412. package/dist/shared/harvest/harvest-scheduler.js.map +1 -0
  413. package/dist/shared/harvest/index.d.ts +7 -0
  414. package/dist/shared/harvest/index.d.ts.map +1 -0
  415. package/dist/shared/harvest/index.js +4 -0
  416. package/dist/shared/harvest/index.js.map +1 -0
  417. package/dist/shared/harvest/metric-aggregator.d.ts +115 -0
  418. package/dist/shared/harvest/metric-aggregator.d.ts.map +1 -0
  419. package/dist/shared/harvest/metric-aggregator.js +247 -0
  420. package/dist/shared/harvest/metric-aggregator.js.map +1 -0
  421. package/dist/shared/index.d.ts +22 -0
  422. package/dist/shared/index.d.ts.map +1 -0
  423. package/dist/shared/index.js +13 -0
  424. package/dist/shared/index.js.map +1 -0
  425. package/dist/shared/logger.d.ts +57 -0
  426. package/dist/shared/logger.d.ts.map +1 -0
  427. package/dist/shared/logger.js +166 -0
  428. package/dist/shared/logger.js.map +1 -0
  429. package/dist/shared/pricing-data.d.ts +4 -0
  430. package/dist/shared/pricing-data.d.ts.map +1 -0
  431. package/dist/shared/pricing-data.js +473 -0
  432. package/dist/shared/pricing-data.js.map +1 -0
  433. package/dist/shared/pricing.d.ts +148 -0
  434. package/dist/shared/pricing.d.ts.map +1 -0
  435. package/dist/shared/pricing.js +528 -0
  436. package/dist/shared/pricing.js.map +1 -0
  437. package/dist/shared/redact.d.ts +33 -0
  438. package/dist/shared/redact.d.ts.map +1 -0
  439. package/dist/shared/redact.js +110 -0
  440. package/dist/shared/redact.js.map +1 -0
  441. package/dist/shared/timing.d.ts +96 -0
  442. package/dist/shared/timing.d.ts.map +1 -0
  443. package/dist/shared/timing.js +173 -0
  444. package/dist/shared/timing.js.map +1 -0
  445. package/dist/shared/tokens.d.ts +145 -0
  446. package/dist/shared/tokens.d.ts.map +1 -0
  447. package/dist/shared/tokens.js +492 -0
  448. package/dist/shared/tokens.js.map +1 -0
  449. package/dist/shared/transport/events-api.d.ts +14 -0
  450. package/dist/shared/transport/events-api.d.ts.map +1 -0
  451. package/dist/shared/transport/events-api.js +29 -0
  452. package/dist/shared/transport/events-api.js.map +1 -0
  453. package/dist/shared/transport/http-client.d.ts +49 -0
  454. package/dist/shared/transport/http-client.d.ts.map +1 -0
  455. package/dist/shared/transport/http-client.js +381 -0
  456. package/dist/shared/transport/http-client.js.map +1 -0
  457. package/dist/shared/transport/index.d.ts +10 -0
  458. package/dist/shared/transport/index.d.ts.map +1 -0
  459. package/dist/shared/transport/index.js +6 -0
  460. package/dist/shared/transport/index.js.map +1 -0
  461. package/dist/shared/transport/logs-api.d.ts +29 -0
  462. package/dist/shared/transport/logs-api.d.ts.map +1 -0
  463. package/dist/shared/transport/logs-api.js +40 -0
  464. package/dist/shared/transport/logs-api.js.map +1 -0
  465. package/dist/shared/transport/metric-api.d.ts +9 -0
  466. package/dist/shared/transport/metric-api.d.ts.map +1 -0
  467. package/dist/shared/transport/metric-api.js +39 -0
  468. package/dist/shared/transport/metric-api.js.map +1 -0
  469. package/dist/shared/transport/otlp-event-bridge.d.ts +22 -0
  470. package/dist/shared/transport/otlp-event-bridge.d.ts.map +1 -0
  471. package/dist/shared/transport/otlp-event-bridge.js +50 -0
  472. package/dist/shared/transport/otlp-event-bridge.js.map +1 -0
  473. package/dist/shared/transport/otlp-shared.d.ts +14 -0
  474. package/dist/shared/transport/otlp-shared.d.ts.map +1 -0
  475. package/dist/shared/transport/otlp-shared.js +49 -0
  476. package/dist/shared/transport/otlp-shared.js.map +1 -0
  477. package/dist/shared/transport/otlp-transport.d.ts +58 -0
  478. package/dist/shared/transport/otlp-transport.d.ts.map +1 -0
  479. package/dist/shared/transport/otlp-transport.js +236 -0
  480. package/dist/shared/transport/otlp-transport.js.map +1 -0
  481. package/dist/shared/transport/types.d.ts +129 -0
  482. package/dist/shared/transport/types.d.ts.map +1 -0
  483. package/dist/shared/transport/types.js +2 -0
  484. package/dist/shared/transport/types.js.map +1 -0
  485. package/dist/shared/version.d.ts +2 -0
  486. package/dist/shared/version.d.ts.map +1 -0
  487. package/dist/shared/version.js +2 -0
  488. package/dist/shared/version.js.map +1 -0
  489. package/dist/storage/index.d.ts +7 -0
  490. package/dist/storage/index.d.ts.map +1 -0
  491. package/dist/storage/index.js +4 -0
  492. package/dist/storage/index.js.map +1 -0
  493. package/dist/storage/local-store.d.ts +153 -0
  494. package/dist/storage/local-store.d.ts.map +1 -0
  495. package/dist/storage/local-store.js +719 -0
  496. package/dist/storage/local-store.js.map +1 -0
  497. package/dist/storage/retention.d.ts +2 -0
  498. package/dist/storage/retention.d.ts.map +1 -0
  499. package/dist/storage/retention.js +53 -0
  500. package/dist/storage/retention.js.map +1 -0
  501. package/dist/storage/session-store.d.ts +97 -0
  502. package/dist/storage/session-store.d.ts.map +1 -0
  503. package/dist/storage/session-store.js +391 -0
  504. package/dist/storage/session-store.js.map +1 -0
  505. package/dist/storage/types.d.ts +64 -0
  506. package/dist/storage/types.d.ts.map +1 -0
  507. package/dist/storage/types.js +2 -0
  508. package/dist/storage/types.js.map +1 -0
  509. package/dist/storage/weekly-summary.d.ts +61 -0
  510. package/dist/storage/weekly-summary.d.ts.map +1 -0
  511. package/dist/storage/weekly-summary.js +243 -0
  512. package/dist/storage/weekly-summary.js.map +1 -0
  513. package/dist/tools/analytics-tools.d.ts +101 -0
  514. package/dist/tools/analytics-tools.d.ts.map +1 -0
  515. package/dist/tools/analytics-tools.js +71 -0
  516. package/dist/tools/analytics-tools.js.map +1 -0
  517. package/dist/tools/cost-tools.d.ts +121 -0
  518. package/dist/tools/cost-tools.d.ts.map +1 -0
  519. package/dist/tools/cost-tools.js +174 -0
  520. package/dist/tools/cost-tools.js.map +1 -0
  521. package/dist/tools/cross-session-tools.d.ts +376 -0
  522. package/dist/tools/cross-session-tools.d.ts.map +1 -0
  523. package/dist/tools/cross-session-tools.js +820 -0
  524. package/dist/tools/cross-session-tools.js.map +1 -0
  525. package/dist/tools/extended-analytics-tools.d.ts +164 -0
  526. package/dist/tools/extended-analytics-tools.d.ts.map +1 -0
  527. package/dist/tools/extended-analytics-tools.js +121 -0
  528. package/dist/tools/extended-analytics-tools.js.map +1 -0
  529. package/dist/tools/index.d.ts +7 -0
  530. package/dist/tools/index.d.ts.map +1 -0
  531. package/dist/tools/index.js +4 -0
  532. package/dist/tools/index.js.map +1 -0
  533. package/dist/tools/session-stats.d.ts +162 -0
  534. package/dist/tools/session-stats.d.ts.map +1 -0
  535. package/dist/tools/session-stats.js +1054 -0
  536. package/dist/tools/session-stats.js.map +1 -0
  537. package/dist/tools/workflow-tools.d.ts +126 -0
  538. package/dist/tools/workflow-tools.d.ts.map +1 -0
  539. package/dist/tools/workflow-tools.js +274 -0
  540. package/dist/tools/workflow-tools.js.map +1 -0
  541. package/dist/tracing/mcp-tracer.d.ts +4 -0
  542. package/dist/tracing/mcp-tracer.d.ts.map +1 -0
  543. package/dist/tracing/mcp-tracer.js +14 -0
  544. package/dist/tracing/mcp-tracer.js.map +1 -0
  545. package/dist/tracing/session-span.d.ts +14 -0
  546. package/dist/tracing/session-span.d.ts.map +1 -0
  547. package/dist/tracing/session-span.js +53 -0
  548. package/dist/tracing/session-span.js.map +1 -0
  549. package/dist/tracing/task-span-tracker.d.ts +11 -0
  550. package/dist/tracing/task-span-tracker.d.ts.map +1 -0
  551. package/dist/tracing/task-span-tracker.js +59 -0
  552. package/dist/tracing/task-span-tracker.js.map +1 -0
  553. package/dist/tracing/tool-call-span.d.ts +4 -0
  554. package/dist/tracing/tool-call-span.d.ts.map +1 -0
  555. package/dist/tracing/tool-call-span.js +60 -0
  556. package/dist/tracing/tool-call-span.js.map +1 -0
  557. package/dist/transport/index.d.ts +3 -0
  558. package/dist/transport/index.d.ts.map +1 -0
  559. package/dist/transport/index.js +2 -0
  560. package/dist/transport/index.js.map +1 -0
  561. package/dist/transport/log-ingest.d.ts +42 -0
  562. package/dist/transport/log-ingest.d.ts.map +1 -0
  563. package/dist/transport/log-ingest.js +151 -0
  564. package/dist/transport/log-ingest.js.map +1 -0
  565. package/dist/transport/nr-ingest.d.ts +171 -0
  566. package/dist/transport/nr-ingest.d.ts.map +1 -0
  567. package/dist/transport/nr-ingest.js +659 -0
  568. package/dist/transport/nr-ingest.js.map +1 -0
  569. package/dist/types.d.ts +45 -0
  570. package/dist/types.d.ts.map +1 -0
  571. package/dist/types.js +2 -0
  572. package/dist/types.js.map +1 -0
  573. package/dist/web/assets/index-BrL281N-.css +2 -0
  574. package/dist/web/assets/index-CcaYZzXm.js +42 -0
  575. package/dist/web/favicon.svg +15 -0
  576. package/dist/web/index.html +15 -0
  577. package/examples/local-alert-rules.json +106 -0
  578. package/package.json +129 -1
@@ -0,0 +1,1054 @@
1
+ /**
2
+ * MCP tool handlers for session observability and cost tracking.
3
+ *
4
+ * Registers tools based on which trackers are provided:
5
+ * - nr_observe_get_session_stats — current session metrics snapshot
6
+ * - nr_observe_get_session_timeline — recent tool call timeline
7
+ * - nr_observe_report_tokens — self-report token usage for cost tracking
8
+ */
9
+ import { ListToolsRequestSchema, CallToolRequestSchema, ErrorCode, McpError, } from '@modelcontextprotocol/sdk/types.js';
10
+ import { z } from 'zod';
11
+ import { createLogger, VERSION } from '../shared/index.js';
12
+ const logger = createLogger('session-stats');
13
+ import { REPORT_TOKENS_TOOL, handleReportTokens, COST_BREAKDOWN_TOOL, handleGetCostBreakdown, BUDGET_STATUS_TOOL, COST_FORECAST_TOOL, handleGetBudgetStatus, handleGetCostForecast, } from './cost-tools.js';
14
+ import { WORKFLOW_TRACE_TOOL, ANTI_PATTERNS_TOOL, EFFICIENCY_SCORE_TOOL, REPORT_FEEDBACK_TOOL, handleGetWorkflowTrace, handleGetAntiPatterns, handleGetEfficiencyScore, handleReportFeedback, } from './workflow-tools.js';
15
+ import { SESSION_HISTORY_TOOL, WEEKLY_SUMMARY_TOOL, TRENDS_TOOL, COLLABORATION_PROFILE_TOOL, CLAUDEMD_IMPACT_TOOL, COST_PER_OUTCOME_TOOL, RECOMMENDATIONS_TOOL, PLATFORM_COMPARISON_TOOL, TEAM_SUMMARY_TOOL, SUBSCRIBE_DIGEST_TOOL, UNSUBSCRIBE_DIGEST_TOOL, SEND_DIGEST_TOOL, PERSONAL_INSIGHTS_TOOL, handleGetSessionHistory, handleGetWeeklySummary, handleGetTrends, handleGetCollaborationProfile, handleGetClaudeMdImpact, handleGetCostPerOutcome, handleGetRecommendations, handleGetPlatformComparison, handleGetTeamSummary, handleSubscribeDigest, handleUnsubscribeDigest, handleSendDigest, handleGetPersonalInsights, } from './cross-session-tools.js';
16
+ import { CONTEXT_EFFICIENCY_TOOL, CONTEXT_TRACKING_TOOL, LATENCY_PERCENTILES_TOOL, TASK_COMPLETION_TOOL, MODEL_USAGE_TOOL, handleGetContextEfficiency, handleGetContextTracking, handleGetLatencyPercentiles, handleGetTaskCompletionRate, handleGetModelUsage, } from './analytics-tools.js';
17
+ import { RETRY_ALERTS_TOOL, CONTEXT_COMPOSITION_TOOL, LATENCY_DECOMPOSITION_TOOL, DECISION_TREE_TOOL, INSTRUCTION_DRIFT_TOOL, TOOL_SELECTION_SCORE_TOOL, QUALITY_PROXY_TOOL, API_FAILURES_TOOL, handleGetRetryAlerts, handleGetContextComposition, handleGetLatencyDecomposition, handleGetDecisionTree, handleGetInstructionDrift, handleGetToolSelectionScore, handleGetQualityProxy, handleGetApiFailures, } from './extended-analytics-tools.js';
18
+ // ---------------------------------------------------------------------------
19
+ // Tool definitions (for tools/list)
20
+ // ---------------------------------------------------------------------------
21
+ const SESSION_STATS_TOOL = {
22
+ name: 'nr_observe_get_session_stats',
23
+ description: 'Get current session observability metrics: tool call counts, success rates, file access stats, and duration summaries.',
24
+ inputSchema: {
25
+ type: 'object',
26
+ properties: {},
27
+ },
28
+ annotations: { readOnlyHint: true },
29
+ };
30
+ const HEALTH_TOOL = {
31
+ name: 'nr_observe_health',
32
+ description: 'Check server health: version, uptime, session ID, and connection timestamp. Use when the MCP connection feels stale or tools are behaving unexpectedly.',
33
+ inputSchema: {
34
+ type: 'object',
35
+ properties: {},
36
+ },
37
+ annotations: { readOnlyHint: true },
38
+ };
39
+ const CONFIG_TOOL = {
40
+ name: 'nr_observe_get_config',
41
+ description: 'Show the current server configuration (sensitive fields masked): mode, developer, account, region, storage path, dashboard URL, and config file location. Use to diagnose misconfiguration without exposing credentials.',
42
+ inputSchema: {
43
+ type: 'object',
44
+ properties: {},
45
+ },
46
+ annotations: { readOnlyHint: true },
47
+ };
48
+ const SESSION_TIMELINE_TOOL = {
49
+ name: 'nr_observe_get_session_timeline',
50
+ description: 'Get an ordered list of recent tool calls with timestamps, names, durations, and success/failure status.',
51
+ inputSchema: {
52
+ type: 'object',
53
+ properties: {
54
+ last_n: {
55
+ type: 'number',
56
+ description: 'Number of most recent tool calls to return (default: 20)',
57
+ },
58
+ },
59
+ },
60
+ annotations: { readOnlyHint: true },
61
+ };
62
+ const COST_PER_TOOL_TOOL = {
63
+ name: 'nr_observe_get_cost_per_tool',
64
+ description: 'Cost attribution per tool type — approximate, based on turn-level token correlation. Shows which tools cost the most and average cost per call.',
65
+ inputSchema: {
66
+ type: 'object',
67
+ properties: {},
68
+ },
69
+ annotations: { readOnlyHint: true },
70
+ };
71
+ const TURN_ANALYSIS_TOOL = {
72
+ name: 'nr_observe_get_turn_analysis',
73
+ description: 'Conversation turn analysis — groups tool calls by AI response, shows parallelism and turn patterns.',
74
+ inputSchema: {
75
+ type: 'object',
76
+ properties: {},
77
+ },
78
+ annotations: { readOnlyHint: true },
79
+ };
80
+ // ---------------------------------------------------------------------------
81
+ // Handlers
82
+ // ---------------------------------------------------------------------------
83
+ export function handleGetSessionStats(sessionTracker, sessionTraceId) {
84
+ const metrics = sessionTracker.getMetrics();
85
+ // Compute average tool duration across all tools
86
+ let totalDurationSum = 0;
87
+ let totalDurationCount = 0;
88
+ for (const stats of Object.values(metrics.toolDurationMsByTool)) {
89
+ totalDurationSum += stats.sum;
90
+ totalDurationCount += stats.count;
91
+ }
92
+ const avgToolDurationMs = totalDurationCount > 0 ? Math.round(totalDurationSum / totalDurationCount) : 0;
93
+ const stats = {
94
+ session_trace_id: sessionTraceId ?? null,
95
+ session_id: metrics.sessionId,
96
+ session_name: metrics.sessionName ?? null,
97
+ session_duration_ms: metrics.sessionDurationMs,
98
+ tool_calls: metrics.toolCallCount,
99
+ tool_calls_by_type: metrics.toolCallCountByTool,
100
+ success_rate: metrics.toolSuccessRate,
101
+ failed_calls: metrics.toolErrorCount,
102
+ unique_files_read: metrics.uniqueFilesRead,
103
+ unique_files_modified: metrics.uniqueFilesWritten,
104
+ bash_commands_run: metrics.bashCommandsRun,
105
+ bash_calls_by_category: metrics.bashCallsByCategory,
106
+ search_queries: metrics.searchQueries,
107
+ avg_tool_duration_ms: avgToolDurationMs,
108
+ };
109
+ return {
110
+ _stats: stats, // raw object for callers that need to merge without re-parsing
111
+ content: [{ type: 'text', text: JSON.stringify(stats, null, 2) }],
112
+ };
113
+ }
114
+ export function handleGetSessionTimeline(sessionTracker, lastN = 20) {
115
+ const metrics = sessionTracker.getMetrics();
116
+ const safeN = Math.max(1, Math.min(Math.floor(lastN), 10_000));
117
+ const entries = metrics.toolCallTimeline.slice(-safeN);
118
+ const timeline = entries.map((entry) => ({
119
+ timestamp: new Date(entry.timestamp).toISOString(),
120
+ tool: entry.toolName,
121
+ duration_ms: entry.durationMs,
122
+ success: entry.success,
123
+ }));
124
+ return {
125
+ content: [{ type: 'text', text: JSON.stringify({ timeline }, null, 2) }],
126
+ };
127
+ }
128
+ export function handleHealth(options) {
129
+ const nowMs = Date.now();
130
+ const startMs = options.sessionStartMs ?? nowMs;
131
+ return {
132
+ content: [
133
+ {
134
+ type: 'text',
135
+ text: JSON.stringify({
136
+ status: 'ok',
137
+ version: VERSION,
138
+ developer: options.developer ?? 'unknown',
139
+ session_id: options.sessionId ?? null,
140
+ connected_at: new Date(startMs).toISOString(),
141
+ uptime_seconds: Math.round((nowMs - startMs) / 1000),
142
+ }, null, 2),
143
+ },
144
+ ],
145
+ };
146
+ }
147
+ export function handleGetConfig(configSummary) {
148
+ return {
149
+ content: [
150
+ {
151
+ type: 'text',
152
+ text: JSON.stringify(configSummary, null, 2),
153
+ },
154
+ ],
155
+ };
156
+ }
157
+ // ---------------------------------------------------------------------------
158
+ // Git Efficiency tool definition
159
+ // ---------------------------------------------------------------------------
160
+ const GIT_EFFICIENCY_TOOL = {
161
+ name: 'nr_observe_get_git_efficiency',
162
+ description: 'Get Git workflow efficiency metrics: merge conflicts, aborted operations, force pushes, stale branch detection, and actionable suggestions to reduce Git friction.',
163
+ inputSchema: {
164
+ type: 'object',
165
+ properties: {},
166
+ },
167
+ annotations: { readOnlyHint: true },
168
+ };
169
+ export function handleGetGitEfficiency(tracker) {
170
+ return {
171
+ content: [
172
+ {
173
+ type: 'text',
174
+ text: JSON.stringify(tracker.getMetrics(), null, 2),
175
+ },
176
+ ],
177
+ };
178
+ }
179
+ // ---------------------------------------------------------------------------
180
+ // Input validation schemas
181
+ // ---------------------------------------------------------------------------
182
+ const TokenReportSchema = z.object({
183
+ model: z.string().min(1),
184
+ input_tokens: z.number().nonnegative(),
185
+ output_tokens: z.number().nonnegative(),
186
+ cache_creation_tokens: z.number().nonnegative().optional(),
187
+ cache_read_tokens: z.number().nonnegative().optional(),
188
+ thinking_tokens: z.number().nonnegative().optional(),
189
+ });
190
+ const FeedbackSchema = z.object({
191
+ quality: z.enum(['good', 'bad', 'neutral']),
192
+ task_id: z.string().optional(),
193
+ notes: z.string().optional(),
194
+ });
195
+ // ---------------------------------------------------------------------------
196
+ // Registration
197
+ // ---------------------------------------------------------------------------
198
+ /**
199
+ * @deprecated Use `registerTools()` instead. Kept for backward compatibility.
200
+ */
201
+ export function registerSessionTools(server, sessionTracker) {
202
+ registerTools(server, { sessionTracker: sessionTracker });
203
+ }
204
+ /**
205
+ * Pre-resolution stand-in: registers `tools/list` with just the health and
206
+ * config tools, and a `tools/call` handler that returns a structured "session
207
+ * not yet resolved" error for everything else. Replaced by `registerTools()`
208
+ * once the Claude Code session_id is known.
209
+ */
210
+ export function registerPendingTools(server, options) {
211
+ const tools = [HEALTH_TOOL];
212
+ if (options.configSummary)
213
+ tools.push(CONFIG_TOOL);
214
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools }));
215
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
216
+ const { name } = request.params;
217
+ if (name === 'nr_observe_health') {
218
+ return handleHealth({
219
+ sessionStartMs: options.sessionStartMs,
220
+ developer: options.developer,
221
+ sessionId: undefined,
222
+ });
223
+ }
224
+ if (name === 'nr_observe_get_config' && options.configSummary) {
225
+ return handleGetConfig(options.configSummary);
226
+ }
227
+ return {
228
+ content: [
229
+ {
230
+ type: 'text',
231
+ text: JSON.stringify({
232
+ error: 'session_id not yet resolved',
233
+ hint: 'Make any tool call (Bash, Read, etc.) to write the session breadcrumb. If only nr_observe_health and nr_observe_get_config are still visible after a tool call, exit and start a new Claude Code session — hooks installed during a running session do not take effect until a fresh start.',
234
+ }),
235
+ },
236
+ ],
237
+ isError: true,
238
+ };
239
+ });
240
+ }
241
+ export function registerTools(server, options) {
242
+ const { sessionTracker, costTracker, budgetTracker, taskDetector, antiPatternDetector, efficiencyScorer, feedbackCollector, sessionStore, weeklySummaryGenerator, trendAnalyzer, collaborationProfiler, claudeMdTracker, costPerOutcomeAnalyzer, recommendationEngine, contextWindowTracker, contextTracker, latencyTracker, taskCompletionTracker, modelUsageTracker, retryDetector, contextCompositionTracker, latencyDecompositionTracker, decisionTracker, instructionDriftTracker, toolSelectionScorer, qualityProxyTracker, apiFailureTracker, turnCostAttributor, turnTracker, gitEfficiencyTracker, sessionTraceId, sessionStartMs, } = options;
243
+ // Build combined tool list
244
+ const tools = [HEALTH_TOOL];
245
+ if (options.configSummary) {
246
+ tools.push(CONFIG_TOOL);
247
+ }
248
+ if (sessionTracker) {
249
+ tools.push(SESSION_STATS_TOOL, SESSION_TIMELINE_TOOL);
250
+ }
251
+ if (costTracker) {
252
+ tools.push(REPORT_TOKENS_TOOL, COST_BREAKDOWN_TOOL);
253
+ }
254
+ if (budgetTracker) {
255
+ tools.push(BUDGET_STATUS_TOOL);
256
+ }
257
+ if (costTracker && sessionStartMs !== undefined) {
258
+ tools.push(COST_FORECAST_TOOL);
259
+ }
260
+ if (taskDetector) {
261
+ tools.push(WORKFLOW_TRACE_TOOL);
262
+ }
263
+ if (antiPatternDetector && taskDetector) {
264
+ tools.push(ANTI_PATTERNS_TOOL);
265
+ }
266
+ if (efficiencyScorer) {
267
+ tools.push(EFFICIENCY_SCORE_TOOL);
268
+ }
269
+ if (feedbackCollector) {
270
+ tools.push(REPORT_FEEDBACK_TOOL);
271
+ }
272
+ // Cross-session tools — each registered only when its specific dependencies exist
273
+ if (sessionStore) {
274
+ tools.push(SESSION_HISTORY_TOOL, PLATFORM_COMPARISON_TOOL);
275
+ }
276
+ if (weeklySummaryGenerator) {
277
+ tools.push(WEEKLY_SUMMARY_TOOL);
278
+ }
279
+ if (trendAnalyzer) {
280
+ tools.push(TRENDS_TOOL);
281
+ }
282
+ if (collaborationProfiler) {
283
+ tools.push(COLLABORATION_PROFILE_TOOL);
284
+ }
285
+ if (claudeMdTracker) {
286
+ tools.push(CLAUDEMD_IMPACT_TOOL);
287
+ }
288
+ if (costPerOutcomeAnalyzer && taskDetector) {
289
+ tools.push(COST_PER_OUTCOME_TOOL);
290
+ }
291
+ if (recommendationEngine) {
292
+ tools.push(RECOMMENDATIONS_TOOL);
293
+ }
294
+ if (options.teamId && options.nrApiKey) {
295
+ tools.push(TEAM_SUMMARY_TOOL);
296
+ }
297
+ if (options.configFilePath) {
298
+ tools.push(SUBSCRIBE_DIGEST_TOOL, UNSUBSCRIBE_DIGEST_TOOL);
299
+ }
300
+ if (options.configFilePath && weeklySummaryGenerator) {
301
+ tools.push(SEND_DIGEST_TOOL);
302
+ }
303
+ if (weeklySummaryGenerator && options.developer) {
304
+ tools.push(PERSONAL_INSIGHTS_TOOL);
305
+ }
306
+ if (contextWindowTracker) {
307
+ tools.push(CONTEXT_EFFICIENCY_TOOL);
308
+ }
309
+ if (contextTracker) {
310
+ tools.push(CONTEXT_TRACKING_TOOL);
311
+ }
312
+ if (latencyTracker) {
313
+ tools.push(LATENCY_PERCENTILES_TOOL);
314
+ }
315
+ if (taskCompletionTracker) {
316
+ tools.push(TASK_COMPLETION_TOOL);
317
+ }
318
+ if (modelUsageTracker) {
319
+ tools.push(MODEL_USAGE_TOOL);
320
+ }
321
+ if (retryDetector) {
322
+ tools.push(RETRY_ALERTS_TOOL);
323
+ }
324
+ if (contextCompositionTracker) {
325
+ tools.push(CONTEXT_COMPOSITION_TOOL);
326
+ }
327
+ if (latencyDecompositionTracker) {
328
+ tools.push(LATENCY_DECOMPOSITION_TOOL);
329
+ }
330
+ if (decisionTracker) {
331
+ tools.push(DECISION_TREE_TOOL);
332
+ }
333
+ if (instructionDriftTracker) {
334
+ tools.push(INSTRUCTION_DRIFT_TOOL);
335
+ }
336
+ if (toolSelectionScorer && options.toolCallBuffer) {
337
+ tools.push(TOOL_SELECTION_SCORE_TOOL);
338
+ }
339
+ if (qualityProxyTracker) {
340
+ tools.push(QUALITY_PROXY_TOOL);
341
+ }
342
+ if (apiFailureTracker) {
343
+ tools.push(API_FAILURES_TOOL);
344
+ }
345
+ if (gitEfficiencyTracker) {
346
+ tools.push(GIT_EFFICIENCY_TOOL);
347
+ }
348
+ if (turnCostAttributor) {
349
+ tools.push(COST_PER_TOOL_TOOL);
350
+ }
351
+ if (turnTracker) {
352
+ tools.push(TURN_ANALYSIS_TOOL);
353
+ }
354
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools }));
355
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
356
+ const { name, arguments: args } = request.params;
357
+ try {
358
+ switch (name) {
359
+ case 'nr_observe_health': {
360
+ return handleHealth({
361
+ sessionStartMs,
362
+ developer: options.developer,
363
+ sessionId: sessionTracker?.getMetrics().sessionId,
364
+ });
365
+ }
366
+ case 'nr_observe_get_config': {
367
+ if (!options.configSummary) {
368
+ return {
369
+ content: [
370
+ {
371
+ type: 'text',
372
+ text: JSON.stringify({ error: 'Config summary not available' }),
373
+ },
374
+ ],
375
+ isError: true,
376
+ };
377
+ }
378
+ return handleGetConfig(options.configSummary);
379
+ }
380
+ case 'nr_observe_get_session_stats': {
381
+ if (!sessionTracker) {
382
+ return {
383
+ content: [
384
+ {
385
+ type: 'text',
386
+ text: JSON.stringify({ error: 'SessionTracker not available' }),
387
+ },
388
+ ],
389
+ isError: true,
390
+ };
391
+ }
392
+ const result = handleGetSessionStats(sessionTracker, sessionTraceId);
393
+ // Use the raw stats object directly to avoid a JSON parse/stringify round-trip.
394
+ const stats = result._stats;
395
+ return {
396
+ content: [
397
+ {
398
+ type: 'text',
399
+ text: JSON.stringify({
400
+ identity: {
401
+ developer: options.developer ?? 'unknown',
402
+ teamId: options.teamId ?? null,
403
+ projectId: options.projectId ?? null,
404
+ },
405
+ ...stats,
406
+ }, null, 2),
407
+ },
408
+ ],
409
+ };
410
+ }
411
+ case 'nr_observe_get_session_timeline': {
412
+ if (!sessionTracker) {
413
+ return {
414
+ content: [
415
+ {
416
+ type: 'text',
417
+ text: JSON.stringify({ error: 'SessionTracker not available' }),
418
+ },
419
+ ],
420
+ isError: true,
421
+ };
422
+ }
423
+ const lastN = args?.last_n;
424
+ return handleGetSessionTimeline(sessionTracker, typeof lastN === 'number' ? lastN : 20);
425
+ }
426
+ case 'nr_observe_report_tokens': {
427
+ if (!costTracker) {
428
+ return {
429
+ content: [
430
+ {
431
+ type: 'text',
432
+ text: JSON.stringify({ error: 'CostTracker not available' }),
433
+ },
434
+ ],
435
+ isError: true,
436
+ };
437
+ }
438
+ try {
439
+ const tokenReport = TokenReportSchema.parse(args);
440
+ return handleReportTokens(costTracker, tokenReport, modelUsageTracker);
441
+ }
442
+ catch (err) {
443
+ const message = err instanceof z.ZodError
444
+ ? err.issues.map((e) => `${e.path.join('.')}: ${e.message}`).join('; ')
445
+ : String(err);
446
+ return {
447
+ content: [
448
+ {
449
+ type: 'text',
450
+ text: JSON.stringify({ error: `Invalid token report: ${message}` }),
451
+ },
452
+ ],
453
+ isError: true,
454
+ };
455
+ }
456
+ }
457
+ case 'nr_observe_get_cost_breakdown': {
458
+ if (!costTracker) {
459
+ return {
460
+ content: [
461
+ {
462
+ type: 'text',
463
+ text: JSON.stringify({ error: 'CostTracker not available' }),
464
+ },
465
+ ],
466
+ isError: true,
467
+ };
468
+ }
469
+ return handleGetCostBreakdown(costTracker, taskDetector);
470
+ }
471
+ case 'nr_observe_get_budget_status': {
472
+ if (!budgetTracker) {
473
+ return {
474
+ content: [
475
+ {
476
+ type: 'text',
477
+ text: JSON.stringify({ error: 'BudgetTracker not available' }),
478
+ },
479
+ ],
480
+ isError: true,
481
+ };
482
+ }
483
+ return handleGetBudgetStatus(budgetTracker);
484
+ }
485
+ case 'nr_observe_get_cost_forecast': {
486
+ if (!costTracker || sessionStartMs === undefined) {
487
+ return {
488
+ content: [
489
+ {
490
+ type: 'text',
491
+ text: JSON.stringify({ error: 'CostTracker or sessionStartMs not available' }),
492
+ },
493
+ ],
494
+ isError: true,
495
+ };
496
+ }
497
+ return handleGetCostForecast(costTracker, sessionStartMs);
498
+ }
499
+ case 'nr_observe_get_workflow_trace': {
500
+ if (!taskDetector) {
501
+ return {
502
+ content: [
503
+ {
504
+ type: 'text',
505
+ text: JSON.stringify({ error: 'TaskDetector not available' }),
506
+ },
507
+ ],
508
+ isError: true,
509
+ };
510
+ }
511
+ const taskId = args?.task_id;
512
+ return handleGetWorkflowTrace(taskDetector, antiPatternDetector, efficiencyScorer, taskId);
513
+ }
514
+ case 'nr_observe_get_anti_patterns': {
515
+ if (!antiPatternDetector || !taskDetector) {
516
+ return {
517
+ content: [
518
+ {
519
+ type: 'text',
520
+ text: JSON.stringify({
521
+ error: 'AntiPatternDetector or TaskDetector not available',
522
+ }),
523
+ },
524
+ ],
525
+ isError: true,
526
+ };
527
+ }
528
+ return handleGetAntiPatterns(taskDetector, antiPatternDetector);
529
+ }
530
+ case 'nr_observe_get_efficiency_score': {
531
+ if (!efficiencyScorer) {
532
+ return {
533
+ content: [
534
+ {
535
+ type: 'text',
536
+ text: JSON.stringify({ error: 'EfficiencyScorer not available' }),
537
+ },
538
+ ],
539
+ isError: true,
540
+ };
541
+ }
542
+ return handleGetEfficiencyScore(efficiencyScorer, taskDetector, antiPatternDetector);
543
+ }
544
+ case 'nr_observe_report_feedback': {
545
+ if (!feedbackCollector) {
546
+ return {
547
+ content: [
548
+ {
549
+ type: 'text',
550
+ text: JSON.stringify({ error: 'FeedbackCollector not available' }),
551
+ },
552
+ ],
553
+ isError: true,
554
+ };
555
+ }
556
+ try {
557
+ const feedbackArgs = FeedbackSchema.parse(args);
558
+ return handleReportFeedback(feedbackCollector, feedbackArgs);
559
+ }
560
+ catch (err) {
561
+ const message = err instanceof z.ZodError
562
+ ? err.issues.map((e) => `${e.path.join('.')}: ${e.message}`).join('; ')
563
+ : String(err);
564
+ return {
565
+ content: [
566
+ {
567
+ type: 'text',
568
+ text: JSON.stringify({ error: `Invalid feedback: ${message}` }),
569
+ },
570
+ ],
571
+ isError: true,
572
+ };
573
+ }
574
+ }
575
+ case 'nr_observe_get_session_history': {
576
+ if (!sessionStore) {
577
+ return {
578
+ content: [
579
+ {
580
+ type: 'text',
581
+ text: JSON.stringify({ error: 'SessionStore not available' }),
582
+ },
583
+ ],
584
+ isError: true,
585
+ };
586
+ }
587
+ const historyArgs = (args ?? {});
588
+ return handleGetSessionHistory(sessionStore, {
589
+ since: historyArgs.since,
590
+ developer: historyArgs.developer,
591
+ limit: historyArgs.limit,
592
+ });
593
+ }
594
+ case 'nr_observe_get_weekly_summary': {
595
+ if (!weeklySummaryGenerator) {
596
+ return {
597
+ content: [
598
+ {
599
+ type: 'text',
600
+ text: JSON.stringify({ error: 'WeeklySummaryGenerator not available' }),
601
+ },
602
+ ],
603
+ isError: true,
604
+ };
605
+ }
606
+ const weekArgs = (args ?? {});
607
+ return handleGetWeeklySummary(weeklySummaryGenerator, {
608
+ week: weekArgs.week,
609
+ });
610
+ }
611
+ case 'nr_observe_get_trends': {
612
+ if (!trendAnalyzer) {
613
+ return {
614
+ content: [
615
+ {
616
+ type: 'text',
617
+ text: JSON.stringify({ error: 'TrendAnalyzer not available' }),
618
+ },
619
+ ],
620
+ isError: true,
621
+ };
622
+ }
623
+ const trendArgs = (args ?? {});
624
+ return handleGetTrends(trendAnalyzer, {
625
+ metric: trendArgs.metric,
626
+ developer: trendArgs.developer,
627
+ weeks: trendArgs.weeks,
628
+ });
629
+ }
630
+ case 'nr_observe_get_collaboration_profile': {
631
+ if (!collaborationProfiler) {
632
+ return {
633
+ content: [
634
+ {
635
+ type: 'text',
636
+ text: JSON.stringify({ error: 'CollaborationProfiler not available' }),
637
+ },
638
+ ],
639
+ isError: true,
640
+ };
641
+ }
642
+ const profileArgs = (args ?? {});
643
+ return handleGetCollaborationProfile(collaborationProfiler, {
644
+ developer: profileArgs.developer,
645
+ });
646
+ }
647
+ case 'nr_observe_get_claudemd_impact': {
648
+ if (!claudeMdTracker) {
649
+ return {
650
+ content: [
651
+ {
652
+ type: 'text',
653
+ text: JSON.stringify({ error: 'ClaudeMdTracker not available' }),
654
+ },
655
+ ],
656
+ isError: true,
657
+ };
658
+ }
659
+ return handleGetClaudeMdImpact(claudeMdTracker);
660
+ }
661
+ case 'nr_observe_get_cost_per_outcome': {
662
+ if (!costPerOutcomeAnalyzer || !taskDetector) {
663
+ return {
664
+ content: [
665
+ {
666
+ type: 'text',
667
+ text: JSON.stringify({
668
+ error: 'CostPerOutcomeAnalyzer or TaskDetector not available',
669
+ }),
670
+ },
671
+ ],
672
+ isError: true,
673
+ };
674
+ }
675
+ const costArgs = (args ?? {});
676
+ return handleGetCostPerOutcome(costPerOutcomeAnalyzer, taskDetector, {
677
+ since: costArgs.since,
678
+ });
679
+ }
680
+ case 'nr_observe_get_recommendations': {
681
+ if (!recommendationEngine) {
682
+ return {
683
+ content: [
684
+ {
685
+ type: 'text',
686
+ text: JSON.stringify({ error: 'RecommendationEngine not available' }),
687
+ },
688
+ ],
689
+ isError: true,
690
+ };
691
+ }
692
+ const recArgs = (args ?? {});
693
+ return handleGetRecommendations(recommendationEngine, {
694
+ developer: recArgs.developer,
695
+ topN: recArgs.topN,
696
+ });
697
+ }
698
+ case 'nr_observe_get_platform_comparison': {
699
+ if (!sessionStore) {
700
+ return {
701
+ content: [
702
+ {
703
+ type: 'text',
704
+ text: JSON.stringify({ error: 'SessionStore not available' }),
705
+ },
706
+ ],
707
+ isError: true,
708
+ };
709
+ }
710
+ const pcArgs = (args ?? {});
711
+ return handleGetPlatformComparison(sessionStore, {
712
+ metric: pcArgs.metric,
713
+ weeks: pcArgs.weeks,
714
+ });
715
+ }
716
+ case 'nr_observe_get_team_summary': {
717
+ if (!options.teamId || !options.nrApiKey) {
718
+ return {
719
+ content: [
720
+ {
721
+ type: 'text',
722
+ text: JSON.stringify({ error: 'teamId or nrApiKey not configured' }),
723
+ },
724
+ ],
725
+ isError: true,
726
+ };
727
+ }
728
+ const summaryArgs = (args ?? {});
729
+ return handleGetTeamSummary({
730
+ teamId: options.teamId,
731
+ accountId: options.accountId ?? '',
732
+ nrApiKey: options.nrApiKey,
733
+ collectorHost: options.collectorHost,
734
+ since: summaryArgs.since,
735
+ });
736
+ }
737
+ case 'nr_observe_subscribe_digest': {
738
+ if (!options.configFilePath) {
739
+ return {
740
+ content: [
741
+ {
742
+ type: 'text',
743
+ text: JSON.stringify({ error: 'configFilePath not available' }),
744
+ },
745
+ ],
746
+ isError: true,
747
+ };
748
+ }
749
+ const digestArgs = (args ?? {});
750
+ return handleSubscribeDigest(typeof digestArgs.webhookUrl === 'string' ? digestArgs.webhookUrl : '', options.configFilePath);
751
+ }
752
+ case 'nr_observe_unsubscribe_digest': {
753
+ if (!options.configFilePath) {
754
+ return {
755
+ content: [
756
+ {
757
+ type: 'text',
758
+ text: JSON.stringify({ error: 'configFilePath not available' }),
759
+ },
760
+ ],
761
+ isError: true,
762
+ };
763
+ }
764
+ return handleUnsubscribeDigest(options.configFilePath);
765
+ }
766
+ case 'nr_observe_send_digest': {
767
+ if (!options.configFilePath || !weeklySummaryGenerator) {
768
+ return {
769
+ content: [
770
+ {
771
+ type: 'text',
772
+ text: JSON.stringify({
773
+ error: 'configFilePath or WeeklySummaryGenerator not available',
774
+ }),
775
+ },
776
+ ],
777
+ isError: true,
778
+ };
779
+ }
780
+ return handleSendDigest(weeklySummaryGenerator, options.configFilePath);
781
+ }
782
+ case 'nr_observe_get_personal_insights': {
783
+ if (!weeklySummaryGenerator || !options.developer) {
784
+ return {
785
+ content: [
786
+ {
787
+ type: 'text',
788
+ text: JSON.stringify({
789
+ error: 'WeeklySummaryGenerator or developer not available',
790
+ }),
791
+ },
792
+ ],
793
+ isError: true,
794
+ };
795
+ }
796
+ return handleGetPersonalInsights(weeklySummaryGenerator, options.developer);
797
+ }
798
+ case 'nr_observe_get_context_efficiency': {
799
+ if (!contextWindowTracker) {
800
+ return {
801
+ content: [
802
+ {
803
+ type: 'text',
804
+ text: JSON.stringify({ error: 'ContextWindowTracker not available' }),
805
+ },
806
+ ],
807
+ isError: true,
808
+ };
809
+ }
810
+ return handleGetContextEfficiency(contextWindowTracker);
811
+ }
812
+ case 'nr_observe_get_context_tracking': {
813
+ if (!contextTracker) {
814
+ return {
815
+ content: [
816
+ {
817
+ type: 'text',
818
+ text: JSON.stringify({ error: 'ContextTracker not available' }),
819
+ },
820
+ ],
821
+ isError: true,
822
+ };
823
+ }
824
+ return handleGetContextTracking(contextTracker);
825
+ }
826
+ case 'nr_observe_get_latency_percentiles': {
827
+ if (!latencyTracker) {
828
+ return {
829
+ content: [
830
+ {
831
+ type: 'text',
832
+ text: JSON.stringify({ error: 'LatencyTracker not available' }),
833
+ },
834
+ ],
835
+ isError: true,
836
+ };
837
+ }
838
+ return handleGetLatencyPercentiles(latencyTracker);
839
+ }
840
+ case 'nr_observe_get_task_completion_rate': {
841
+ if (!taskCompletionTracker) {
842
+ return {
843
+ content: [
844
+ {
845
+ type: 'text',
846
+ text: JSON.stringify({ error: 'TaskCompletionTracker not available' }),
847
+ },
848
+ ],
849
+ isError: true,
850
+ };
851
+ }
852
+ return handleGetTaskCompletionRate(taskCompletionTracker, taskDetector);
853
+ }
854
+ case 'nr_observe_get_model_usage': {
855
+ if (!modelUsageTracker) {
856
+ return {
857
+ content: [
858
+ {
859
+ type: 'text',
860
+ text: JSON.stringify({ error: 'ModelUsageTracker not available' }),
861
+ },
862
+ ],
863
+ isError: true,
864
+ };
865
+ }
866
+ return handleGetModelUsage(modelUsageTracker);
867
+ }
868
+ case 'nr_observe_get_retry_alerts': {
869
+ if (!retryDetector) {
870
+ return {
871
+ content: [
872
+ {
873
+ type: 'text',
874
+ text: JSON.stringify({ error: 'RetryDetector not available' }),
875
+ },
876
+ ],
877
+ isError: true,
878
+ };
879
+ }
880
+ return handleGetRetryAlerts(retryDetector);
881
+ }
882
+ case 'nr_observe_get_context_composition': {
883
+ if (!contextCompositionTracker) {
884
+ return {
885
+ content: [
886
+ {
887
+ type: 'text',
888
+ text: JSON.stringify({ error: 'ContextCompositionTracker not available' }),
889
+ },
890
+ ],
891
+ isError: true,
892
+ };
893
+ }
894
+ return handleGetContextComposition(contextCompositionTracker);
895
+ }
896
+ case 'nr_observe_get_latency_decomposition': {
897
+ if (!latencyDecompositionTracker) {
898
+ return {
899
+ content: [
900
+ {
901
+ type: 'text',
902
+ text: JSON.stringify({ error: 'LatencyDecompositionTracker not available' }),
903
+ },
904
+ ],
905
+ isError: true,
906
+ };
907
+ }
908
+ return handleGetLatencyDecomposition(latencyDecompositionTracker);
909
+ }
910
+ case 'nr_observe_get_decision_tree': {
911
+ if (!decisionTracker) {
912
+ return {
913
+ content: [
914
+ {
915
+ type: 'text',
916
+ text: JSON.stringify({ error: 'DecisionTracker not available' }),
917
+ },
918
+ ],
919
+ isError: true,
920
+ };
921
+ }
922
+ const dtArgs = (args ?? {});
923
+ return handleGetDecisionTree(decisionTracker, dtArgs.post_mortem === true);
924
+ }
925
+ case 'nr_observe_get_instruction_drift': {
926
+ if (!instructionDriftTracker) {
927
+ return {
928
+ content: [
929
+ {
930
+ type: 'text',
931
+ text: JSON.stringify({ error: 'InstructionDriftTracker not available' }),
932
+ },
933
+ ],
934
+ isError: true,
935
+ };
936
+ }
937
+ return handleGetInstructionDrift(instructionDriftTracker);
938
+ }
939
+ case 'nr_observe_get_tool_selection_score': {
940
+ if (!toolSelectionScorer || !options.toolCallBuffer) {
941
+ return {
942
+ content: [
943
+ {
944
+ type: 'text',
945
+ text: JSON.stringify({
946
+ error: 'ToolSelectionScorer or toolCallBuffer not available',
947
+ }),
948
+ },
949
+ ],
950
+ isError: true,
951
+ };
952
+ }
953
+ return handleGetToolSelectionScore(toolSelectionScorer, options.toolCallBuffer.getRecords());
954
+ }
955
+ case 'nr_observe_get_quality_proxy': {
956
+ if (!qualityProxyTracker) {
957
+ return {
958
+ content: [
959
+ {
960
+ type: 'text',
961
+ text: JSON.stringify({ error: 'QualityProxyTracker not available' }),
962
+ },
963
+ ],
964
+ isError: true,
965
+ };
966
+ }
967
+ return handleGetQualityProxy(qualityProxyTracker);
968
+ }
969
+ case 'nr_observe_get_api_failures': {
970
+ if (!apiFailureTracker) {
971
+ return {
972
+ content: [
973
+ {
974
+ type: 'text',
975
+ text: JSON.stringify({ error: 'ApiFailureTracker not available' }),
976
+ },
977
+ ],
978
+ isError: true,
979
+ };
980
+ }
981
+ return handleGetApiFailures(apiFailureTracker);
982
+ }
983
+ case 'nr_observe_get_cost_per_tool': {
984
+ if (!turnCostAttributor) {
985
+ return {
986
+ content: [
987
+ {
988
+ type: 'text',
989
+ text: JSON.stringify({ error: 'TurnCostAttributor not available' }),
990
+ },
991
+ ],
992
+ isError: true,
993
+ };
994
+ }
995
+ const costMetrics = turnCostAttributor.getMetrics();
996
+ return {
997
+ content: [{ type: 'text', text: JSON.stringify(costMetrics, null, 2) }],
998
+ };
999
+ }
1000
+ case 'nr_observe_get_turn_analysis': {
1001
+ if (!turnTracker) {
1002
+ return {
1003
+ content: [
1004
+ {
1005
+ type: 'text',
1006
+ text: JSON.stringify({ error: 'TurnTracker not available' }),
1007
+ },
1008
+ ],
1009
+ isError: true,
1010
+ };
1011
+ }
1012
+ const turnMetrics = turnTracker.getMetrics();
1013
+ return {
1014
+ content: [{ type: 'text', text: JSON.stringify(turnMetrics, null, 2) }],
1015
+ };
1016
+ }
1017
+ case 'nr_observe_get_git_efficiency': {
1018
+ if (!gitEfficiencyTracker) {
1019
+ return {
1020
+ content: [
1021
+ {
1022
+ type: 'text',
1023
+ text: JSON.stringify({ error: 'GitEfficiencyTracker not available' }),
1024
+ },
1025
+ ],
1026
+ isError: true,
1027
+ };
1028
+ }
1029
+ return handleGetGitEfficiency(gitEfficiencyTracker);
1030
+ }
1031
+ default:
1032
+ throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`);
1033
+ }
1034
+ }
1035
+ catch (err) {
1036
+ if (err instanceof McpError)
1037
+ throw err;
1038
+ logger.error('Tool handler threw unexpectedly', {
1039
+ tool: name,
1040
+ error: err instanceof Error ? err.message : String(err),
1041
+ });
1042
+ return {
1043
+ content: [
1044
+ {
1045
+ type: 'text',
1046
+ text: JSON.stringify({ error: err instanceof Error ? err.message : String(err) }),
1047
+ },
1048
+ ],
1049
+ isError: true,
1050
+ };
1051
+ }
1052
+ });
1053
+ }
1054
+ //# sourceMappingURL=session-stats.js.map