@uptimizr/collector-server 2.0.1 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/AGENTS.md +187 -11
  2. package/README.md +91 -7
  3. package/dist/__tests__/support/registryRequests.d.ts +2 -1
  4. package/dist/__tests__/support/registryRequests.d.ts.map +1 -1
  5. package/dist/__tests__/support/registryRequests.js +17 -1
  6. package/dist/__tests__/support/registryRequests.js.map +1 -1
  7. package/dist/__tests__/support/subscriptionFixtures.d.ts +63 -0
  8. package/dist/__tests__/support/subscriptionFixtures.d.ts.map +1 -0
  9. package/dist/__tests__/support/subscriptionFixtures.js +17 -0
  10. package/dist/__tests__/support/subscriptionFixtures.js.map +1 -0
  11. package/dist/agentReport.d.ts +256 -0
  12. package/dist/agentReport.d.ts.map +1 -0
  13. package/dist/agentReport.js +861 -0
  14. package/dist/agentReport.js.map +1 -0
  15. package/dist/app.d.ts +13 -0
  16. package/dist/app.d.ts.map +1 -1
  17. package/dist/app.js +112 -5
  18. package/dist/app.js.map +1 -1
  19. package/dist/audit.d.ts +5 -1
  20. package/dist/audit.d.ts.map +1 -1
  21. package/dist/audit.js +24 -4
  22. package/dist/audit.js.map +1 -1
  23. package/dist/auth.d.ts +41 -1
  24. package/dist/auth.d.ts.map +1 -1
  25. package/dist/auth.js +47 -0
  26. package/dist/auth.js.map +1 -1
  27. package/dist/cli.js +133 -13
  28. package/dist/cli.js.map +1 -1
  29. package/dist/cliStore.d.ts +31 -2
  30. package/dist/cliStore.d.ts.map +1 -1
  31. package/dist/cliStore.js +34 -0
  32. package/dist/cliStore.js.map +1 -1
  33. package/dist/clickhouseStore.d.ts.map +1 -1
  34. package/dist/clickhouseStore.js +44 -2
  35. package/dist/clickhouseStore.js.map +1 -1
  36. package/dist/config.d.ts +49 -0
  37. package/dist/config.d.ts.map +1 -1
  38. package/dist/config.js +21 -0
  39. package/dist/config.js.map +1 -1
  40. package/dist/connectionLimiter.d.ts +23 -0
  41. package/dist/connectionLimiter.d.ts.map +1 -0
  42. package/dist/connectionLimiter.js +24 -0
  43. package/dist/connectionLimiter.js.map +1 -0
  44. package/dist/duckdbStore.d.ts.map +1 -1
  45. package/dist/duckdbStore.js +44 -1
  46. package/dist/duckdbStore.js.map +1 -1
  47. package/dist/internalDispatch.d.ts +36 -0
  48. package/dist/internalDispatch.d.ts.map +1 -0
  49. package/dist/internalDispatch.js +50 -0
  50. package/dist/internalDispatch.js.map +1 -0
  51. package/dist/memoryStore.d.ts.map +1 -1
  52. package/dist/memoryStore.js +314 -1
  53. package/dist/memoryStore.js.map +1 -1
  54. package/dist/mssqlStore.d.ts.map +1 -1
  55. package/dist/mssqlStore.js +44 -2
  56. package/dist/mssqlStore.js.map +1 -1
  57. package/dist/postgresStore.d.ts.map +1 -1
  58. package/dist/postgresStore.js +44 -2
  59. package/dist/postgresStore.js.map +1 -1
  60. package/dist/projectMetadata.d.ts +82 -0
  61. package/dist/projectMetadata.d.ts.map +1 -0
  62. package/dist/projectMetadata.js +50 -0
  63. package/dist/projectMetadata.js.map +1 -0
  64. package/dist/routes/context.d.ts +135 -0
  65. package/dist/routes/context.d.ts.map +1 -0
  66. package/dist/routes/context.js +306 -0
  67. package/dist/routes/context.js.map +1 -0
  68. package/dist/routes/insights.d.ts +36 -0
  69. package/dist/routes/insights.d.ts.map +1 -0
  70. package/dist/routes/insights.js +810 -0
  71. package/dist/routes/insights.js.map +1 -0
  72. package/dist/routes/live.d.ts +8 -0
  73. package/dist/routes/live.d.ts.map +1 -1
  74. package/dist/routes/live.js +8 -7
  75. package/dist/routes/live.js.map +1 -1
  76. package/dist/routes/mcp.d.ts +36 -0
  77. package/dist/routes/mcp.d.ts.map +1 -0
  78. package/dist/routes/mcp.js +262 -0
  79. package/dist/routes/mcp.js.map +1 -0
  80. package/dist/routes/meta.d.ts +16 -2
  81. package/dist/routes/meta.d.ts.map +1 -1
  82. package/dist/routes/meta.js +699 -10
  83. package/dist/routes/meta.js.map +1 -1
  84. package/dist/routes/metadata.d.ts +31 -0
  85. package/dist/routes/metadata.d.ts.map +1 -0
  86. package/dist/routes/metadata.js +163 -0
  87. package/dist/routes/metadata.js.map +1 -0
  88. package/dist/routes/narrative.d.ts +36 -0
  89. package/dist/routes/narrative.d.ts.map +1 -0
  90. package/dist/routes/narrative.js +95 -0
  91. package/dist/routes/narrative.js.map +1 -0
  92. package/dist/routes/panels.d.ts +44 -0
  93. package/dist/routes/panels.d.ts.map +1 -0
  94. package/dist/routes/panels.js +108 -0
  95. package/dist/routes/panels.js.map +1 -0
  96. package/dist/routes/query-dsl.d.ts +50 -0
  97. package/dist/routes/query-dsl.d.ts.map +1 -0
  98. package/dist/routes/query-dsl.js +359 -0
  99. package/dist/routes/query-dsl.js.map +1 -0
  100. package/dist/routes/query.d.ts +36 -0
  101. package/dist/routes/query.d.ts.map +1 -1
  102. package/dist/routes/query.js +101 -13
  103. package/dist/routes/query.js.map +1 -1
  104. package/dist/routes/subscriptions.d.ts +52 -0
  105. package/dist/routes/subscriptions.d.ts.map +1 -0
  106. package/dist/routes/subscriptions.js +290 -0
  107. package/dist/routes/subscriptions.js.map +1 -0
  108. package/dist/store.d.ts +113 -2
  109. package/dist/store.d.ts.map +1 -1
  110. package/dist/subscriptions/cli.d.ts +36 -0
  111. package/dist/subscriptions/cli.d.ts.map +1 -0
  112. package/dist/subscriptions/cli.js +143 -0
  113. package/dist/subscriptions/cli.js.map +1 -0
  114. package/dist/subscriptions/delivery.d.ts +101 -0
  115. package/dist/subscriptions/delivery.d.ts.map +1 -0
  116. package/dist/subscriptions/delivery.js +165 -0
  117. package/dist/subscriptions/delivery.js.map +1 -0
  118. package/dist/subscriptions/evaluate.d.ts +119 -0
  119. package/dist/subscriptions/evaluate.d.ts.map +1 -0
  120. package/dist/subscriptions/evaluate.js +326 -0
  121. package/dist/subscriptions/evaluate.js.map +1 -0
  122. package/dist/subscriptions/scheduler.d.ts +97 -0
  123. package/dist/subscriptions/scheduler.d.ts.map +1 -0
  124. package/dist/subscriptions/scheduler.js +332 -0
  125. package/dist/subscriptions/scheduler.js.map +1 -0
  126. package/dist/subscriptions/stream.d.ts +40 -0
  127. package/dist/subscriptions/stream.d.ts.map +1 -0
  128. package/dist/subscriptions/stream.js +38 -0
  129. package/dist/subscriptions/stream.js.map +1 -0
  130. package/dist/version.d.ts +3 -0
  131. package/dist/version.d.ts.map +1 -0
  132. package/dist/version.js +25 -0
  133. package/dist/version.js.map +1 -0
  134. package/dist/webhookSignature.d.ts +64 -0
  135. package/dist/webhookSignature.d.ts.map +1 -0
  136. package/dist/webhookSignature.js +91 -0
  137. package/dist/webhookSignature.js.map +1 -0
  138. package/llms.txt +39 -2
  139. package/package.json +17 -14
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentReport.js","sourceRoot":"","sources":["../src/agentReport.ts"],"names":[],"mappings":"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"}
package/dist/app.d.ts CHANGED
@@ -2,6 +2,7 @@ import { type FastifyInstance } from "fastify";
2
2
  import type { CollectorConfig } from "./config.js";
3
3
  import type { CollectorStore } from "./store.js";
4
4
  import { type LiveBus } from "./liveBus.js";
5
+ import { type ProjectMetadataProvider } from "./projectMetadata.js";
5
6
  export interface BuildAppDeps {
6
7
  store: CollectorStore;
7
8
  config: CollectorConfig;
@@ -10,8 +11,20 @@ export interface BuildAppDeps {
10
11
  * in-process bus is created from `config.liveWindowMs` when omitted.
11
12
  */
12
13
  liveBus?: LiveBus;
14
+ /**
15
+ * Outbound HTTP for subscription webhooks (#311). Injectable so a test can
16
+ * assert the signed body without a real socket; defaults to global `fetch`.
17
+ */
18
+ fetchImpl?: typeof fetch;
13
19
  /** Pass `true` (or Fastify logger options) to enable request logging. */
14
20
  logger?: boolean;
21
+ /**
22
+ * Source of the glossary and recent annotations the project context document
23
+ * reports (ADR 0051 §5). Defaults to reading them from `store` through the
24
+ * metadata write path of #310 — see `projectMetadata.ts`. Injectable so a
25
+ * test can supply its own without a store.
26
+ */
27
+ projectMetadata?: ProjectMetadataProvider;
15
28
  }
16
29
  /**
17
30
  * Build the collector Fastify instance. Pure factory — takes its dependencies so
package/dist/app.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAIA,OAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAMxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AAS3D,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,cAAc,CAAC;IACtB,MAAM,EAAE,eAAe,CAAC;IACxB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yEAAyE;IACzE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AA0BD;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CAuG3E"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAIA,OAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAMxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AAE3D,OAAO,EAAwB,KAAK,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAoB1F,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,cAAc,CAAC;IACtB,MAAM,EAAE,eAAe,CAAC;IACxB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,yEAAyE;IACzE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;;OAKG;IACH,eAAe,CAAC,EAAE,uBAAuB,CAAC;CAC3C;AA0BD;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CAoM3E"}
package/dist/app.js CHANGED
@@ -5,13 +5,26 @@ import fastifyStatic from "@fastify/static";
5
5
  import Fastify, {} from "fastify";
6
6
  import { serializerCompiler, validatorCompiler, } from "fastify-type-provider-zod";
7
7
  import { createLiveBus } from "./liveBus.js";
8
- import { attachApiKey } from "./auth.js";
8
+ import { attachApiKey, normalizeMcpBearer } from "./auth.js";
9
+ import { storeProjectMetadata } from "./projectMetadata.js";
9
10
  import { registerAuditHooks, startAuditRetention } from "./audit.js";
10
11
  import { buildDashboardCsp } from "./csp.js";
12
+ import { isInternalDispatch, newInternalDispatchToken } from "./internalDispatch.js";
11
13
  import { collectRoutes } from "./routes/collect.js";
14
+ import { contextRoutes } from "./routes/context.js";
15
+ import { insightRoutes } from "./routes/insights.js";
12
16
  import { liveRoutes } from "./routes/live.js";
17
+ import { mcpRoutes } from "./routes/mcp.js";
13
18
  import { collectRouteSchemas, metaRoutes } from "./routes/meta.js";
19
+ import { metadataRoutes } from "./routes/metadata.js";
20
+ import { panelRoutes } from "./routes/panels.js";
21
+ import { narrativeRoutes } from "./routes/narrative.js";
14
22
  import { queryRoutes } from "./routes/query.js";
23
+ import { queryDslRoutes } from "./routes/query-dsl.js";
24
+ import { subscriptionRoutes } from "./routes/subscriptions.js";
25
+ import { createSubscriptionScheduler } from "./subscriptions/scheduler.js";
26
+ import { createSubscriptionStream } from "./subscriptions/stream.js";
27
+ import { createConnectionLimiter } from "./connectionLimiter.js";
15
28
  /**
16
29
  * Strip the live-SSE `?token=` from a logged URL. The token is a short-lived
17
30
  * bearer credential; it must never land in access logs (or proxy logs).
@@ -60,13 +73,26 @@ export async function buildApp(deps) {
60
73
  const contentSecurityPolicy = config.dashboardDir && config.cspMode === "strict"
61
74
  ? buildDashboardCsp(config.dashboardDir, config.corsOrigins)
62
75
  : false;
76
+ // Per-process marker for the reads the hosted MCP transport dispatches to this
77
+ // same app (#313). Minted only when that transport is on; see
78
+ // `internalDispatch.ts` for why it exists and why it must be unguessable.
79
+ const internalDispatchToken = config.mcpHttpEnabled ? newInternalDispatchToken() : undefined;
63
80
  await app.register(helmet, config.dashboardDir ? { contentSecurityPolicy } : {});
64
81
  await app.register(cors, {
65
82
  origin: config.corsOrigins.length > 0 ? config.corsOrigins : false,
66
83
  // @fastify/cors defaults `methods` to GET,HEAD,POST — which omits PUT and so
67
84
  // breaks the browser preflight for scene-proxy registration
68
- // (PUT /api/v1/scenes/:id/representation). List the verbs the HTTP API uses.
69
- methods: ["GET", "HEAD", "POST", "PUT"],
85
+ // (PUT /api/v1/scenes/:id/representation). DELETE is needed for the metadata
86
+ // write path (#310: removing an annotation, a term, a saved analysis) and for
87
+ // ending an MCP session over `/mcp` (#313). List the verbs the HTTP API uses.
88
+ methods: ["GET", "HEAD", "POST", "PUT", "DELETE"],
89
+ // Streamable HTTP returns the session id in a response header the client has
90
+ // to echo back; a browser cannot read it unless it is explicitly exposed.
91
+ ...(config.mcpHttpEnabled ? { exposedHeaders: ["Mcp-Session-Id"] } : {}),
92
+ // `allowedHeaders` is deliberately left unset: the plugin then reflects the
93
+ // browser's `Access-Control-Request-Headers`, which already covers the MCP
94
+ // request headers (`Mcp-Session-Id`, `Mcp-Protocol-Version`, `Last-Event-ID`)
95
+ // without narrowing what every other client may send today.
70
96
  // The SDK ingests via `navigator.sendBeacon`, which always sends in
71
97
  // credentials mode `include`. With a non-safelisted `application/json` body
72
98
  // that triggers a credentialed CORS preflight, so the response must echo
@@ -84,7 +110,12 @@ export async function buildApp(deps) {
84
110
  // rate-limit plugin installs, so registration order here is load-bearing.
85
111
  app.decorateRequest("resolvedKey", null);
86
112
  app.decorateRequest("auditRowCount", null);
113
+ app.decorateRequest("auditParams", null);
87
114
  app.addHook("onRequest", async (request) => {
115
+ // MCP clients send `Authorization: Bearer <key>`; fold it into `x-api-key`
116
+ // first so there is still one key-resolution path (#313).
117
+ if (config.mcpHttpEnabled)
118
+ normalizeMcpBearer(request);
88
119
  await attachApiKey(request, store);
89
120
  });
90
121
  await app.register(rateLimit, {
@@ -96,10 +127,15 @@ export async function buildApp(deps) {
96
127
  // `normalizeIP` is exactly what the plugin's own default key generator uses,
97
128
  // so requests without a per-key budget keep their existing IPv6-aware bucket.
98
129
  keyGenerator: (request) => request.resolvedKey?.rateLimit ? `key:${request.resolvedKey.keyId}` : normalizeIP(request.ip),
130
+ // A read the collector dispatched to itself for an MCP tool call is already
131
+ // paid for: the `POST /mcp` that carried the call went through this same
132
+ // limiter on the caller's bucket. Charging the inner read again would halve
133
+ // every key's effective allowance over the hosted transport.
134
+ allowList: (request) => isInternalDispatch(request, internalDispatchToken),
99
135
  });
100
136
  // Audit every authenticated, non-dashboard request (ADR 0051 §7). Registered
101
137
  // after the rate limiter so a throttled request is still recorded.
102
- registerAuditHooks(app, store, config);
138
+ registerAuditHooks(app, store, config, internalDispatchToken);
103
139
  const stopAuditRetention = startAuditRetention(app, store, config);
104
140
  app.addHook("onClose", async () => stopAuditRetention());
105
141
  // Record every route's Zod schemas as they are registered, so the generated
@@ -110,8 +146,79 @@ export async function buildApp(deps) {
110
146
  const routeSchemas = collectRouteSchemas(app);
111
147
  app.get("/health", async () => ({ status: "ok" }));
112
148
  await app.register(collectRoutes, { store, config, liveBus });
113
- await app.register(liveRoutes, { store, config, liveBus });
149
+ // One SSE budget for the whole collector: the live endpoints and the
150
+ // conditional-subscription stream hold the same kind of socket, so
151
+ // `LIVE_MAX_CONNECTIONS` bounds their total rather than each of them.
152
+ const sseConnections = createConnectionLimiter(config.liveMaxConnections);
153
+ await app.register(liveRoutes, { store, config, liveBus, connections: sseConnections });
114
154
  await app.register(queryRoutes, { store, config });
155
+ // The query DSL (ADR 0051 §3): one route that can run any registry metric.
156
+ await app.register(queryDslRoutes, { store });
157
+ // The metadata write path (#310) is its own plugin so the read API above stays
158
+ // exactly what it is — aggregate and read-only — and so the `annotate`-gated
159
+ // surface is one file to inspect.
160
+ await app.register(metadataRoutes, { store });
161
+ // Declarative panel specs (#315) — the same `annotate`-gated surface, kept
162
+ // in its own plugin so what the dashboard can be asked to *render* is one
163
+ // file to inspect.
164
+ await app.register(panelRoutes, { store });
165
+ // Collector-hosted MCP over Streamable HTTP (ADR 0051 §7). Opt-in: without
166
+ // `COLLECTOR_MCP_HTTP` the route does not exist.
167
+ if (config.mcpHttpEnabled && internalDispatchToken != null) {
168
+ await app.register(mcpRoutes, { store, config, internalDispatchToken });
169
+ }
170
+ // Session narrative (#314): its own plugin so it does not inherit the query
171
+ // plugin's `format` hook, which knows only the three shared envelopes.
172
+ await app.register(narrativeRoutes, { store, config });
173
+ // The project context document (#308). Its glossary and recent annotations
174
+ // come from the metadata write path (#310) through the narrow provider seam,
175
+ // which now has a real default reading the store.
176
+ await app.register(contextRoutes, {
177
+ store,
178
+ config,
179
+ metadata: deps.projectMetadata ?? storeProjectMetadata(store),
180
+ });
181
+ // Derived reads over the query surface (ADR 0051 §4): `baseline` and `movers`.
182
+ // Its own plugin so the envelope hook and the metric-resolution 400s stay
183
+ // scoped to the two insight routes.
184
+ await app.register(insightRoutes, { store });
185
+ // Conditional subscriptions (ADR 0051 §6): the CRUD resource, the firing log
186
+ // and the SSE stream. The scheduler behind them is created unconditionally —
187
+ // the routes need it for `POST …/test` even when evaluation is off — but only
188
+ // `reload()` installs timers, and that is gated on `COLLECTOR_SUBSCRIPTIONS`.
189
+ const subscriptionStream = createSubscriptionStream();
190
+ const scheduler = createSubscriptionScheduler({
191
+ store,
192
+ config,
193
+ liveBus,
194
+ stream: subscriptionStream,
195
+ log: app.log,
196
+ fetchImpl: deps.fetchImpl,
197
+ });
198
+ await app.register(subscriptionRoutes, {
199
+ store,
200
+ config,
201
+ scheduler,
202
+ stream: subscriptionStream,
203
+ connections: sseConnections,
204
+ });
205
+ app.addHook("onClose", async () => {
206
+ scheduler.stop();
207
+ subscriptionStream.stop();
208
+ });
209
+ if (config.subscriptions) {
210
+ // After `ready()`, so a store that is still migrating on boot is not read
211
+ // mid-migration; a failure only logs, because an unreadable subscription
212
+ // table must not stop the collector serving.
213
+ app.addHook("onReady", async () => {
214
+ try {
215
+ await scheduler.reload();
216
+ }
217
+ catch (err) {
218
+ app.log.warn({ err }, "failed to start the subscription scheduler");
219
+ }
220
+ });
221
+ }
115
222
  await app.register(metaRoutes, { routeSchemas });
116
223
  // All-in-one: serve a pre-built static dashboard from `dashboardDir`. The API
117
224
  // routes above (`/health`, `/api/v1/*`) are matched first; everything else
package/dist/app.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,eAAe,CAAC;AACjC,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAO,SAAS,EAAE,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,OAAO,OAAO,EAAE,EAAwB,MAAM,SAAS,CAAC;AACxD,OAAO,EACL,kBAAkB,EAClB,iBAAiB,GAElB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAAE,aAAa,EAAgB,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAchD;;;GAGG;AACH,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,cAAc,CAAC,CAAC;AAC5D,CAAC;AAED;;;;GAIG;AACH,SAAS,aAAa,CAAC,MAA2B;IAChD,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,MAAM,IAAI,KAAK,CAAC;IAC5C,OAAO;QACL,WAAW,EAAE;YACX,GAAG,CAAC,OAAwC;gBAC1C,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACnE,CAAC;SACF;KACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAkB;IAC/C,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,aAAa,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;IACjF,MAAM,GAAG,GAAG,OAAO,CAAC;QAClB,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;QAClC,6EAA6E;QAC7E,sEAAsE;QACtE,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,kEAAkE;QAClE,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC,CAAC,gBAAgB,EAAmB,CAAC;IAEvC,GAAG,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;IAC5C,GAAG,CAAC,qBAAqB,CAAC,kBAAkB,CAAC,CAAC;IAE9C,6EAA6E;IAC7E,4EAA4E;IAC5E,8EAA8E;IAC9E,+EAA+E;IAC/E,MAAM,qBAAqB,GACzB,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,OAAO,KAAK,QAAQ;QAChD,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,WAAW,CAAC;QAC5D,CAAC,CAAC,KAAK,CAAC;IACZ,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACjF,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE;QACvB,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK;QAClE,6EAA6E;QAC7E,4DAA4D;QAC5D,6EAA6E;QAC7E,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC;QACvC,oEAAoE;QACpE,4EAA4E;QAC5E,yEAAyE;QACzE,6EAA6E;QAC7E,wEAAwE;QACxE,6EAA6E;QAC7E,yEAAyE;QACzE,kDAAkD;QAClD,WAAW,EAAE,IAAI;KAClB,CAAC,CAAC;IACH,4EAA4E;IAC5E,4EAA4E;IAC5E,4EAA4E;IAC5E,uEAAuE;IACvE,0EAA0E;IAC1E,GAAG,CAAC,eAAe,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,eAAe,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;IAC3C,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACzC,MAAM,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,MAAM,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE;QAC5B,sEAAsE;QACtE,uEAAuE;QACvE,yDAAyD;QACzD,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,SAAS,EAAE,GAAG,IAAI,MAAM,CAAC,YAAY;QAC5E,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,IAAI,MAAM,CAAC,iBAAiB;QAC7F,6EAA6E;QAC7E,8EAA8E;QAC9E,YAAY,EAAE,CAAC,OAAO,EAAE,EAAE,CACxB,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;KAChG,CAAC,CAAC;IAEH,6EAA6E;IAC7E,mEAAmE;IACnE,kBAAkB,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACvC,MAAM,kBAAkB,GAAG,mBAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACnE,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAEzD,4EAA4E;IAC5E,wEAAwE;IACxE,6EAA6E;IAC7E,6EAA6E;IAC7E,0EAA0E;IAC1E,MAAM,YAAY,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAE9C,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAEnD,MAAM,GAAG,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9D,MAAM,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3D,MAAM,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACnD,MAAM,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;IAEjD,8EAA8E;IAC9E,2EAA2E;IAC3E,6EAA6E;IAC7E,4EAA4E;IAC5E,uBAAuB;IACvB,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACxB,MAAM,GAAG,CAAC,QAAQ,CAAC,aAAa,EAAE;YAChC,IAAI,EAAE,MAAM,CAAC,YAAY;YACzB,MAAM,EAAE,GAAG;YACX,QAAQ,EAAE,KAAK;SAChB,CAAC,CAAC;QACH,GAAG,CAAC,kBAAkB,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YACpC,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;gBACrF,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YACxD,CAAC;YACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
package/dist/audit.d.ts CHANGED
@@ -7,8 +7,12 @@ import type { CollectorStore } from "./store.js";
7
7
  * - `preSerialization` captures the row count when a handler returned an array
8
8
  * (streamed/hijacked responses simply have none);
9
9
  * - `onResponse` writes the row for authenticated, non-dashboard requests.
10
+ *
11
+ * `internalDispatchToken` is the per-process token the hosted MCP transport
12
+ * marks its own in-process reads with; when supplied, those rows are tagged
13
+ * `mcp-http`. It is `undefined` unless `COLLECTOR_MCP_HTTP` is on.
10
14
  */
11
- export declare function registerAuditHooks(app: FastifyInstance, store: CollectorStore, config: CollectorConfig): void;
15
+ export declare function registerAuditHooks(app: FastifyInstance, store: CollectorStore, config: CollectorConfig, internalDispatchToken?: string): void;
12
16
  /**
13
17
  * Start the retention sweep: delete audit rows older than
14
18
  * `config.auditRetentionDays` now, then every {@link PRUNE_INTERVAL_MS}. The
@@ -1 +1 @@
1
- {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAwBjD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,eAAe,EACpB,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,eAAe,GACtB,IAAI,CAoCN;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,eAAe,EACpB,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,eAAe,GACtB,MAAM,IAAI,CAkBZ"}
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAkCjD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,eAAe,EACpB,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,eAAe,EACvB,qBAAqB,CAAC,EAAE,MAAM,GAC7B,IAAI,CAyCN;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,eAAe,EACpB,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,eAAe,GACtB,MAAM,IAAI,CAkBZ"}
package/dist/audit.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { serializeAuditParams } from "@uptimizr/db";
2
- import { isDashboardRequest } from "./auth.js";
2
+ import { isDashboardRequest, MCP_ROUTE_URL } from "./auth.js";
3
+ import { isInternalDispatch } from "./internalDispatch.js";
3
4
  /**
4
5
  * Agent audit log plumbing (#309, ADR 0051 §7).
5
6
  *
@@ -7,6 +8,15 @@ import { isDashboardRequest } from "./auth.js";
7
8
  * session is recorded: which key, which endpoint, the (bounded, redacted)
8
9
  * parameters, the row count, the duration and the status.
9
10
  *
11
+ * A request the collector dispatched to itself for an MCP session (#313) is the
12
+ * same row with `surface: "mcp-http"` — it *is* the tool call, so recording it
13
+ * where every other read is recorded keeps one log rather than two. The
14
+ * successful `/mcp` envelope requests around it are **not** recorded: a JSON-RPC
15
+ * envelope names no endpoint and carries no parameters, so a row per protocol
16
+ * message would be pure noise next to the tool call it already produced. A
17
+ * *refused* `/mcp` request still is — a key turned away at the MCP door is
18
+ * exactly what a project owner wants to see.
19
+ *
10
20
  * Two invariants hold everywhere in here:
11
21
  *
12
22
  * - **It never blocks the response.** The row is written from an `onResponse`
@@ -24,8 +34,12 @@ const MS_PER_DAY = 24 * 60 * 60 * 1000;
24
34
  * - `preSerialization` captures the row count when a handler returned an array
25
35
  * (streamed/hijacked responses simply have none);
26
36
  * - `onResponse` writes the row for authenticated, non-dashboard requests.
37
+ *
38
+ * `internalDispatchToken` is the per-process token the hosted MCP transport
39
+ * marks its own in-process reads with; when supplied, those rows are tagged
40
+ * `mcp-http`. It is `undefined` unless `COLLECTOR_MCP_HTTP` is on.
27
41
  */
28
- export function registerAuditHooks(app, store, config) {
42
+ export function registerAuditHooks(app, store, config, internalDispatchToken) {
29
43
  app.addHook("preSerialization", async (request, _reply, payload) => {
30
44
  if (Array.isArray(payload))
31
45
  request.auditRowCount = payload.length;
@@ -37,6 +51,10 @@ export function registerAuditHooks(app, store, config) {
37
51
  return;
38
52
  if (!config.auditDashboardRequests && isDashboardRequest(request))
39
53
  return;
54
+ // A successful MCP protocol message is not an endpoint read; its tool call
55
+ // is already recorded as `mcp-http`. Refusals are kept (see above).
56
+ if (request.routeOptions.url === MCP_ROUTE_URL && reply.statusCode < 400)
57
+ return;
40
58
  // `reply.elapsedTime` is the ms between the request arriving and the
41
59
  // response being sent — exactly the duration the audit log wants.
42
60
  const durationMs = Math.round(reply.elapsedTime);
@@ -45,11 +63,13 @@ export function registerAuditHooks(app, store, config) {
45
63
  .recordAudit({
46
64
  projectId: resolved.projectId,
47
65
  keyId: resolved.keyId,
48
- surface: "http",
66
+ surface: isInternalDispatch(request, internalDispatchToken) ? "mcp-http" : "http",
49
67
  // The route pattern (`/api/v1/sessions/:id/events`), not the raw URL:
50
68
  // it groups cleanly and cannot carry a querystring credential.
51
69
  toolOrPath: request.routeOptions.url ?? new URL(request.url, "http://x").pathname,
52
- params: serializeAuditParams(request.query),
70
+ // A route that carries its request in the body (the query DSL) records
71
+ // it explicitly; everything else is described by its querystring.
72
+ params: serializeAuditParams(request.auditParams ?? request.query),
53
73
  rowCount: request.auditRowCount,
54
74
  durationMs,
55
75
  status: reply.statusCode,
package/dist/audit.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGpD,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,+EAA+E;AAC/E,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE7C,MAAM,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEvC;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB,CAChC,GAAoB,EACpB,KAAqB,EACrB,MAAuB,EACvB,qBAA8B;IAE9B,GAAG,CAAC,OAAO,CAAC,kBAAkB,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;QACjE,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,OAAO,CAAC,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;QACnE,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC;QACrC,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,IAAI,CAAC,MAAM,CAAC,sBAAsB,IAAI,kBAAkB,CAAC,OAAO,CAAC;YAAE,OAAO;QAC1E,2EAA2E;QAC3E,oEAAoE;QACpE,IAAI,OAAO,CAAC,YAAY,CAAC,GAAG,KAAK,aAAa,IAAI,KAAK,CAAC,UAAU,GAAG,GAAG;YAAE,OAAO;QACjF,qEAAqE;QACrE,kEAAkE;QAClE,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACjD,IAAI,CAAC;YACH,KAAK,KAAK;iBACP,WAAW,CAAC;gBACX,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,OAAO,EAAE,kBAAkB,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM;gBACjF,sEAAsE;gBACtE,+DAA+D;gBAC/D,UAAU,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,QAAQ;gBACjF,uEAAuE;gBACvE,kEAAkE;gBAClE,MAAM,EAAE,oBAAoB,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,KAAK,CAAC;gBAClE,QAAQ,EAAE,OAAO,CAAC,aAAa;gBAC/B,UAAU;gBACV,MAAM,EAAE,KAAK,CAAC,UAAU;aACzB,CAAC;iBACD,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;gBACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,iCAAiC,CAAC,CAAC;YAC/D,CAAC,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,yEAAyE;YACzE,oEAAoE;YACpE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,iCAAiC,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CACjC,GAAoB,EACpB,KAAqB,EACrB,MAAuB;IAEvB,IAAI,MAAM,CAAC,kBAAkB,IAAI,CAAC;QAAE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IAEpD,MAAM,KAAK,GAAG,GAAS,EAAE;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,kBAAkB,GAAG,UAAU,CAAC;QACnE,IAAI,CAAC;YACH,KAAK,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;gBACnD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,oCAAoC,CAAC,CAAC;YAC9D,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,oCAAoC,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,EAAE,CAAC;IACR,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;IACpD,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IAChB,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;AACpC,CAAC"}
package/dist/auth.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { FastifyReply, FastifyRequest } from "fastify";
2
- import type { ApiKeyCapability, ResolvedApiKey } from "@uptimizr/db";
2
+ import type { ApiKeyCapability, MetadataAuthorKind, ResolvedApiKey } from "@uptimizr/db";
3
3
  import type { CollectorStore } from "./store.js";
4
4
  /**
5
5
  * Request-boundary authentication and capability checks for the collector
@@ -28,6 +28,13 @@ declare module "fastify" {
28
28
  resolvedKey: ResolvedApiKey | null;
29
29
  /** Rows in the response body, when it serialized to an array (audit log). */
30
30
  auditRowCount: number | null;
31
+ /**
32
+ * What the audit log should record as this request's parameters, when the
33
+ * querystring is not the whole story. `POST /api/v1/query` carries its
34
+ * query in the body (ADR 0051 §3), so without this the audit trail would
35
+ * show a bare path and nothing about what was asked for.
36
+ */
37
+ auditParams: unknown;
31
38
  }
32
39
  }
33
40
  /** Header a first-party UI sets to identify itself (see `isDashboardRequest`). */
@@ -47,6 +54,39 @@ export declare const CLIENT_HEADER = "x-uptimizr-client";
47
54
  * authenticated request without exception.
48
55
  */
49
56
  export declare function isDashboardRequest(request: FastifyRequest): boolean;
57
+ /** The route the bearer-header alias below is accepted on, and only that one. */
58
+ export declare const MCP_ROUTE_URL = "/mcp";
59
+ /**
60
+ * Accept `Authorization: Bearer <key>` as an alias for `x-api-key` **on the
61
+ * hosted MCP route only** (ADR 0051 §7, design sketch §G.1).
62
+ *
63
+ * MCP clients configure a remote server as a URL plus headers and send the
64
+ * bearer form the MCP specification describes; the rest of the collector has
65
+ * always used `x-api-key`. Normalising one into the other here — in the same
66
+ * `onRequest` hook, *before* {@link attachApiKey} — keeps exactly one
67
+ * key-resolution path, so the capability check, the audit row and the per-key
68
+ * rate-limit bucket all work for a bearer-authenticated MCP client too.
69
+ *
70
+ * Scoped to `/mcp` on purpose: this is an alias for one route, not a new
71
+ * site-wide authentication scheme. An explicit `x-api-key` always wins, and a
72
+ * malformed or empty bearer value is ignored rather than rejected, so the usual
73
+ * "no key → 401" path handles it.
74
+ */
75
+ export declare function normalizeMcpBearer(request: FastifyRequest): void;
76
+ /**
77
+ * Who a metadata write (#310, ADR 0051 §5) is attributed to.
78
+ *
79
+ * It reuses the surface marker the audit log already distinguishes on rather
80
+ * than inventing a second notion of "who": the dashboard's own session is a
81
+ * **person** clicking in a UI, and everything else holding an `annotate` key —
82
+ * an MCP client, the in-browser assistant writing up its own answer, a
83
+ * scheduled report — is an **agent**.
84
+ *
85
+ * It is derived from the request, never read from the payload, so a stored row
86
+ * cannot claim an authorship its writer did not send. Like the audit filter it
87
+ * is an honest label, not a security boundary.
88
+ */
89
+ export declare function metadataAuthorKind(request: FastifyRequest): MetadataAuthorKind;
50
90
  /**
51
91
  * Resolve the request's `x-api-key` into {@link FastifyRequest.resolvedKey}.
52
92
  * Never replies and never throws: an absent, unknown or revoked key simply
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,cAAc;QACtB;;;;;WAKG;QACH,WAAW,EAAE,cAAc,GAAG,IAAI,CAAC;QACnC,6EAA6E;QAC7E,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;KAC9B;CACF;AAED,kFAAkF;AAClF,eAAO,MAAM,aAAa,sBAAsB,CAAC;AAEjD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAEnE;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAQhG;AAUD;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE,cAAc,EACrB,UAAU,EAAE,gBAAgB,GAC3B,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAmBhC"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACzF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,cAAc;QACtB;;;;;WAKG;QACH,WAAW,EAAE,cAAc,GAAG,IAAI,CAAC;QACnC,6EAA6E;QAC7E,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B;;;;;WAKG;QACH,WAAW,EAAE,OAAO,CAAC;KACtB;CACF;AAED,kFAAkF;AAClF,eAAO,MAAM,aAAa,sBAAsB,CAAC;AAEjD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAEnE;AAED,iFAAiF;AACjF,eAAO,MAAM,aAAa,SAAS,CAAC;AAEpC;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAQhE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,GAAG,kBAAkB,CAE9E;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAQhG;AAUD;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE,cAAc,EACrB,UAAU,EAAE,gBAAgB,GAC3B,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAmBhC"}
package/dist/auth.js CHANGED
@@ -17,6 +17,53 @@ export const CLIENT_HEADER = "x-uptimizr-client";
17
17
  export function isDashboardRequest(request) {
18
18
  return request.headers[CLIENT_HEADER] === "dashboard";
19
19
  }
20
+ /** The route the bearer-header alias below is accepted on, and only that one. */
21
+ export const MCP_ROUTE_URL = "/mcp";
22
+ /**
23
+ * Accept `Authorization: Bearer <key>` as an alias for `x-api-key` **on the
24
+ * hosted MCP route only** (ADR 0051 §7, design sketch §G.1).
25
+ *
26
+ * MCP clients configure a remote server as a URL plus headers and send the
27
+ * bearer form the MCP specification describes; the rest of the collector has
28
+ * always used `x-api-key`. Normalising one into the other here — in the same
29
+ * `onRequest` hook, *before* {@link attachApiKey} — keeps exactly one
30
+ * key-resolution path, so the capability check, the audit row and the per-key
31
+ * rate-limit bucket all work for a bearer-authenticated MCP client too.
32
+ *
33
+ * Scoped to `/mcp` on purpose: this is an alias for one route, not a new
34
+ * site-wide authentication scheme. An explicit `x-api-key` always wins, and a
35
+ * malformed or empty bearer value is ignored rather than rejected, so the usual
36
+ * "no key → 401" path handles it.
37
+ */
38
+ export function normalizeMcpBearer(request) {
39
+ if (request.routeOptions.url !== MCP_ROUTE_URL)
40
+ return;
41
+ const existing = request.headers["x-api-key"];
42
+ if (typeof existing === "string" && existing.length > 0)
43
+ return;
44
+ const authorization = request.headers.authorization;
45
+ if (typeof authorization !== "string")
46
+ return;
47
+ const match = /^Bearer[ \t]+(\S+)$/i.exec(authorization.trim());
48
+ if (match)
49
+ request.headers["x-api-key"] = match[1];
50
+ }
51
+ /**
52
+ * Who a metadata write (#310, ADR 0051 §5) is attributed to.
53
+ *
54
+ * It reuses the surface marker the audit log already distinguishes on rather
55
+ * than inventing a second notion of "who": the dashboard's own session is a
56
+ * **person** clicking in a UI, and everything else holding an `annotate` key —
57
+ * an MCP client, the in-browser assistant writing up its own answer, a
58
+ * scheduled report — is an **agent**.
59
+ *
60
+ * It is derived from the request, never read from the payload, so a stored row
61
+ * cannot claim an authorship its writer did not send. Like the audit filter it
62
+ * is an honest label, not a security boundary.
63
+ */
64
+ export function metadataAuthorKind(request) {
65
+ return isDashboardRequest(request) ? "user" : "agent";
66
+ }
20
67
  /**
21
68
  * Resolve the request's `x-api-key` into {@link FastifyRequest.resolvedKey}.
22
69
  * Never replies and never throws: an absent, unknown or revoked key simply
package/dist/auth.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAmCA,kFAAkF;AAClF,MAAM,CAAC,MAAM,aAAa,GAAG,mBAAmB,CAAC;AAEjD;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAuB;IACxD,OAAO,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,WAAW,CAAC;AACxD,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAuB,EAAE,KAAqB;IAC/E,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAC9D,IAAI,CAAC;QACH,OAAO,CAAC,WAAW,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,2BAA2B,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED,qEAAqE;AACrE,MAAM,mBAAmB,GAAqC;IAC5D,KAAK,EAAE,+BAA+B;IACtC,WAAW,EAAE,gDAAgD;IAC7D,QAAQ,EAAE,yCAAyC;IACnD,MAAM,EAAE,iCAAiC;CAC1C,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAuB,EACvB,KAAmB,EACnB,KAAqB,EACrB,UAA4B;IAE5B,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtD,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,0EAA0E;IAC1E,6EAA6E;IAC7E,IAAI,CAAC,OAAO,CAAC,WAAW;QAAE,MAAM,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC;IACrC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAChD,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}