@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,123 @@
1
+ import { readFile, stat } from 'node:fs/promises';
2
+ import { extname, join, resolve, sep } from 'node:path';
3
+ const MIME = {
4
+ '.html': 'text/html; charset=utf-8',
5
+ '.js': 'application/javascript; charset=utf-8',
6
+ '.mjs': 'application/javascript; charset=utf-8',
7
+ '.css': 'text/css; charset=utf-8',
8
+ '.json': 'application/json; charset=utf-8',
9
+ '.svg': 'image/svg+xml',
10
+ '.png': 'image/png',
11
+ '.jpg': 'image/jpeg',
12
+ '.jpeg': 'image/jpeg',
13
+ '.gif': 'image/gif',
14
+ '.ico': 'image/x-icon',
15
+ '.woff': 'font/woff',
16
+ '.woff2': 'font/woff2',
17
+ '.map': 'application/json; charset=utf-8',
18
+ '.wasm': 'application/wasm',
19
+ '.webp': 'image/webp',
20
+ '.avif': 'image/avif',
21
+ '.txt': 'text/plain; charset=utf-8',
22
+ };
23
+ async function serveIndexFallback(root, res) {
24
+ try {
25
+ const indexPath = join(root, 'index.html');
26
+ const data = await readFile(indexPath);
27
+ res.writeHead(200, {
28
+ 'content-type': 'text/html; charset=utf-8',
29
+ 'content-length': String(data.length),
30
+ // index.html must always be revalidated so a fresh build is picked
31
+ // up immediately. The hashed assets it references can be cached
32
+ // aggressively.
33
+ 'cache-control': 'no-cache',
34
+ });
35
+ res.end(data);
36
+ }
37
+ catch {
38
+ res.writeHead(404);
39
+ res.end();
40
+ }
41
+ }
42
+ export function createStaticHandler(rootDir) {
43
+ const root = resolve(rootDir);
44
+ return async (req, res) => {
45
+ const url = req.url ?? '/';
46
+ const reqPath = url.split('?')[0] ?? '/';
47
+ const filename = reqPath === '/' ? 'index.html' : reqPath.replace(/^\/+/, '');
48
+ // Reject null bytes and explicit traversal components before path resolution.
49
+ // resolve() would eliminate these too, but the explicit check here makes the
50
+ // sanitization visible to static analysis (CodeQL js/path-injection).
51
+ if (filename.includes('\0') || filename.split('/').some((c) => c === '..')) {
52
+ res.writeHead(403);
53
+ res.end();
54
+ return;
55
+ }
56
+ const target = resolve(join(root, filename));
57
+ // Use a literal '/' so static analysis tools (CodeQL js/path-injection)
58
+ // can recognise this as the standard path-containment sanitizer pattern.
59
+ // The runtime sep from node:path would be equivalent on POSIX, but CodeQL
60
+ // cannot statically prove that sep === '/' and therefore misses the guard.
61
+ if (!target.startsWith(root + '/')) {
62
+ res.writeHead(403);
63
+ res.end();
64
+ return;
65
+ }
66
+ const ext = extname(target).toLowerCase();
67
+ const hasFileExtension = ext.length > 0;
68
+ // Only serve files whose extension appears in the explicit MIME allow-list.
69
+ // This limits what readFile() can reach to known web-asset types even if a
70
+ // future change inadvertently widens the path-containment check above.
71
+ if (hasFileExtension && !(ext in MIME)) {
72
+ res.writeHead(403);
73
+ res.end();
74
+ return;
75
+ }
76
+ try {
77
+ const st = await stat(target);
78
+ if (!st.isFile()) {
79
+ // An on-disk path that exists but is not a regular file
80
+ // (typically a directory like /assets/) is not a valid SPA route —
81
+ // returning index.html here masks misconfigured asset paths in
82
+ // dev. The SPA fallback is reserved for genuinely missing paths
83
+ // (the ENOENT path below).
84
+ res.writeHead(404);
85
+ res.end();
86
+ return;
87
+ }
88
+ const type = MIME[ext] ?? 'application/octet-stream';
89
+ const data = await readFile(target);
90
+ // Vite-built assets live under /assets/ with content-hash
91
+ // filenames (main-abc123.js), so they can be cached forever. The
92
+ // shell index.html must revalidate every time so a fresh build's
93
+ // new asset hashes are picked up. Other static files (the rare
94
+ // unhashed asset, robots.txt, favicons that aren't in /assets/)
95
+ // get a short cache for sane DevTools behaviour.
96
+ // Check against path relative to root, not the full absolute path, to
97
+ // avoid false positives when rootDir itself contains an 'assets' component.
98
+ const relPath = target.slice(root.length);
99
+ const isAsset = relPath.includes(`${sep}assets${sep}`);
100
+ const isIndexHtml = filename === 'index.html';
101
+ const cacheControl = isIndexHtml
102
+ ? 'no-cache'
103
+ : isAsset
104
+ ? 'public, max-age=31536000, immutable'
105
+ : 'public, max-age=300';
106
+ res.writeHead(200, {
107
+ 'content-type': type,
108
+ 'content-length': String(data.length),
109
+ 'cache-control': cacheControl,
110
+ });
111
+ res.end(data);
112
+ }
113
+ catch {
114
+ if (hasFileExtension) {
115
+ res.writeHead(404);
116
+ res.end();
117
+ return;
118
+ }
119
+ return await serveIndexFallback(root, res);
120
+ }
121
+ };
122
+ }
123
+ //# sourceMappingURL=static-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-handler.js","sourceRoot":"","sources":["../../../src/dashboard/routes/static-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "AI Hourly Cost Spike",
3
+ "description": "Fires when AI coding cost exceeds $10 in any 1-hour window.",
4
+ "enabled": true,
5
+ "nrqlQuery": "SELECT sum(estimated_cost_usd) FROM AiCodingTask",
6
+ "aggregationMethod": "EVENT_FLOW",
7
+ "aggregationWindow": 3600,
8
+ "aggregationDelay": 120,
9
+ "thresholdOperator": "ABOVE",
10
+ "thresholdCritical": {
11
+ "value": 10,
12
+ "duration": 3600,
13
+ "occurrences": "ALL"
14
+ },
15
+ "violationTimeLimitSeconds": 86400
16
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "AI Low Efficiency Score",
3
+ "description": "Fires when the rolling efficiency score drops below 40 for 30+ minutes.",
4
+ "enabled": true,
5
+ "nrqlQuery": "SELECT average(ai.efficiency.score) FROM Metric",
6
+ "aggregationMethod": "EVENT_FLOW",
7
+ "aggregationWindow": 300,
8
+ "aggregationDelay": 120,
9
+ "thresholdOperator": "BELOW",
10
+ "thresholdCritical": {
11
+ "value": 40,
12
+ "duration": 1800,
13
+ "occurrences": "ALL"
14
+ },
15
+ "violationTimeLimitSeconds": 86400
16
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "AI Stuck Loop Spike",
3
+ "description": "Fires when stuck loop anti-patterns exceed 3 occurrences in a 5-minute window.",
4
+ "enabled": true,
5
+ "nrqlQuery": "SELECT count(*) FROM AiAntiPattern WHERE type = 'stuck_loop'",
6
+ "aggregationMethod": "EVENT_FLOW",
7
+ "aggregationWindow": 300,
8
+ "aggregationDelay": 120,
9
+ "thresholdOperator": "ABOVE",
10
+ "thresholdCritical": {
11
+ "value": 3,
12
+ "duration": 300,
13
+ "occurrences": "AT_LEAST_ONCE"
14
+ },
15
+ "violationTimeLimitSeconds": 43200
16
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "AI Anti-Pattern Rate Elevated",
3
+ "description": "Fires when total anti-patterns exceed 10 in any 10-minute window.",
4
+ "enabled": true,
5
+ "nrqlQuery": "SELECT count(*) FROM AiAntiPattern",
6
+ "aggregationMethod": "EVENT_FLOW",
7
+ "aggregationWindow": 600,
8
+ "aggregationDelay": 120,
9
+ "thresholdOperator": "ABOVE",
10
+ "thresholdCritical": {
11
+ "value": 10,
12
+ "duration": 600,
13
+ "occurrences": "AT_LEAST_ONCE"
14
+ },
15
+ "violationTimeLimitSeconds": 43200
16
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "AI Session Cost Over Budget",
3
+ "description": "Fires when a single session's cost exceeds $5. Adjust threshold to match your budget.",
4
+ "enabled": false,
5
+ "nrqlQuery": "SELECT max(ai.cost.session_total_usd) FROM Metric FACET session_id",
6
+ "aggregationMethod": "EVENT_FLOW",
7
+ "aggregationWindow": 300,
8
+ "aggregationDelay": 120,
9
+ "thresholdOperator": "ABOVE",
10
+ "thresholdCritical": {
11
+ "value": 5,
12
+ "duration": 300,
13
+ "occurrences": "AT_LEAST_ONCE"
14
+ },
15
+ "violationTimeLimitSeconds": 86400
16
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "AI Personal Daily Cost — {{developer}}",
3
+ "description": "Fires when {{developer}}'s AI coding cost exceeds the personal threshold in any 1-hour window.",
4
+ "enabled": true,
5
+ "nrqlQuery": "SELECT sum(estimated_cost_usd) FROM AiCodingTask WHERE developer = '{{developer}}'",
6
+ "aggregationMethod": "EVENT_FLOW",
7
+ "aggregationWindow": 3600,
8
+ "aggregationDelay": 120,
9
+ "thresholdOperator": "ABOVE",
10
+ "thresholdCritical": {
11
+ "value": "__dailyCostUsd__",
12
+ "duration": 3600,
13
+ "occurrences": "ALL"
14
+ },
15
+ "violationTimeLimitSeconds": 86400
16
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "AI Personal Session Cost — {{developer}}",
3
+ "description": "Fires when a single session by {{developer}} exceeds the personal session cost threshold.",
4
+ "enabled": true,
5
+ "nrqlQuery": "SELECT max(ai.cost.session_total_usd) FROM Metric WHERE developer = '{{developer}}' FACET session_id",
6
+ "aggregationMethod": "EVENT_FLOW",
7
+ "aggregationWindow": 300,
8
+ "aggregationDelay": 120,
9
+ "thresholdOperator": "ABOVE",
10
+ "thresholdCritical": {
11
+ "value": "__sessionCostUsd__",
12
+ "duration": 300,
13
+ "occurrences": "AT_LEAST_ONCE"
14
+ },
15
+ "violationTimeLimitSeconds": 86400
16
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "AI Personal Low Efficiency — {{developer}}",
3
+ "description": "Fires when {{developer}}'s efficiency score stays below personal threshold for 30 minutes.",
4
+ "enabled": true,
5
+ "nrqlQuery": "SELECT average(ai.efficiency.score) FROM Metric WHERE developer = '{{developer}}'",
6
+ "aggregationMethod": "EVENT_FLOW",
7
+ "aggregationWindow": 300,
8
+ "aggregationDelay": 120,
9
+ "thresholdOperator": "BELOW",
10
+ "thresholdCritical": {
11
+ "value": "__efficiencyScoreMin__",
12
+ "duration": 1800,
13
+ "occurrences": "ALL"
14
+ },
15
+ "violationTimeLimitSeconds": 86400
16
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "AI Personal Anti-Pattern Rate — {{developer}}",
3
+ "description": "Fires when {{developer}}'s anti-pattern rate exceeds personal threshold in a 5-minute window.",
4
+ "enabled": true,
5
+ "nrqlQuery": "SELECT count(*) FROM AiAntiPattern WHERE developer = '{{developer}}'",
6
+ "aggregationMethod": "EVENT_FLOW",
7
+ "aggregationWindow": 300,
8
+ "aggregationDelay": 120,
9
+ "thresholdOperator": "ABOVE",
10
+ "thresholdCritical": {
11
+ "value": "__antiPatternCountMax__",
12
+ "duration": 300,
13
+ "occurrences": "AT_LEAST_ONCE"
14
+ },
15
+ "violationTimeLimitSeconds": 43200
16
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "AI Personal Stuck Loop — {{developer}}",
3
+ "description": "Fires when {{developer}} triggers more than the personal stuck loop threshold in a 5-minute window.",
4
+ "enabled": true,
5
+ "nrqlQuery": "SELECT count(*) FROM AiAntiPattern WHERE developer = '{{developer}}' AND type = 'stuck_loop'",
6
+ "aggregationMethod": "EVENT_FLOW",
7
+ "aggregationWindow": 300,
8
+ "aggregationDelay": 120,
9
+ "thresholdOperator": "ABOVE",
10
+ "thresholdCritical": {
11
+ "value": "__stuckLoopCountMax__",
12
+ "duration": 300,
13
+ "occurrences": "AT_LEAST_ONCE"
14
+ },
15
+ "violationTimeLimitSeconds": 43200
16
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "name": "AI Coding Assistant Alerts",
3
+ "incidentPreference": "PER_CONDITION"
4
+ }
@@ -0,0 +1,103 @@
1
+ {
2
+ "name": "AI Coding Assistant — Manager View",
3
+ "description": "Team-level AI coding cost and efficiency. No session content.",
4
+ "permissions": "PUBLIC_READ_ONLY",
5
+ "pages": [
6
+ {
7
+ "name": "Team Overview",
8
+ "widgets": [
9
+ {
10
+ "title": "Total AI Cost (7 days)",
11
+ "layout": { "column": 1, "row": 1, "width": 3, "height": 3 },
12
+ "visualization": { "id": "viz.billboard" },
13
+ "rawConfiguration": {
14
+ "nrqlQueries": [
15
+ {
16
+ "accountIds": [],
17
+ "query": "FROM AiCodingTask SELECT sum(estimated_cost_usd) AS 'Total Cost (USD)' SINCE 7 DAYS AGO"
18
+ }
19
+ ]
20
+ }
21
+ },
22
+ {
23
+ "title": "Cost by Developer (7 days)",
24
+ "layout": { "column": 4, "row": 1, "width": 5, "height": 3 },
25
+ "visualization": { "id": "viz.bar" },
26
+ "rawConfiguration": {
27
+ "nrqlQueries": [
28
+ {
29
+ "accountIds": [],
30
+ "query": "FROM AiCodingTask SELECT sum(estimated_cost_usd) FACET developer SINCE 7 DAYS AGO"
31
+ }
32
+ ]
33
+ }
34
+ },
35
+ {
36
+ "title": "Efficiency Score by Developer (0–1, ≥0.75 healthy)",
37
+ "layout": { "column": 9, "row": 1, "width": 4, "height": 3 },
38
+ "visualization": { "id": "viz.bar" },
39
+ "rawConfiguration": {
40
+ "nrqlQueries": [
41
+ {
42
+ "accountIds": [],
43
+ "query": "FROM Metric SELECT average(ai.efficiency.score) AS 'Score' FACET developer SINCE 7 DAYS AGO"
44
+ }
45
+ ]
46
+ }
47
+ },
48
+ {
49
+ "title": "Daily AI Cost Trend",
50
+ "layout": { "column": 1, "row": 4, "width": 6, "height": 3 },
51
+ "visualization": { "id": "viz.line" },
52
+ "rawConfiguration": {
53
+ "nrqlQueries": [
54
+ {
55
+ "accountIds": [],
56
+ "query": "FROM AiCodingTask SELECT sum(estimated_cost_usd) FACET developer SINCE 30 DAYS AGO TIMESERIES 1 DAY"
57
+ }
58
+ ]
59
+ }
60
+ },
61
+ {
62
+ "title": "Efficiency Score Trend",
63
+ "layout": { "column": 7, "row": 4, "width": 6, "height": 3 },
64
+ "visualization": { "id": "viz.line" },
65
+ "rawConfiguration": {
66
+ "nrqlQueries": [
67
+ {
68
+ "accountIds": [],
69
+ "query": "FROM Metric SELECT average(ai.efficiency.score) FACET developer SINCE 30 DAYS AGO TIMESERIES 1 DAY"
70
+ }
71
+ ]
72
+ }
73
+ },
74
+ {
75
+ "title": "Anti-patterns by Developer",
76
+ "layout": { "column": 1, "row": 7, "width": 6, "height": 3 },
77
+ "visualization": { "id": "viz.bar" },
78
+ "rawConfiguration": {
79
+ "nrqlQueries": [
80
+ {
81
+ "accountIds": [],
82
+ "query": "SELECT count(*) FROM AiAntiPattern SINCE 7 days ago FACET developer"
83
+ }
84
+ ]
85
+ }
86
+ },
87
+ {
88
+ "title": "Cost by Project",
89
+ "layout": { "column": 7, "row": 7, "width": 6, "height": 3 },
90
+ "visualization": { "id": "viz.bar" },
91
+ "rawConfiguration": {
92
+ "nrqlQueries": [
93
+ {
94
+ "accountIds": [],
95
+ "query": "FROM AiCodingTask SELECT sum(estimated_cost_usd) FACET project_id SINCE 7 DAYS AGO"
96
+ }
97
+ ]
98
+ }
99
+ }
100
+ ]
101
+ }
102
+ ]
103
+ }
@@ -0,0 +1,239 @@
1
+ {
2
+ "name": "AI Coding Assistant \u2014 Overview",
3
+ "description": "Pre-built dashboard for Preflight observability. Requires AiToolCall custom events and ai.* metrics sent by the MCP server hook collector. Widgets will show 'No data' until the server is actively sending telemetry.",
4
+ "permissions": "PUBLIC_READ_WRITE",
5
+ "pages": [
6
+ {
7
+ "name": "AI Coding Assistant \u2014 Overview",
8
+ "description": "Session metrics, tool usage, code changes, and timeline for AI coding assistant sessions",
9
+ "widgets": [
10
+ {
11
+ "title": "Session Duration",
12
+ "layout": {
13
+ "column": 1,
14
+ "row": 1,
15
+ "width": 4,
16
+ "height": 3
17
+ },
18
+ "visualization": {
19
+ "id": "viz.billboard"
20
+ },
21
+ "rawConfiguration": {
22
+ "nrqlQueries": [
23
+ {
24
+ "accountIds": [],
25
+ "query": "FROM Metric SELECT latest(ai.session.duration_ms[sum]) / 60000 AS 'Minutes' WHERE session_id = {{session_id}} SINCE 1 hour ago"
26
+ }
27
+ ]
28
+ }
29
+ },
30
+ {
31
+ "title": "Total Tool Calls",
32
+ "layout": {
33
+ "column": 5,
34
+ "row": 1,
35
+ "width": 4,
36
+ "height": 3
37
+ },
38
+ "visualization": {
39
+ "id": "viz.billboard"
40
+ },
41
+ "rawConfiguration": {
42
+ "nrqlQueries": [
43
+ {
44
+ "accountIds": [],
45
+ "query": "SELECT count(*) AS 'Tool Calls' FROM AiToolCall WHERE developer = {{developer}} AND session_id = {{session_id}} SINCE 1 hour ago"
46
+ }
47
+ ]
48
+ }
49
+ },
50
+ {
51
+ "title": "Success Rate",
52
+ "layout": {
53
+ "column": 9,
54
+ "row": 1,
55
+ "width": 4,
56
+ "height": 3
57
+ },
58
+ "visualization": {
59
+ "id": "viz.billboard"
60
+ },
61
+ "rawConfiguration": {
62
+ "nrqlQueries": [
63
+ {
64
+ "accountIds": [],
65
+ "query": "SELECT percentage(count(*), WHERE success = true) AS 'Success %' FROM AiToolCall WHERE developer = {{developer}} AND session_id = {{session_id}} SINCE 1 hour ago"
66
+ }
67
+ ],
68
+ "thresholds": [
69
+ {
70
+ "alertSeverity": "WARNING",
71
+ "value": 80
72
+ },
73
+ {
74
+ "alertSeverity": "CRITICAL",
75
+ "value": 50
76
+ }
77
+ ]
78
+ }
79
+ },
80
+ {
81
+ "title": "Tool Call Distribution",
82
+ "layout": {
83
+ "column": 1,
84
+ "row": 4,
85
+ "width": 4,
86
+ "height": 3
87
+ },
88
+ "visualization": {
89
+ "id": "viz.pie"
90
+ },
91
+ "rawConfiguration": {
92
+ "nrqlQueries": [
93
+ {
94
+ "accountIds": [],
95
+ "query": "SELECT count(*) FROM AiToolCall WHERE developer = {{developer}} AND session_id = {{session_id}} FACET tool SINCE 1 hour ago"
96
+ }
97
+ ]
98
+ }
99
+ },
100
+ {
101
+ "title": "Success Rate by Tool",
102
+ "layout": {
103
+ "column": 5,
104
+ "row": 4,
105
+ "width": 4,
106
+ "height": 3
107
+ },
108
+ "visualization": {
109
+ "id": "viz.bar"
110
+ },
111
+ "rawConfiguration": {
112
+ "nrqlQueries": [
113
+ {
114
+ "accountIds": [],
115
+ "query": "SELECT percentage(count(*), WHERE success = true) FROM AiToolCall WHERE developer = {{developer}} AND session_id = {{session_id}} FACET tool SINCE 1 hour ago"
116
+ }
117
+ ]
118
+ }
119
+ },
120
+ {
121
+ "title": "Average Latency by Tool",
122
+ "layout": {
123
+ "column": 9,
124
+ "row": 4,
125
+ "width": 4,
126
+ "height": 3
127
+ },
128
+ "visualization": {
129
+ "id": "viz.bar"
130
+ },
131
+ "rawConfiguration": {
132
+ "nrqlQueries": [
133
+ {
134
+ "accountIds": [],
135
+ "query": "SELECT average(duration_ms) FROM AiToolCall WHERE developer = {{developer}} AND session_id = {{session_id}} FACET tool SINCE 1 hour ago"
136
+ }
137
+ ]
138
+ }
139
+ },
140
+ {
141
+ "title": "Files Read vs Modified",
142
+ "layout": {
143
+ "column": 1,
144
+ "row": 7,
145
+ "width": 6,
146
+ "height": 3
147
+ },
148
+ "visualization": {
149
+ "id": "viz.bar"
150
+ },
151
+ "rawConfiguration": {
152
+ "nrqlQueries": [
153
+ {
154
+ "accountIds": [],
155
+ "query": "SELECT uniqueCount(filePath) AS 'Files Read' FROM AiToolCall WHERE tool = 'Read' AND developer = {{developer}} AND session_id = {{session_id}} SINCE 1 hour ago"
156
+ },
157
+ {
158
+ "accountIds": [],
159
+ "query": "SELECT uniqueCount(filePath) AS 'Files Modified' FROM AiToolCall WHERE tool IN ('Write', 'Edit') AND developer = {{developer}} AND session_id = {{session_id}} SINCE 1 hour ago"
160
+ }
161
+ ]
162
+ }
163
+ },
164
+ {
165
+ "title": "Test Results Timeline",
166
+ "layout": {
167
+ "column": 7,
168
+ "row": 7,
169
+ "width": 6,
170
+ "height": 3
171
+ },
172
+ "visualization": {
173
+ "id": "viz.line"
174
+ },
175
+ "rawConfiguration": {
176
+ "nrqlQueries": [
177
+ {
178
+ "accountIds": [],
179
+ "query": "SELECT count(*) FROM AiToolCall WHERE tool = 'Bash' AND isTestCommand = true AND developer = {{developer}} AND session_id = {{session_id}} FACET CASES(WHERE success = true AS 'Pass', WHERE success = false AS 'Fail') TIMESERIES SINCE 1 hour ago"
180
+ }
181
+ ]
182
+ }
183
+ },
184
+ {
185
+ "title": "Tool Calls Over Time",
186
+ "layout": {
187
+ "column": 1,
188
+ "row": 10,
189
+ "width": 12,
190
+ "height": 3
191
+ },
192
+ "visualization": {
193
+ "id": "viz.line"
194
+ },
195
+ "rawConfiguration": {
196
+ "nrqlQueries": [
197
+ {
198
+ "accountIds": [],
199
+ "query": "SELECT count(*) FROM AiToolCall WHERE developer = {{developer}} AND session_id = {{session_id}} FACET tool TIMESERIES 1 minute SINCE 1 hour ago"
200
+ }
201
+ ]
202
+ }
203
+ }
204
+ ]
205
+ }
206
+ ],
207
+ "variables": [
208
+ {
209
+ "name": "developer",
210
+ "title": "Developer",
211
+ "type": "NRQL",
212
+ "nrqlQuery": {
213
+ "query": "SELECT uniques(developer) FROM AiToolCall SINCE 7 days ago",
214
+ "accountIds": [0]
215
+ },
216
+ "isMultiSelection": false,
217
+ "defaultValues": [],
218
+ "replacementStrategy": "STRING",
219
+ "options": {
220
+ "excluded": true
221
+ }
222
+ },
223
+ {
224
+ "name": "session_id",
225
+ "title": "Session ID",
226
+ "type": "NRQL",
227
+ "nrqlQuery": {
228
+ "query": "SELECT uniques(session_id) FROM AiToolCall SINCE 7 days ago LIMIT 100",
229
+ "accountIds": []
230
+ },
231
+ "isMultiSelection": false,
232
+ "defaultValues": [],
233
+ "replacementStrategy": "STRING",
234
+ "options": {
235
+ "excluded": true
236
+ }
237
+ }
238
+ ]
239
+ }