mergen-server 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (308) hide show
  1. package/LICENSE +57 -0
  2. package/README.md +96 -0
  3. package/dist/__stubs__/calibration.js +471 -0
  4. package/dist/__stubs__/causal.js +601 -0
  5. package/dist/__stubs__/closed-source.js +150 -0
  6. package/dist/__stubs__/license.js +35 -0
  7. package/dist/__stubs__/plans.js +197 -0
  8. package/dist/app.js +467 -0
  9. package/dist/cli.js +250 -0
  10. package/dist/commands/agent-identity.js +79 -0
  11. package/dist/commands/gate.js +107 -0
  12. package/dist/commands/github.js +632 -0
  13. package/dist/commands/incident.js +644 -0
  14. package/dist/commands/policy.js +710 -0
  15. package/dist/commands/scan.js +243 -0
  16. package/dist/commands/setup.js +1218 -0
  17. package/dist/commands/shared.js +109 -0
  18. package/dist/commands/team.js +809 -0
  19. package/dist/datadog/blame-attribution.js +228 -0
  20. package/dist/datadog/client.js +159 -0
  21. package/dist/datadog/compactor.js +169 -0
  22. package/dist/datadog/fingerprinter.js +34 -0
  23. package/dist/datadog/incident-state.js +21 -0
  24. package/dist/datadog/line-matcher.js +56 -0
  25. package/dist/datadog/memory-store.js +399 -0
  26. package/dist/datadog/otel-trace.js +67 -0
  27. package/dist/index.js +505 -0
  28. package/dist/intelligence/action-risk.js +132 -0
  29. package/dist/intelligence/activity-feed.js +40 -0
  30. package/dist/intelligence/agent-identity.js +115 -0
  31. package/dist/intelligence/agent-pipeline.js +329 -0
  32. package/dist/intelligence/agent-profiles.js +81 -0
  33. package/dist/intelligence/ai-commit.js +16 -0
  34. package/dist/intelligence/approval-analytics.js +42 -0
  35. package/dist/intelligence/approval-events.js +5 -0
  36. package/dist/intelligence/arch-boundaries.js +94 -0
  37. package/dist/intelligence/arch-graph.js +117 -0
  38. package/dist/intelligence/autonomy.js +397 -0
  39. package/dist/intelligence/azure-broker.js +57 -0
  40. package/dist/intelligence/azure-proxy-sessions.js +49 -0
  41. package/dist/intelligence/baseline.js +1 -0
  42. package/dist/intelligence/behavior-baseline.js +134 -0
  43. package/dist/intelligence/billing.js +1 -0
  44. package/dist/intelligence/blast-radius.js +224 -0
  45. package/dist/intelligence/bypass.js +157 -0
  46. package/dist/intelligence/calibration-classifier.js +77 -0
  47. package/dist/intelligence/calibration-git-sync.js +74 -0
  48. package/dist/intelligence/calibration.js +1 -0
  49. package/dist/intelligence/cascade-detector.js +58 -0
  50. package/dist/intelligence/case-study-generator.js +126 -0
  51. package/dist/intelligence/causal-graph.js +126 -0
  52. package/dist/intelligence/causal.js +1 -0
  53. package/dist/intelligence/change-risk.js +102 -0
  54. package/dist/intelligence/compliance-report.js +134 -0
  55. package/dist/intelligence/confidence-report.js +85 -0
  56. package/dist/intelligence/corpus-to-policy.js +140 -0
  57. package/dist/intelligence/credential-broker.js +112 -0
  58. package/dist/intelligence/credential-misuse.js +39 -0
  59. package/dist/intelligence/debug-sessions.js +108 -0
  60. package/dist/intelligence/decision-escalation.js +36 -0
  61. package/dist/intelligence/decision-memory.js +47 -0
  62. package/dist/intelligence/decision-similarity.js +85 -0
  63. package/dist/intelligence/default-safety-tests.js +53 -0
  64. package/dist/intelligence/degradation-watcher.js +108 -0
  65. package/dist/intelligence/detector-plugins.js +70 -0
  66. package/dist/intelligence/detectors.js +1 -0
  67. package/dist/intelligence/device-auth.js +138 -0
  68. package/dist/intelligence/diff-size.js +42 -0
  69. package/dist/intelligence/ebpf-verify.js +45 -0
  70. package/dist/intelligence/enterprise-policy-engine.js +1122 -0
  71. package/dist/intelligence/error-fingerprint.js +1 -0
  72. package/dist/intelligence/execution-gate.js +100 -0
  73. package/dist/intelligence/execution-mode.js +22 -0
  74. package/dist/intelligence/gate-analytics.js +256 -0
  75. package/dist/intelligence/gate-decision.js +64 -0
  76. package/dist/intelligence/gcp-broker.js +50 -0
  77. package/dist/intelligence/git-adr-sync.js +207 -0
  78. package/dist/intelligence/hitl-hold.js +460 -0
  79. package/dist/intelligence/hypothesis-history.js +93 -0
  80. package/dist/intelligence/idp-identity.js +83 -0
  81. package/dist/intelligence/impl-critic.js +216 -0
  82. package/dist/intelligence/incident-autopilot.js +622 -0
  83. package/dist/intelligence/incident-replay.js +162 -0
  84. package/dist/intelligence/incident-result-cache.js +33 -0
  85. package/dist/intelligence/incident-similarity.js +58 -0
  86. package/dist/intelligence/infra-detectors.js +312 -0
  87. package/dist/intelligence/license.js +185 -0
  88. package/dist/intelligence/llm-spokesperson.js +62 -0
  89. package/dist/intelligence/mcp-prompts.js +320 -0
  90. package/dist/intelligence/mcp-resources.js +171 -0
  91. package/dist/intelligence/normalize.js +108 -0
  92. package/dist/intelligence/notifications.js +83 -0
  93. package/dist/intelligence/oidc-issuer.js +87 -0
  94. package/dist/intelligence/override-corpus.js +597 -0
  95. package/dist/intelligence/planning-gate.js +84 -0
  96. package/dist/intelligence/plans.js +223 -0
  97. package/dist/intelligence/platt-scaling.js +164 -0
  98. package/dist/intelligence/policy-proposals.js +84 -0
  99. package/dist/intelligence/policy-suggester.js +161 -0
  100. package/dist/intelligence/policy-sync.js +103 -0
  101. package/dist/intelligence/policy-test-runner.js +35 -0
  102. package/dist/intelligence/postmortem-parser.js +181 -0
  103. package/dist/intelligence/postmortem-retrieval.js +224 -0
  104. package/dist/intelligence/postmortem-store.js +596 -0
  105. package/dist/intelligence/pr-commenter.js +81 -0
  106. package/dist/intelligence/pr-policy-gate.js +38 -0
  107. package/dist/intelligence/pr-shadow-analyzer.js +229 -0
  108. package/dist/intelligence/process-tree.js +108 -0
  109. package/dist/intelligence/prompts.js +1 -0
  110. package/dist/intelligence/replay.js +38 -0
  111. package/dist/intelligence/repro-steps.js +1 -0
  112. package/dist/intelligence/resource-extractors.js +0 -0
  113. package/dist/intelligence/resource-file-context.js +138 -0
  114. package/dist/intelligence/risk-score.js +22 -0
  115. package/dist/intelligence/rollback.js +137 -0
  116. package/dist/intelligence/runbook-updater.js +143 -0
  117. package/dist/intelligence/sandbox.js +194 -0
  118. package/dist/intelligence/script-trust.js +104 -0
  119. package/dist/intelligence/session-metrics.js +67 -0
  120. package/dist/intelligence/session-threat-tracker.js +231 -0
  121. package/dist/intelligence/shadow-digest-cron.js +81 -0
  122. package/dist/intelligence/shadow-log.js +284 -0
  123. package/dist/intelligence/shell-ast.js +145 -0
  124. package/dist/intelligence/siem-forward.js +104 -0
  125. package/dist/intelligence/slack-digest.js +151 -0
  126. package/dist/intelligence/slack-override-loop.js +217 -0
  127. package/dist/intelligence/slack-routing.js +67 -0
  128. package/dist/intelligence/slack.js +900 -0
  129. package/dist/intelligence/sql-ast.js +31 -0
  130. package/dist/intelligence/team.js +1 -0
  131. package/dist/intelligence/telemetry.js +76 -0
  132. package/dist/intelligence/threshold-optimizer.js +75 -0
  133. package/dist/intelligence/token-budget.js +66 -0
  134. package/dist/intelligence/tool-guard.js +708 -0
  135. package/dist/intelligence/tool-manifest 2.js +74 -0
  136. package/dist/intelligence/tool-manifest.js +125 -0
  137. package/dist/intelligence/tools-analysis.js +857 -0
  138. package/dist/intelligence/tools-arch.js +152 -0
  139. package/dist/intelligence/tools-autonomy.js +495 -0
  140. package/dist/intelligence/tools-blast-radius.js +140 -0
  141. package/dist/intelligence/tools-browser.js +431 -0
  142. package/dist/intelligence/tools-change-timeline.js +154 -0
  143. package/dist/intelligence/tools-credentials.js +117 -0
  144. package/dist/intelligence/tools-datadog.js +233 -0
  145. package/dist/intelligence/tools-debug-sessions.js +209 -0
  146. package/dist/intelligence/tools-discovery.js +284 -0
  147. package/dist/intelligence/tools-infra.js +612 -0
  148. package/dist/intelligence/tools-intent.js +128 -0
  149. package/dist/intelligence/tools-memory.js +514 -0
  150. package/dist/intelligence/tools-runbook.js +951 -0
  151. package/dist/intelligence/tools-sessions.js +107 -0
  152. package/dist/intelligence/tools-state.js +232 -0
  153. package/dist/intelligence/tools-utility.js +430 -0
  154. package/dist/intelligence/tools-validate.js +215 -0
  155. package/dist/intelligence/tools.js +1 -0
  156. package/dist/intelligence/trace-context.js +11 -0
  157. package/dist/intelligence/unclassified-clusters.js +87 -0
  158. package/dist/intelligence/usage.js +195 -0
  159. package/dist/routes/active-authors.js +63 -0
  160. package/dist/routes/activity-feed.js +21 -0
  161. package/dist/routes/adr.js +117 -0
  162. package/dist/routes/agent-activity.js +184 -0
  163. package/dist/routes/agent-blunders.js +163 -0
  164. package/dist/routes/agents.js +175 -0
  165. package/dist/routes/api-keys.js +65 -0
  166. package/dist/routes/arch.js +75 -0
  167. package/dist/routes/audit-export.js +93 -0
  168. package/dist/routes/billing-dashboard.js +158 -0
  169. package/dist/routes/billing-outcome.js +77 -0
  170. package/dist/routes/calibration.js +305 -0
  171. package/dist/routes/ci-gate-history.js +20 -0
  172. package/dist/routes/ci-gate.js +232 -0
  173. package/dist/routes/ci.js +293 -0
  174. package/dist/routes/compliance-report.js +24 -0
  175. package/dist/routes/confidence.js +30 -0
  176. package/dist/routes/credentials.js +119 -0
  177. package/dist/routes/dashboard.js +1407 -0
  178. package/dist/routes/decision-memory.js +42 -0
  179. package/dist/routes/demo.js +844 -0
  180. package/dist/routes/device-auth-stub.js +173 -0
  181. package/dist/routes/explain-why.js +39 -0
  182. package/dist/routes/gate-analytics.js +213 -0
  183. package/dist/routes/gate.js +28 -0
  184. package/dist/routes/github-webhook.js +364 -0
  185. package/dist/routes/habituation.js +30 -0
  186. package/dist/routes/health-integrations.js +243 -0
  187. package/dist/routes/heartbeats.js +45 -0
  188. package/dist/routes/hitl.js +364 -0
  189. package/dist/routes/impact-report.js +645 -0
  190. package/dist/routes/incident-webhook.js +63 -0
  191. package/dist/routes/incidents.js +366 -0
  192. package/dist/routes/layers.js +62 -0
  193. package/dist/routes/license.js +187 -0
  194. package/dist/routes/oidc-issuer.js +30 -0
  195. package/dist/routes/onboarding.js +170 -0
  196. package/dist/routes/otel.js +67 -0
  197. package/dist/routes/otlp-receiver.js +179 -0
  198. package/dist/routes/overrides.js +241 -0
  199. package/dist/routes/pagerduty.js +258 -0
  200. package/dist/routes/policies.js +809 -0
  201. package/dist/routes/policy-nl.js +169 -0
  202. package/dist/routes/postmortem.js +102 -0
  203. package/dist/routes/pr-shadow.js +47 -0
  204. package/dist/routes/rbac.js +61 -0
  205. package/dist/routes/replay.js +17 -0
  206. package/dist/routes/risk-report.js +164 -0
  207. package/dist/routes/runbooks.js +125 -0
  208. package/dist/routes/safety-test.js +174 -0
  209. package/dist/routes/sdk.js +222 -0
  210. package/dist/routes/sensor.js +819 -0
  211. package/dist/routes/sentry.js +140 -0
  212. package/dist/routes/sessions.js +43 -0
  213. package/dist/routes/setup-ui.js +594 -0
  214. package/dist/routes/shadow-report.js +107 -0
  215. package/dist/routes/slack-routing.js +171 -0
  216. package/dist/routes/team-usage.js +71 -0
  217. package/dist/routes/telemetry.js +28 -0
  218. package/dist/routes/tenants.js +199 -0
  219. package/dist/routes/tickets.js +167 -0
  220. package/dist/routes/validate.js +13 -0
  221. package/dist/routes/war-room.js +113 -0
  222. package/dist/scripts/check-arch.js +22 -0
  223. package/dist/seeds/community-corpus.js +176 -0
  224. package/dist/seeds/corpus.js +1224 -0
  225. package/dist/sensor/action-ledger.js +327 -0
  226. package/dist/sensor/adr-store.js +140 -0
  227. package/dist/sensor/agent-blunder-store.js +370 -0
  228. package/dist/sensor/agent-context-store.js +225 -0
  229. package/dist/sensor/agent-memory-store.js +231 -0
  230. package/dist/sensor/audit-fetch.js +23 -0
  231. package/dist/sensor/audit-log.js +273 -0
  232. package/dist/sensor/buffer-schemas.js +225 -0
  233. package/dist/sensor/buffer.js +599 -0
  234. package/dist/sensor/bypass-tracker.js +93 -0
  235. package/dist/sensor/ci-gate-history.js +70 -0
  236. package/dist/sensor/cloud-auth.js +183 -0
  237. package/dist/sensor/commit-context-store.js +235 -0
  238. package/dist/sensor/docker-log-stream.js +164 -0
  239. package/dist/sensor/docker-monitor.js +122 -0
  240. package/dist/sensor/extended-buffer.js +46 -0
  241. package/dist/sensor/feedback-token.js +41 -0
  242. package/dist/sensor/file-lock.js +6 -0
  243. package/dist/sensor/fs-watcher.js +106 -0
  244. package/dist/sensor/gate-heartbeat.js +122 -0
  245. package/dist/sensor/git-suspect.js +136 -0
  246. package/dist/sensor/habituation-store.js +77 -0
  247. package/dist/sensor/heartbeat-monitor.js +133 -0
  248. package/dist/sensor/incident-store.js +340 -0
  249. package/dist/sensor/infra-normalizer.js +513 -0
  250. package/dist/sensor/ingest.js +339 -0
  251. package/dist/sensor/jest-reporter.js +52 -0
  252. package/dist/sensor/k8s-events.js +132 -0
  253. package/dist/sensor/layer2-store.js +111 -0
  254. package/dist/sensor/layer3-store.js +230 -0
  255. package/dist/sensor/layer4-store.js +147 -0
  256. package/dist/sensor/logger.js +13 -0
  257. package/dist/sensor/otel-exporter.js +161 -0
  258. package/dist/sensor/paths.js +71 -0
  259. package/dist/sensor/policy-history.js +147 -0
  260. package/dist/sensor/pr-shadow-store.js +83 -0
  261. package/dist/sensor/process-watcher.js +162 -0
  262. package/dist/sensor/rbac.js +92 -0
  263. package/dist/sensor/redact.js +114 -0
  264. package/dist/sensor/redis-store.js +191 -0
  265. package/dist/sensor/route-reachability.js +64 -0
  266. package/dist/sensor/security-utils.js +18 -0
  267. package/dist/sensor/service-graph.js +170 -0
  268. package/dist/sensor/service-topology.js +227 -0
  269. package/dist/sensor/session-history.js +74 -0
  270. package/dist/sensor/session-persist.js +38 -0
  271. package/dist/sensor/shadow-promote.js +122 -0
  272. package/dist/sensor/sourcemap.js +281 -0
  273. package/dist/sensor/sqlite-store.js +205 -0
  274. package/dist/sensor/sso.js +164 -0
  275. package/dist/sensor/vitest-reporter.js +65 -0
  276. package/dist/sensor/watcher.js +48 -0
  277. package/dist/storage/interfaces.js +0 -0
  278. package/dist/storage/pg/pg-action-ledger.js +138 -0
  279. package/dist/storage/pg/pg-approval-store.js +107 -0
  280. package/dist/storage/pg/pg-blunder-store.js +193 -0
  281. package/dist/storage/pg/pg-ci-gate-history.js +83 -0
  282. package/dist/storage/pg/pg-client.js +24 -0
  283. package/dist/storage/pg/pg-event-store.js +63 -0
  284. package/dist/storage/pg/pg-incident-store.js +190 -0
  285. package/dist/storage/pg/pg-migrations.js +26 -0
  286. package/dist/storage/pg/pg-override-corpus.js +447 -0
  287. package/dist/storage/pg/pg-shadow-log.js +129 -0
  288. package/dist/storage/sqlite/sqlite-action-ledger.js +18 -0
  289. package/dist/storage/sqlite/sqlite-approval-store.js +37 -0
  290. package/dist/storage/sqlite/sqlite-blunder-store.js +27 -0
  291. package/dist/storage/sqlite/sqlite-ci-gate-history.js +19 -0
  292. package/dist/storage/sqlite/sqlite-event-store.js +29 -0
  293. package/dist/storage/sqlite/sqlite-incident-store.js +34 -0
  294. package/dist/storage/sqlite/sqlite-override-corpus.js +75 -0
  295. package/dist/storage/sqlite/sqlite-shadow-log.js +36 -0
  296. package/dist/storage/store-factory.js +55 -0
  297. package/dist/storage/store-registry.js +31 -0
  298. package/dist/update-checker.js +107 -0
  299. package/dist/workers/autopilot-worker.js +28 -0
  300. package/dist/workers/notification-worker.js +28 -0
  301. package/dist/workers/queues.js +58 -0
  302. package/dist/workers/validation-worker.js +24 -0
  303. package/dist/workers/worker-registry.js +18 -0
  304. package/package.json +123 -0
  305. package/sdk/mergen-inject.js +260 -0
  306. package/sdk/node.js +313 -0
  307. package/sdk/vite-plugin.ts +57 -0
  308. package/sdk/webpack-plugin.js +106 -0
@@ -0,0 +1,29 @@
1
+ import { historyStore } from "../../sensor/sqlite-store.js";
2
+ class SqliteEventStore {
3
+ /** Delegates to historyStore.init() which is already async (sql.js WASM load). */
4
+ async init() {
5
+ return historyStore.init();
6
+ }
7
+ async push(event, tenantId) {
8
+ return Promise.resolve(historyStore.push(event, tenantId));
9
+ }
10
+ async query(opts) {
11
+ return Promise.resolve(historyStore.query(opts));
12
+ }
13
+ async size() {
14
+ return Promise.resolve(historyStore.size());
15
+ }
16
+ /**
17
+ * tenantId is accepted for interface conformance but ignored in SQLite mode —
18
+ * the underlying clear() operates on the whole single-tenant database.
19
+ */
20
+ async clear(_tenantId) {
21
+ return Promise.resolve(historyStore.clear());
22
+ }
23
+ async pruneOld() {
24
+ return Promise.resolve(historyStore.pruneOld());
25
+ }
26
+ }
27
+ export {
28
+ SqliteEventStore
29
+ };
@@ -0,0 +1,34 @@
1
+ import { incidentStore } from "../../sensor/incident-store.js";
2
+ class SqliteIncidentStore {
3
+ /** Delegates to incidentStore.init() which is already async (sql.js WASM load). */
4
+ async init() {
5
+ return incidentStore.init();
6
+ }
7
+ async upsert(pid, fields, _tenantId) {
8
+ return Promise.resolve(incidentStore.upsert(pid, fields));
9
+ }
10
+ async get(pid, _tenantId) {
11
+ return Promise.resolve(incidentStore.get(pid));
12
+ }
13
+ async list(status, limit, _tenantId) {
14
+ return Promise.resolve(incidentStore.list(status, limit));
15
+ }
16
+ async addNote(pid, note, author, _tenantId) {
17
+ return Promise.resolve(incidentStore.addNote(pid, note, author));
18
+ }
19
+ async markContextViewed(pid, _tenantId) {
20
+ return Promise.resolve(incidentStore.markContextViewed(pid));
21
+ }
22
+ async coOccurringServices(service, windowMs, limit, _tenantId) {
23
+ return Promise.resolve(incidentStore.coOccurringServices(service, windowMs, limit));
24
+ }
25
+ async updateServiceEdges(service, at, windowMs, _tenantId) {
26
+ return Promise.resolve(incidentStore.updateServiceEdges(service, at, windowMs));
27
+ }
28
+ async getInteractionGraph(service, _tenantId) {
29
+ return Promise.resolve(incidentStore.getInteractionGraph(service));
30
+ }
31
+ }
32
+ export {
33
+ SqliteIncidentStore
34
+ };
@@ -0,0 +1,75 @@
1
+ import {
2
+ recordOverride,
3
+ updateOutcome,
4
+ hasRecentOverride,
5
+ dominantOverrideReason,
6
+ getOverridesForTag,
7
+ getOverrideById,
8
+ getAllOverrides,
9
+ compactCorpus,
10
+ getRulesForTag,
11
+ describeTopRule,
12
+ getOverrideSummary,
13
+ compileOverrideFromSlackThread,
14
+ compileOverridesFromSlackThread,
15
+ getStaleOverrides,
16
+ getExpiringSoon,
17
+ markOverrideReviewed,
18
+ importOverrides
19
+ } from "../../intelligence/override-corpus.js";
20
+ class SqliteOverrideCorpus {
21
+ async recordOverride(input, _tenantId) {
22
+ return Promise.resolve(recordOverride(input));
23
+ }
24
+ async updateOutcome(id, outcome, _tenantId) {
25
+ return Promise.resolve(updateOutcome(id, outcome));
26
+ }
27
+ async hasRecentOverride(incidentTag, service, dayOfWeek, hourOfDay, _tenantId) {
28
+ return Promise.resolve(hasRecentOverride(incidentTag, service, dayOfWeek, hourOfDay));
29
+ }
30
+ async dominantOverrideReason(incidentTag, service, _tenantId) {
31
+ return Promise.resolve(dominantOverrideReason(incidentTag, service));
32
+ }
33
+ async getOverridesForTag(tag, _tenantId) {
34
+ return Promise.resolve(getOverridesForTag(tag));
35
+ }
36
+ async getOverrideById(id, _tenantId) {
37
+ return Promise.resolve(getOverrideById(id));
38
+ }
39
+ async getAllOverrides(_tenantId) {
40
+ return Promise.resolve(getAllOverrides());
41
+ }
42
+ async compactCorpus(_tenantId) {
43
+ return Promise.resolve(compactCorpus());
44
+ }
45
+ async getRulesForTag(incidentTag, service, _tenantId) {
46
+ return Promise.resolve(getRulesForTag(incidentTag, service));
47
+ }
48
+ async describeTopRule(incidentTag, service, _tenantId) {
49
+ return Promise.resolve(describeTopRule(incidentTag, service));
50
+ }
51
+ async getOverrideSummary(_tenantId) {
52
+ return Promise.resolve(getOverrideSummary());
53
+ }
54
+ async compileOverrideFromSlackThread(slackThread, service, _tenantId) {
55
+ return Promise.resolve(compileOverrideFromSlackThread(slackThread, service));
56
+ }
57
+ async compileOverridesFromSlackThread(slackThread, service, _tenantId) {
58
+ return Promise.resolve(compileOverridesFromSlackThread(slackThread, service));
59
+ }
60
+ async getStaleOverrides(daysThreshold = 60, _tenantId) {
61
+ return Promise.resolve(getStaleOverrides(daysThreshold));
62
+ }
63
+ async getExpiringSoon(windowDays = 14, _tenantId) {
64
+ return Promise.resolve(getExpiringSoon(windowDays));
65
+ }
66
+ async markOverrideReviewed(id, _tenantId) {
67
+ return Promise.resolve(markOverrideReviewed(id));
68
+ }
69
+ async importOverrides(entries, opts, _tenantId) {
70
+ return Promise.resolve(importOverrides(entries, opts));
71
+ }
72
+ }
73
+ export {
74
+ SqliteOverrideCorpus
75
+ };
@@ -0,0 +1,36 @@
1
+ import {
2
+ recordShadow,
3
+ recordShadowVerdict,
4
+ updateShadowReasonByPid,
5
+ getShadowLog,
6
+ getShadowReport,
7
+ getShadowSlackDigest,
8
+ exportShadowCsv
9
+ } from "../../intelligence/shadow-log.js";
10
+ class SqliteShadowLog {
11
+ async recordShadow(input, _tenantId) {
12
+ return Promise.resolve(recordShadow(input));
13
+ }
14
+ async recordShadowVerdict(id, verdict, opts, _tenantId) {
15
+ return Promise.resolve(recordShadowVerdict(id, verdict, opts));
16
+ }
17
+ async updateShadowReasonByPid(pid, skipReason, _tenantId) {
18
+ updateShadowReasonByPid(pid, skipReason);
19
+ return Promise.resolve();
20
+ }
21
+ async getShadowEntries(_tenantId) {
22
+ return Promise.resolve(getShadowLog());
23
+ }
24
+ async getShadowReport(windowDays = 30, _tenantId) {
25
+ return Promise.resolve(getShadowReport(windowDays));
26
+ }
27
+ async getShadowSlackDigest(windowDays = 7, _tenantId) {
28
+ return Promise.resolve(getShadowSlackDigest(windowDays));
29
+ }
30
+ async exportShadowCsv(_tenantId) {
31
+ return Promise.resolve(exportShadowCsv());
32
+ }
33
+ }
34
+ export {
35
+ SqliteShadowLog
36
+ };
@@ -0,0 +1,55 @@
1
+ import { SqliteEventStore } from "./sqlite/sqlite-event-store.js";
2
+ import { SqliteIncidentStore } from "./sqlite/sqlite-incident-store.js";
3
+ import { SqliteOverrideCorpus } from "./sqlite/sqlite-override-corpus.js";
4
+ import { SqliteApprovalStore } from "./sqlite/sqlite-approval-store.js";
5
+ import { SqliteShadowLog } from "./sqlite/sqlite-shadow-log.js";
6
+ import { SqliteBlunderStore } from "./sqlite/sqlite-blunder-store.js";
7
+ import { SqliteGateHistoryStore } from "./sqlite/sqlite-ci-gate-history.js";
8
+ import { SqliteActionLedger } from "./sqlite/sqlite-action-ledger.js";
9
+ async function createStores() {
10
+ const cloudMode = process.env.MERGEN_CLOUD_MODE === "true";
11
+ if (cloudMode) {
12
+ const [
13
+ { PgEventStore },
14
+ { PgIncidentStore },
15
+ { PgOverrideCorpus },
16
+ { PgApprovalStore },
17
+ { PgShadowLog },
18
+ { PgBlunderStore },
19
+ { PgGateHistoryStore },
20
+ { PgActionLedger }
21
+ ] = await Promise.all([
22
+ import("./pg/pg-event-store.js"),
23
+ import("./pg/pg-incident-store.js"),
24
+ import("./pg/pg-override-corpus.js"),
25
+ import("./pg/pg-approval-store.js"),
26
+ import("./pg/pg-shadow-log.js"),
27
+ import("./pg/pg-blunder-store.js"),
28
+ import("./pg/pg-ci-gate-history.js"),
29
+ import("./pg/pg-action-ledger.js")
30
+ ]);
31
+ return {
32
+ events: new PgEventStore(),
33
+ incidents: new PgIncidentStore(),
34
+ overrides: new PgOverrideCorpus(),
35
+ approvals: new PgApprovalStore(),
36
+ shadowLog: new PgShadowLog(),
37
+ blunders: new PgBlunderStore(),
38
+ gateHistory: new PgGateHistoryStore(),
39
+ actionLedger: new PgActionLedger()
40
+ };
41
+ }
42
+ return {
43
+ events: new SqliteEventStore(),
44
+ incidents: new SqliteIncidentStore(),
45
+ overrides: new SqliteOverrideCorpus(),
46
+ approvals: new SqliteApprovalStore(),
47
+ shadowLog: new SqliteShadowLog(),
48
+ blunders: new SqliteBlunderStore(),
49
+ gateHistory: new SqliteGateHistoryStore(),
50
+ actionLedger: new SqliteActionLedger()
51
+ };
52
+ }
53
+ export {
54
+ createStores
55
+ };
@@ -0,0 +1,31 @@
1
+ import { SqliteEventStore } from "./sqlite/sqlite-event-store.js";
2
+ import { SqliteIncidentStore } from "./sqlite/sqlite-incident-store.js";
3
+ import { SqliteOverrideCorpus } from "./sqlite/sqlite-override-corpus.js";
4
+ import { SqliteApprovalStore } from "./sqlite/sqlite-approval-store.js";
5
+ import { SqliteShadowLog } from "./sqlite/sqlite-shadow-log.js";
6
+ import { SqliteBlunderStore } from "./sqlite/sqlite-blunder-store.js";
7
+ import { SqliteGateHistoryStore } from "./sqlite/sqlite-ci-gate-history.js";
8
+ import { SqliteActionLedger } from "./sqlite/sqlite-action-ledger.js";
9
+ let _stores = null;
10
+ function setStores(s) {
11
+ _stores = s;
12
+ }
13
+ function getStores() {
14
+ if (!_stores) {
15
+ _stores = {
16
+ events: new SqliteEventStore(),
17
+ incidents: new SqliteIncidentStore(),
18
+ overrides: new SqliteOverrideCorpus(),
19
+ approvals: new SqliteApprovalStore(),
20
+ shadowLog: new SqliteShadowLog(),
21
+ blunders: new SqliteBlunderStore(),
22
+ gateHistory: new SqliteGateHistoryStore(),
23
+ actionLedger: new SqliteActionLedger()
24
+ };
25
+ }
26
+ return _stores;
27
+ }
28
+ export {
29
+ getStores,
30
+ setStores
31
+ };
@@ -0,0 +1,107 @@
1
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
2
+ import { resolve } from "path";
3
+ import { homedir } from "os";
4
+ const UPDATE_CHECK_INTERVAL = 24 * 60 * 60 * 1e3;
5
+ const GITHUB_API = "https://api.github.com/repos/omertt27/Mergen/releases/latest";
6
+ const CACHE_DIR = resolve(homedir(), ".mergen");
7
+ const CACHE_FILE = resolve(CACHE_DIR, "update-check.json");
8
+ async function checkForUpdates(currentVersion) {
9
+ if (process.env.NO_UPDATE_NOTIFIER === "1" || process.env.NO_UPDATE_NOTIFIER === "true") {
10
+ return null;
11
+ }
12
+ if (process.env.CI === "true" || process.env.CI === "1") {
13
+ return null;
14
+ }
15
+ try {
16
+ const cache = readCache();
17
+ const now = Date.now();
18
+ if (cache && now - cache.lastCheck < UPDATE_CHECK_INTERVAL) {
19
+ if (cache.latestVersion && !cache.notified && isNewer(cache.latestVersion, currentVersion)) {
20
+ markNotified(cache.latestVersion);
21
+ return cache.latestVersion;
22
+ }
23
+ return null;
24
+ }
25
+ const controller = new AbortController();
26
+ const timeout = setTimeout(() => controller.abort(), 3e3);
27
+ const response = await fetch(GITHUB_API, {
28
+ signal: controller.signal,
29
+ headers: { "User-Agent": "Mergen-Update-Checker" }
30
+ });
31
+ clearTimeout(timeout);
32
+ if (!response.ok) {
33
+ return null;
34
+ }
35
+ const data = await response.json();
36
+ const latestVersion = data.tag_name.replace(/^v/, "");
37
+ writeCache({
38
+ lastCheck: now,
39
+ latestVersion,
40
+ notified: false
41
+ });
42
+ if (isNewer(latestVersion, currentVersion)) {
43
+ markNotified(latestVersion);
44
+ return latestVersion;
45
+ }
46
+ return null;
47
+ } catch (err) {
48
+ return null;
49
+ }
50
+ }
51
+ function isNewer(latest, current) {
52
+ const latestParts = latest.split(".").map(Number);
53
+ const currentParts = current.split(".").map(Number);
54
+ for (let i = 0; i < 3; i++) {
55
+ const l = latestParts[i] || 0;
56
+ const c = currentParts[i] || 0;
57
+ if (l > c) return true;
58
+ if (l < c) return false;
59
+ }
60
+ return false;
61
+ }
62
+ function readCache() {
63
+ try {
64
+ if (!existsSync(CACHE_FILE)) return null;
65
+ const content = readFileSync(CACHE_FILE, "utf8");
66
+ return JSON.parse(content);
67
+ } catch {
68
+ return null;
69
+ }
70
+ }
71
+ function writeCache(cache) {
72
+ try {
73
+ if (!existsSync(CACHE_DIR)) {
74
+ mkdirSync(CACHE_DIR, { recursive: true });
75
+ }
76
+ writeFileSync(CACHE_FILE, JSON.stringify(cache, null, 2), "utf8");
77
+ } catch {
78
+ }
79
+ }
80
+ function markNotified(version) {
81
+ const cache = readCache();
82
+ if (cache && cache.latestVersion === version) {
83
+ writeCache({ ...cache, notified: true });
84
+ }
85
+ }
86
+ function formatUpdateMessage(currentVersion, latestVersion) {
87
+ return `
88
+ \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510
89
+ \u2502 \u2502
90
+ \u2502 \u{1F4E6} Mergen update available: ${currentVersion} \u2192 ${latestVersion} \u2502
91
+ \u2502 \u2502
92
+ \u2502 Update now: \u2502
93
+ \u2502 $ npx mergen-server@latest \u2502
94
+ \u2502 \u2502
95
+ \u2502 Or globally: \u2502
96
+ \u2502 $ npm install -g mergen-server@latest \u2502
97
+ \u2502 \u2502
98
+ \u2502 Changelog: \u2502
99
+ \u2502 https://github.com/omertt27/Mergen/releases \u2502
100
+ \u2502 \u2502
101
+ \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518
102
+ `;
103
+ }
104
+ export {
105
+ checkForUpdates,
106
+ formatUpdateMessage
107
+ };
@@ -0,0 +1,28 @@
1
+ import { Worker } from "bullmq";
2
+ import { bullConnection } from "./queues.js";
3
+ import { runIncidentAutopilotLocal } from "../intelligence/incident-autopilot.js";
4
+ import logger from "../sensor/logger.js";
5
+ function startAutopilotWorker() {
6
+ const worker = new Worker(
7
+ "mergen-autopilot",
8
+ async (job) => {
9
+ const { service, pid, firedAt, tenantId, cwd } = job.data;
10
+ logger.info({ pid, service }, "autopilot-worker: processing job");
11
+ await runIncidentAutopilotLocal({ service, pid, firedAt, tenantId, cwd });
12
+ },
13
+ {
14
+ connection: bullConnection(),
15
+ concurrency: 3
16
+ }
17
+ );
18
+ worker.on("completed", (job) => {
19
+ logger.info({ jobId: job.id, pid: job.data.pid }, "autopilot-worker: job completed");
20
+ });
21
+ worker.on("failed", (job, err) => {
22
+ logger.error({ jobId: job?.id, pid: job?.data.pid, err }, "autopilot-worker: job failed");
23
+ });
24
+ return worker;
25
+ }
26
+ export {
27
+ startAutopilotWorker
28
+ };
@@ -0,0 +1,28 @@
1
+ import { Worker } from "bullmq";
2
+ import { bullConnection } from "./queues.js";
3
+ import logger from "../sensor/logger.js";
4
+ function startNotificationWorker() {
5
+ const worker = new Worker(
6
+ "mergen-notifications",
7
+ async (job) => {
8
+ const { pid, text, threadTs, channel } = job.data;
9
+ const { postThreadReply, postSimpleWebhookNotification } = await import("../intelligence/slack.js");
10
+ if (threadTs) {
11
+ await postThreadReply(pid, text);
12
+ } else {
13
+ await postSimpleWebhookNotification(channel ?? pid, text);
14
+ }
15
+ },
16
+ {
17
+ connection: bullConnection(),
18
+ concurrency: 10
19
+ }
20
+ );
21
+ worker.on("failed", (job, err) => {
22
+ logger.error({ jobId: job?.id, pid: job?.data.pid, err }, "notification-worker: job failed");
23
+ });
24
+ return worker;
25
+ }
26
+ export {
27
+ startNotificationWorker
28
+ };
@@ -0,0 +1,58 @@
1
+ import { Redis } from "ioredis";
2
+ import { Queue } from "bullmq";
3
+ function bullConnection() {
4
+ return getRedisConnection();
5
+ }
6
+ let _connection = null;
7
+ function getRedisConnection() {
8
+ if (!_connection) {
9
+ const url = process.env.MERGEN_REDIS_URL;
10
+ if (!url) throw new Error("MERGEN_REDIS_URL is not set");
11
+ _connection = new Redis(url, { maxRetriesPerRequest: null });
12
+ }
13
+ return _connection;
14
+ }
15
+ function closeRedisConnection() {
16
+ if (_connection) {
17
+ const c = _connection;
18
+ _connection = null;
19
+ return c.quit().then(() => void 0);
20
+ }
21
+ return Promise.resolve();
22
+ }
23
+ let _autopilotQueue = null;
24
+ let _notificationQueue = null;
25
+ function getAutopilotQueue() {
26
+ if (!_autopilotQueue) {
27
+ _autopilotQueue = new Queue("mergen-autopilot", {
28
+ connection: bullConnection(),
29
+ defaultJobOptions: {
30
+ attempts: 1,
31
+ removeOnComplete: { count: 1e3, age: 86400 },
32
+ removeOnFail: { count: 500 }
33
+ }
34
+ });
35
+ }
36
+ return _autopilotQueue;
37
+ }
38
+ function getNotificationQueue() {
39
+ if (!_notificationQueue) {
40
+ _notificationQueue = new Queue("mergen-notifications", {
41
+ connection: bullConnection(),
42
+ defaultJobOptions: {
43
+ attempts: 3,
44
+ backoff: { type: "exponential", delay: 2e3 },
45
+ removeOnComplete: { count: 500 },
46
+ removeOnFail: { count: 200 }
47
+ }
48
+ });
49
+ }
50
+ return _notificationQueue;
51
+ }
52
+ export {
53
+ bullConnection,
54
+ closeRedisConnection,
55
+ getAutopilotQueue,
56
+ getNotificationQueue,
57
+ getRedisConnection
58
+ };
@@ -0,0 +1,24 @@
1
+ import { Worker } from "bullmq";
2
+ import { bullConnection } from "./queues.js";
3
+ import logger from "../sensor/logger.js";
4
+ function startValidationWorker() {
5
+ const worker = new Worker(
6
+ "mergen-validation",
7
+ async (job) => {
8
+ const { service, pid, command, beforeCount, fixAppliedAt, tenantId } = job.data;
9
+ const { runPostFixValidation } = await import("../intelligence/incident-autopilot.js");
10
+ await runPostFixValidation({ service, pid, command, beforeCount, fixAppliedAt, tenantId });
11
+ },
12
+ {
13
+ connection: bullConnection(),
14
+ concurrency: 5
15
+ }
16
+ );
17
+ worker.on("failed", (job, err) => {
18
+ logger.error({ jobId: job?.id, pid: job?.data.pid, err }, "validation-worker: job failed");
19
+ });
20
+ return worker;
21
+ }
22
+ export {
23
+ startValidationWorker
24
+ };
@@ -0,0 +1,18 @@
1
+ import { startAutopilotWorker } from "./autopilot-worker.js";
2
+ import { startNotificationWorker } from "./notification-worker.js";
3
+ import logger from "../sensor/logger.js";
4
+ const _workers = [];
5
+ async function startWorkers() {
6
+ _workers.push(startAutopilotWorker());
7
+ _workers.push(startNotificationWorker());
8
+ logger.info({ count: _workers.length }, "workers: all BullMQ workers started");
9
+ }
10
+ async function stopWorkers() {
11
+ await Promise.all(_workers.map((w) => w.close()));
12
+ _workers.length = 0;
13
+ logger.info("workers: all BullMQ workers stopped");
14
+ }
15
+ export {
16
+ startWorkers,
17
+ stopWorkers
18
+ };
package/package.json ADDED
@@ -0,0 +1,123 @@
1
+ {
2
+ "name": "mergen-server",
3
+ "version": "1.4.0",
4
+ "description": "Mergen — AI operations layer for backend & infrastructure. Triages production incidents autonomously: OpenTelemetry + PagerDuty → causal analysis → executes fix at ≥85% confidence → validates → posts to Slack thread. MCP server for Claude Code, Cursor, Windsurf, VS Code.",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "mergen-server": "dist/cli.js"
9
+ },
10
+ "files": [
11
+ "dist/**/*.js",
12
+ "dist/**/*.d.ts",
13
+ "!dist/**/__tests__/**",
14
+ "sdk/**",
15
+ "README.md",
16
+ "LICENSE"
17
+ ],
18
+ "keywords": [
19
+ "mcp",
20
+ "model-context-protocol",
21
+ "ai",
22
+ "incident-management",
23
+ "autonomous-triage",
24
+ "sre",
25
+ "devops",
26
+ "platform-engineering",
27
+ "opentelemetry",
28
+ "otlp",
29
+ "pagerduty",
30
+ "observability",
31
+ "on-call",
32
+ "mttr",
33
+ "backend",
34
+ "infrastructure",
35
+ "claude",
36
+ "cursor",
37
+ "windsurf"
38
+ ],
39
+ "homepage": "https://github.com/omertt27/Mergen#readme",
40
+ "repository": {
41
+ "type": "git",
42
+ "url": "https://github.com/omertt27/Mergen.git",
43
+ "directory": "server"
44
+ },
45
+ "bugs": {
46
+ "url": "https://github.com/omertt27/Mergen/issues"
47
+ },
48
+ "license": "MIT",
49
+ "author": "omertt27",
50
+ "engines": {
51
+ "node": ">=18.17"
52
+ },
53
+ "publishConfig": {
54
+ "access": "public"
55
+ },
56
+ "scripts": {
57
+ "prepack": "mkdir -p sdk && cp ../sdk/node.js sdk/ && cp ../sdk/mergen-inject.js sdk/ && cp ../sdk/vite-plugin.ts sdk/ && cp ../sdk/webpack-plugin.js sdk/",
58
+ "postpack": "rm -rf sdk",
59
+ "build": "node scripts/build-fast.mjs && node scripts/build-cli.mjs",
60
+ "build:tsc": "node --max-old-space-size=12288 node_modules/.bin/tsc && node scripts/build-cli.mjs",
61
+ "build:server": "node --max-old-space-size=12288 node_modules/.bin/tsc",
62
+ "start": "node dist/index.js",
63
+ "dev": "tsx watch src/index.ts",
64
+ "test": "vitest run",
65
+ "test:watch": "vitest",
66
+ "lint": "eslint src",
67
+ "lint:fix": "eslint src --fix",
68
+ "check:arch": "node scripts/check-arch.mjs",
69
+ "test:coverage": "vitest run --coverage",
70
+ "test:ci": "vitest run --config vitest.config.ci.ts",
71
+ "test:ci:coverage": "vitest run --config vitest.config.ci.ts --coverage",
72
+ "eval": "node ../scripts/eval.mjs",
73
+ "eval:fast": "node ../scripts/eval.mjs --model gpt-4o-mini",
74
+ "eval:regression": "vitest run evals",
75
+ "eval:update-baseline": "node ../scripts/update-eval-baseline.mjs",
76
+ "eval:seed-corpus": "node ../scripts/seed-corpus.mjs",
77
+ "benchmark": "node scripts/benchmark/run.mjs",
78
+ "benchmark:fp": "node scripts/benchmark/false-positive.mjs",
79
+ "benchmark:perf": "node --expose-gc scripts/benchmark/performance.mjs",
80
+ "benchmark:policy": "node scripts/benchmark/resource-policy.mjs",
81
+ "benchmark:incidents": "node scripts/benchmark/incident-replay.mjs",
82
+ "benchmark:all": "node scripts/benchmark/suite.mjs"
83
+ },
84
+ "dependencies": {
85
+ "@aws-sdk/client-sts": "^3.1079.0",
86
+ "@lemonsqueezy/lemonsqueezy.js": "^4.0.0",
87
+ "@modelcontextprotocol/sdk": "1.29.0",
88
+ "@opentelemetry/api": "^1.9.1",
89
+ "@opentelemetry/exporter-logs-otlp-http": "^0.218.0",
90
+ "@opentelemetry/sdk-logs": "^0.218.0",
91
+ "bash-parser": "^0.5.0",
92
+ "bullmq": "^5.0.0",
93
+ "debug": "^4.4.0",
94
+ "express": "^4.22.1",
95
+ "fast-glob": "3.3.3",
96
+ "helmet": "^8.0.0",
97
+ "ioredis": "^5.0.0",
98
+ "jose": "^6.2.2",
99
+ "lru-cache": "11.3.5",
100
+ "node-sql-parser": "^5.4.0",
101
+ "openid-client": "^6.8.4",
102
+ "pino": "10.3.1",
103
+ "postgres": "^3.0.0",
104
+ "source-map": "0.7.4",
105
+ "sql.js": "^1.14.1",
106
+ "stripe": "^22.2.0",
107
+ "zod": "^3.24.2"
108
+ },
109
+ "devDependencies": {
110
+ "@eslint/js": "^9.39.4",
111
+ "@types/express": "4.17.21",
112
+ "@types/node": "20.11.5",
113
+ "@types/sql.js": "^1.4.11",
114
+ "@vitest/coverage-v8": "^4.1.9",
115
+ "eslint": "^9.39.4",
116
+ "expect-type": "^0.19.0",
117
+ "rolldown": "^1.1.0",
118
+ "tsx": "^4.21.0",
119
+ "typescript": "5.3.3",
120
+ "typescript-eslint": "^8.62.1",
121
+ "vitest": "^4.1.9"
122
+ }
123
+ }