@uptimizr/collector-server 2.1.0 → 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 (135) hide show
  1. package/AGENTS.md +179 -6
  2. package/README.md +69 -0
  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 +99 -2
  28. package/dist/cli.js.map +1 -1
  29. package/dist/clickhouseStore.d.ts.map +1 -1
  30. package/dist/clickhouseStore.js +44 -2
  31. package/dist/clickhouseStore.js.map +1 -1
  32. package/dist/config.d.ts +49 -0
  33. package/dist/config.d.ts.map +1 -1
  34. package/dist/config.js +21 -0
  35. package/dist/config.js.map +1 -1
  36. package/dist/connectionLimiter.d.ts +23 -0
  37. package/dist/connectionLimiter.d.ts.map +1 -0
  38. package/dist/connectionLimiter.js +24 -0
  39. package/dist/connectionLimiter.js.map +1 -0
  40. package/dist/duckdbStore.d.ts.map +1 -1
  41. package/dist/duckdbStore.js +44 -1
  42. package/dist/duckdbStore.js.map +1 -1
  43. package/dist/internalDispatch.d.ts +36 -0
  44. package/dist/internalDispatch.d.ts.map +1 -0
  45. package/dist/internalDispatch.js +50 -0
  46. package/dist/internalDispatch.js.map +1 -0
  47. package/dist/memoryStore.d.ts.map +1 -1
  48. package/dist/memoryStore.js +314 -1
  49. package/dist/memoryStore.js.map +1 -1
  50. package/dist/mssqlStore.d.ts.map +1 -1
  51. package/dist/mssqlStore.js +44 -2
  52. package/dist/mssqlStore.js.map +1 -1
  53. package/dist/postgresStore.d.ts.map +1 -1
  54. package/dist/postgresStore.js +44 -2
  55. package/dist/postgresStore.js.map +1 -1
  56. package/dist/projectMetadata.d.ts +82 -0
  57. package/dist/projectMetadata.d.ts.map +1 -0
  58. package/dist/projectMetadata.js +50 -0
  59. package/dist/projectMetadata.js.map +1 -0
  60. package/dist/routes/context.d.ts +135 -0
  61. package/dist/routes/context.d.ts.map +1 -0
  62. package/dist/routes/context.js +306 -0
  63. package/dist/routes/context.js.map +1 -0
  64. package/dist/routes/insights.d.ts +36 -0
  65. package/dist/routes/insights.d.ts.map +1 -0
  66. package/dist/routes/insights.js +810 -0
  67. package/dist/routes/insights.js.map +1 -0
  68. package/dist/routes/live.d.ts +8 -0
  69. package/dist/routes/live.d.ts.map +1 -1
  70. package/dist/routes/live.js +8 -7
  71. package/dist/routes/live.js.map +1 -1
  72. package/dist/routes/mcp.d.ts +36 -0
  73. package/dist/routes/mcp.d.ts.map +1 -0
  74. package/dist/routes/mcp.js +262 -0
  75. package/dist/routes/mcp.js.map +1 -0
  76. package/dist/routes/meta.d.ts +16 -2
  77. package/dist/routes/meta.d.ts.map +1 -1
  78. package/dist/routes/meta.js +699 -10
  79. package/dist/routes/meta.js.map +1 -1
  80. package/dist/routes/metadata.d.ts +31 -0
  81. package/dist/routes/metadata.d.ts.map +1 -0
  82. package/dist/routes/metadata.js +163 -0
  83. package/dist/routes/metadata.js.map +1 -0
  84. package/dist/routes/narrative.d.ts +36 -0
  85. package/dist/routes/narrative.d.ts.map +1 -0
  86. package/dist/routes/narrative.js +95 -0
  87. package/dist/routes/narrative.js.map +1 -0
  88. package/dist/routes/panels.d.ts +44 -0
  89. package/dist/routes/panels.d.ts.map +1 -0
  90. package/dist/routes/panels.js +108 -0
  91. package/dist/routes/panels.js.map +1 -0
  92. package/dist/routes/query-dsl.d.ts +50 -0
  93. package/dist/routes/query-dsl.d.ts.map +1 -0
  94. package/dist/routes/query-dsl.js +359 -0
  95. package/dist/routes/query-dsl.js.map +1 -0
  96. package/dist/routes/query.d.ts +36 -0
  97. package/dist/routes/query.d.ts.map +1 -1
  98. package/dist/routes/query.js +101 -13
  99. package/dist/routes/query.js.map +1 -1
  100. package/dist/routes/subscriptions.d.ts +52 -0
  101. package/dist/routes/subscriptions.d.ts.map +1 -0
  102. package/dist/routes/subscriptions.js +290 -0
  103. package/dist/routes/subscriptions.js.map +1 -0
  104. package/dist/store.d.ts +113 -2
  105. package/dist/store.d.ts.map +1 -1
  106. package/dist/subscriptions/cli.d.ts +36 -0
  107. package/dist/subscriptions/cli.d.ts.map +1 -0
  108. package/dist/subscriptions/cli.js +143 -0
  109. package/dist/subscriptions/cli.js.map +1 -0
  110. package/dist/subscriptions/delivery.d.ts +101 -0
  111. package/dist/subscriptions/delivery.d.ts.map +1 -0
  112. package/dist/subscriptions/delivery.js +165 -0
  113. package/dist/subscriptions/delivery.js.map +1 -0
  114. package/dist/subscriptions/evaluate.d.ts +119 -0
  115. package/dist/subscriptions/evaluate.d.ts.map +1 -0
  116. package/dist/subscriptions/evaluate.js +326 -0
  117. package/dist/subscriptions/evaluate.js.map +1 -0
  118. package/dist/subscriptions/scheduler.d.ts +97 -0
  119. package/dist/subscriptions/scheduler.d.ts.map +1 -0
  120. package/dist/subscriptions/scheduler.js +332 -0
  121. package/dist/subscriptions/scheduler.js.map +1 -0
  122. package/dist/subscriptions/stream.d.ts +40 -0
  123. package/dist/subscriptions/stream.d.ts.map +1 -0
  124. package/dist/subscriptions/stream.js +38 -0
  125. package/dist/subscriptions/stream.js.map +1 -0
  126. package/dist/version.d.ts +3 -0
  127. package/dist/version.d.ts.map +1 -0
  128. package/dist/version.js +25 -0
  129. package/dist/version.js.map +1 -0
  130. package/dist/webhookSignature.d.ts +64 -0
  131. package/dist/webhookSignature.d.ts.map +1 -0
  132. package/dist/webhookSignature.js +91 -0
  133. package/dist/webhookSignature.js.map +1 -0
  134. package/llms.txt +38 -1
  135. package/package.json +17 -14
@@ -1,4 +1,4 @@
1
- import { buildCameraDirectionHeatmap, buildViewCoverageHistogram, buildCameraDistance, buildCameraPositionHeatmap, buildClickGazeRay, buildDeadClicks, buildRageClicks, buildHoverDwell, buildCompileStalls, buildArPlacementTimeToPlace, buildArPlacementAttempts, buildArPlacementSurfaces, buildResourceSummary, buildCapabilityChanges, buildCameraGestures, buildDistinctScenes, buildEventTypeCounts, buildFlowHeatmap, buildFunnel, buildSceneRetention, buildLoadBounceFunnel, buildVariantLeaderboard, buildListSessions, buildNavigationStats, buildBacktrackRatio, buildXrRotationRate, buildXrSourceUsage, buildXrAbandonment, buildXrLocomotionComfort, buildTrackingQuality, buildInteractionsBySource, buildMeshDwell, buildMeshBlindSpots, buildMeshInteractionKinds, buildReachability, buildPerfSummary, buildPerfDistribution, buildFpsHistogram, buildFrameTimePercentiles, buildJankRate, buildPerfChurn, buildPerfByDevice, buildPerfByScene, buildResourcePercentiles, buildStabilityCounts, buildGraphicsDiagnosticCounts, buildErrorHeatmap, buildBoundaryHeatmap, buildBoundaryHeatmapStats, buildBoundaryContacts, buildRenderingTechnology, buildPointerHeatmap, buildMeshUvHeatmap, buildSceneCoverage, buildPerfHeatmap, buildSessionTrajectory, buildAggregateTrajectories, buildRenderScaleTruth, buildTimeseries, buildTopMeshes, buildTopMeshesBySource, buildTopMeshesTrend, buildTopInputActions, buildWorldHeatmap, buildWorldHeatmapStats, buildGazeHeatmap, buildGazeHeatmapStats, createDuckdbClient, duckdbDialect, duckdbGetSceneRegions, duckdbGetSceneRepresentation, duckdbGetSessionEvents, duckdbGetSessionMeta, duckdbGetProject, duckdbInsertEvents, duckdbListSceneRegions, duckdbListSceneRepresentations, duckdbPutSceneRegions, duckdbResolveApiKey, duckdbRecordAudit, duckdbListAudit, duckdbPruneAudit, duckdbStreamSessionEvents, duckdbUpsertSceneProxy, migrateDuckdb, readDbSettings, runDuckdbQuery, } from "@uptimizr/db";
1
+ import { buildCameraDirectionHeatmap, buildViewCoverageHistogram, buildCameraDistance, buildCameraPositionHeatmap, buildClickGazeRay, buildCustomEventVocabulary, buildDeadClicks, buildRageClicks, buildHoverDwell, buildCompileStalls, buildArPlacementTimeToPlace, buildArPlacementAttempts, buildArPlacementSurfaces, buildResourceSummary, buildCapabilityChanges, buildCameraGestures, buildDistinctScenes, buildEventTypeCounts, buildMetricBuckets, toMetricBucketRows, buildFlowHeatmap, buildFunnel, buildSceneRetention, buildLoadBounceFunnel, buildVariantLeaderboard, buildListSessions, buildNavigationStats, buildBacktrackRatio, buildXrRotationRate, buildXrSourceUsage, buildXrAbandonment, buildXrLocomotionComfort, buildTrackingQuality, buildInteractionsBySource, buildMeshDwell, buildMeshBlindSpots, buildMeshInteractionKinds, buildReachability, buildPerfSummary, buildPerfDistribution, buildFpsHistogram, buildFrameTimePercentiles, buildJankRate, buildPerfChurn, buildPerfByDevice, buildPerfByScene, buildResourcePercentiles, buildStabilityCounts, buildGraphicsDiagnosticCounts, buildErrorHeatmap, buildBoundaryHeatmap, buildBoundaryHeatmapStats, buildBoundaryContacts, buildRenderingTechnology, buildPointerHeatmap, buildMeshUvHeatmap, buildSceneCoverage, buildPerfHeatmap, buildSessionTrajectory, buildAggregateTrajectories, buildRenderScaleTruth, buildTimeseries, buildTopMeshes, buildTopMeshesBySource, buildTopMeshesTrend, buildTopInputActions, foldCustomEventVocabulary, buildWorldHeatmap, buildWorldHeatmapStats, buildGazeHeatmap, buildGazeHeatmapStats, createDuckdbClient, compileMetric, duckdbDialect, duckdbCreateAnnotation, duckdbCreateSavedAnalysis, duckdbDeleteAnnotation, duckdbDeleteGlossaryEntry, duckdbDeleteSavedAnalysis, duckdbCreatePanelSpec, duckdbListPanelSpecs, duckdbUpdatePanelSpec, duckdbDeletePanelSpec, duckdbGetSceneRegions, duckdbGetSceneRepresentation, duckdbGetSessionEvents, duckdbGetSessionMeta, duckdbGetProject, duckdbInsertEvents, duckdbListAnnotations, duckdbListGlossary, duckdbListSavedAnalyses, duckdbListSceneRegions, duckdbListSceneRepresentations, duckdbPutGlossaryEntry, duckdbPutSceneRegions, duckdbListSubscriptions, duckdbListEnabledSubscriptions, duckdbGetSubscription, duckdbCreateSubscription, duckdbSetSubscriptionEnabled, duckdbDeleteSubscription, duckdbRecordSubscriptionOutcome, duckdbGetWebhookSecret, duckdbRecordSubscriptionEvent, duckdbListSubscriptionEvents, duckdbResolveApiKey, duckdbRecordAudit, duckdbListAudit, duckdbPruneAudit, duckdbStreamSessionEvents, duckdbUpsertSceneProxy, migrateDuckdb, readDbSettings, runDuckdbQuery, } from "@uptimizr/db";
2
2
  /**
3
3
  * OSS default store (ADR 0020): a single persisted DuckDB file holding both
4
4
  * events and metadata, with the **full** analytics surface — no stubbed
@@ -15,12 +15,23 @@ export async function createDuckdbStore(path) {
15
15
  const db = await createDuckdbClient(filePath);
16
16
  await migrateDuckdb(db);
17
17
  return {
18
+ engine: "duckdb",
18
19
  resolveApiKey: (key) => duckdbResolveApiKey(db, key),
19
20
  recordAudit: (entry) => duckdbRecordAudit(db, entry),
20
21
  listAudit: (projectId, opts) => duckdbListAudit(db, projectId, opts),
21
22
  pruneAudit: (cutoffMs) => duckdbPruneAudit(db, cutoffMs),
22
23
  projectExists: async (projectId) => (await duckdbGetProject(db, projectId)) !== null,
23
24
  insertEvents: (events) => duckdbInsertEvents(db, [...events]),
25
+ // Query DSL v1 (ADR 0051 §3): any registry metric, compiled onto its own
26
+ // aggregation builder and run through the same DuckDB path — and therefore
27
+ // the same parity coverage and the same numeric coercion — as the canned
28
+ // aggregates below.
29
+ runMetric: (projectId, metric, options) => runDuckdbQuery(db, compileMetric(metric, projectId, options, duckdbDialect)),
30
+ // `explain: true` (#304): the same compilation, not executed.
31
+ describeMetric: (projectId, metric, options) => ({
32
+ dialect: duckdbDialect.name,
33
+ spec: compileMetric(metric, projectId, options, duckdbDialect),
34
+ }),
24
35
  listSessions: (projectId, opts = {}) => runDuckdbQuery(db, buildListSessions(projectId, opts, duckdbDialect)),
25
36
  pointerHeatmap: (projectId, opts = {}) => runDuckdbQuery(db, buildPointerHeatmap(projectId, opts, duckdbDialect)),
26
37
  meshUvHeatmap: (projectId, opts = {}) => runDuckdbQuery(db, buildMeshUvHeatmap(projectId, opts, duckdbDialect)),
@@ -90,9 +101,18 @@ export async function createDuckdbStore(path) {
90
101
  trackingQuality: (projectId, opts = {}) => runDuckdbQuery(db, buildTrackingQuality(projectId, opts, duckdbDialect)),
91
102
  interactionsBySource: (projectId, opts = {}) => runDuckdbQuery(db, buildInteractionsBySource(projectId, opts, duckdbDialect)),
92
103
  topInputActions: (projectId, opts = {}) => runDuckdbQuery(db, buildTopInputActions(projectId, opts, duckdbDialect)),
104
+ // Discovered custom-event vocabulary (ADR 0051 §5): the SQL counts and
105
+ // samples, the pure fold turns the sampled payloads into prop types. The
106
+ // raw payload stops here and never reaches a route.
107
+ customEventVocabulary: async (projectId, opts = {}) => foldCustomEventVocabulary(await runDuckdbQuery(db, buildCustomEventVocabulary(projectId, opts, duckdbDialect))),
93
108
  scenes: (projectId, opts = {}) => runDuckdbQuery(db, buildDistinctScenes(projectId, opts, duckdbDialect)),
94
109
  timeseries: (projectId, opts = {}) => runDuckdbQuery(db, buildTimeseries(projectId, opts, duckdbDialect)),
95
110
  eventTypeCounts: (projectId, opts = {}) => runDuckdbQuery(db, buildEventTypeCounts(projectId, opts, duckdbDialect)),
111
+ // The one bucket series behind `baseline` and `movers` (ADR 0051 §4). The
112
+ // spec carries no registry metric of its own, so the store edge has no row
113
+ // schema to coerce it against — `toMetricBucketRows` parses the numbers,
114
+ // which is what keeps the engines that string-encode 64-bit counts honest.
115
+ metricBuckets: async (projectId, opts) => toMetricBucketRows(await runDuckdbQuery(db, buildMetricBuckets(projectId, opts, duckdbDialect))),
96
116
  funnel: (projectId, opts) => runDuckdbQuery(db, buildFunnel(projectId, opts, duckdbDialect)),
97
117
  sceneRetention: (projectId, opts) => runDuckdbQuery(db, buildSceneRetention(projectId, opts, duckdbDialect)),
98
118
  loadBounceFunnel: (projectId, opts = {}) => runDuckdbQuery(db, buildLoadBounceFunnel(projectId, opts, duckdbDialect)),
@@ -106,6 +126,29 @@ export async function createDuckdbStore(path) {
106
126
  putSceneRegions: (projectId, sceneId, regions) => duckdbPutSceneRegions(db, projectId, sceneId, regions),
107
127
  getSceneRegions: (projectId, sceneId) => duckdbGetSceneRegions(db, projectId, sceneId),
108
128
  listSceneRegions: (projectId) => duckdbListSceneRegions(db, projectId),
129
+ createAnnotation: (projectId, input) => duckdbCreateAnnotation(db, projectId, input),
130
+ listAnnotations: (projectId, opts) => duckdbListAnnotations(db, projectId, opts),
131
+ deleteAnnotation: (projectId, id) => duckdbDeleteAnnotation(db, projectId, id),
132
+ putGlossaryEntry: (projectId, input) => duckdbPutGlossaryEntry(db, projectId, input),
133
+ listGlossary: (projectId, opts) => duckdbListGlossary(db, projectId, opts),
134
+ deleteGlossaryEntry: (projectId, term) => duckdbDeleteGlossaryEntry(db, projectId, term),
135
+ createSavedAnalysis: (projectId, input) => duckdbCreateSavedAnalysis(db, projectId, input),
136
+ listSavedAnalyses: (projectId, opts) => duckdbListSavedAnalyses(db, projectId, opts),
137
+ deleteSavedAnalysis: (projectId, id) => duckdbDeleteSavedAnalysis(db, projectId, id),
138
+ createPanelSpec: (projectId, input) => duckdbCreatePanelSpec(db, projectId, input),
139
+ listPanelSpecs: (projectId, opts) => duckdbListPanelSpecs(db, projectId, opts),
140
+ updatePanelSpec: (projectId, id, input) => duckdbUpdatePanelSpec(db, projectId, id, input),
141
+ deletePanelSpec: (projectId, id) => duckdbDeletePanelSpec(db, projectId, id),
142
+ listSubscriptions: (projectId) => duckdbListSubscriptions(db, projectId),
143
+ listEnabledSubscriptions: (limit) => duckdbListEnabledSubscriptions(db, limit),
144
+ getSubscription: (projectId, id) => duckdbGetSubscription(db, projectId, id),
145
+ createSubscription: (projectId, sub) => duckdbCreateSubscription(db, projectId, sub),
146
+ setSubscriptionEnabled: (projectId, id, enabled) => duckdbSetSubscriptionEnabled(db, projectId, id, enabled),
147
+ deleteSubscription: (projectId, id) => duckdbDeleteSubscription(db, projectId, id),
148
+ recordSubscriptionOutcome: (projectId, id, outcome) => duckdbRecordSubscriptionOutcome(db, projectId, id, outcome),
149
+ getWebhookSecret: (projectId, id) => duckdbGetWebhookSecret(db, projectId, id),
150
+ recordSubscriptionEvent: (entry) => duckdbRecordSubscriptionEvent(db, entry),
151
+ listSubscriptionEvents: (projectId, id, opts) => duckdbListSubscriptionEvents(db, projectId, id, opts),
109
152
  async close() {
110
153
  await db.close();
111
154
  },
@@ -1 +1 @@
1
- {"version":3,"file":"duckdbStore.js","sourceRoot":"","sources":["../src/duckdbStore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"duckdbStore.js","sourceRoot":"","sources":["../src/duckdbStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { FastifyRequest } from "fastify";
2
+ /**
3
+ * In-process dispatch marker for the collector-hosted MCP transport
4
+ * (ADR 0051 §7, design sketch §G.1).
5
+ *
6
+ * `routes/mcp.ts` answers a `tools/call` by **re-entering the collector's own
7
+ * Fastify app** with `app.inject()` rather than opening a loopback socket back
8
+ * to itself. That keeps a tool call on exactly the same code path as the HTTP
9
+ * read it wraps — the capability check, the project scoping, the Zod
10
+ * querystring validation, the result-envelope hook and the audit hook all run
11
+ * once, in one place, so the MCP surface cannot drift from the HTTP one. It
12
+ * also means the collector never has to know its own externally reachable URL,
13
+ * and no request-controlled value is ever turned into a network destination.
14
+ *
15
+ * Two things must still differ for an inner, MCP-originated request:
16
+ *
17
+ * 1. its audit row is the record of a **tool call**, so it is tagged
18
+ * `surface: "mcp-http"` instead of `"http"`; and
19
+ * 2. the outer `POST /mcp` has already spent the caller's rate-limit budget, so
20
+ * charging the inner read again would halve every key's effective allowance.
21
+ *
22
+ * Both hang off this header. Its value is a 256-bit random token minted once
23
+ * per collector process, held only in memory and never sent anywhere: a remote
24
+ * client cannot guess it, so it can neither forge an `mcp-http` audit row nor
25
+ * exempt itself from the rate limiter by sending the header.
26
+ */
27
+ export declare const INTERNAL_DISPATCH_HEADER = "x-uptimizr-internal-dispatch";
28
+ /** Mint the per-process dispatch token. Never logged, never leaves the process. */
29
+ export declare function newInternalDispatchToken(): string;
30
+ /**
31
+ * Whether this request is the collector dispatching to itself on behalf of an
32
+ * MCP session. `false` whenever no token was minted (the hosted transport is
33
+ * off), so the check costs nothing on a default deployment.
34
+ */
35
+ export declare function isInternalDispatch(request: FastifyRequest, token: string | undefined): boolean;
36
+ //# sourceMappingURL=internalDispatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internalDispatch.d.ts","sourceRoot":"","sources":["../src/internalDispatch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,wBAAwB,iCAAiC,CAAC;AAEvE,mFAAmF;AACnF,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAS9F"}
@@ -0,0 +1,50 @@
1
+ import { Buffer } from "node:buffer";
2
+ import { randomBytes, timingSafeEqual } from "node:crypto";
3
+ /**
4
+ * In-process dispatch marker for the collector-hosted MCP transport
5
+ * (ADR 0051 §7, design sketch §G.1).
6
+ *
7
+ * `routes/mcp.ts` answers a `tools/call` by **re-entering the collector's own
8
+ * Fastify app** with `app.inject()` rather than opening a loopback socket back
9
+ * to itself. That keeps a tool call on exactly the same code path as the HTTP
10
+ * read it wraps — the capability check, the project scoping, the Zod
11
+ * querystring validation, the result-envelope hook and the audit hook all run
12
+ * once, in one place, so the MCP surface cannot drift from the HTTP one. It
13
+ * also means the collector never has to know its own externally reachable URL,
14
+ * and no request-controlled value is ever turned into a network destination.
15
+ *
16
+ * Two things must still differ for an inner, MCP-originated request:
17
+ *
18
+ * 1. its audit row is the record of a **tool call**, so it is tagged
19
+ * `surface: "mcp-http"` instead of `"http"`; and
20
+ * 2. the outer `POST /mcp` has already spent the caller's rate-limit budget, so
21
+ * charging the inner read again would halve every key's effective allowance.
22
+ *
23
+ * Both hang off this header. Its value is a 256-bit random token minted once
24
+ * per collector process, held only in memory and never sent anywhere: a remote
25
+ * client cannot guess it, so it can neither forge an `mcp-http` audit row nor
26
+ * exempt itself from the rate limiter by sending the header.
27
+ */
28
+ export const INTERNAL_DISPATCH_HEADER = "x-uptimizr-internal-dispatch";
29
+ /** Mint the per-process dispatch token. Never logged, never leaves the process. */
30
+ export function newInternalDispatchToken() {
31
+ return randomBytes(32).toString("base64url");
32
+ }
33
+ /**
34
+ * Whether this request is the collector dispatching to itself on behalf of an
35
+ * MCP session. `false` whenever no token was minted (the hosted transport is
36
+ * off), so the check costs nothing on a default deployment.
37
+ */
38
+ export function isInternalDispatch(request, token) {
39
+ if (token == null)
40
+ return false;
41
+ const header = request.headers[INTERNAL_DISPATCH_HEADER];
42
+ if (typeof header !== "string")
43
+ return false;
44
+ const supplied = Buffer.from(header, "utf8");
45
+ const expected = Buffer.from(token, "utf8");
46
+ // `timingSafeEqual` throws on a length mismatch, so compare lengths first —
47
+ // the token's length is fixed and public, so leaking it reveals nothing.
48
+ return supplied.length === expected.length && timingSafeEqual(supplied, expected);
49
+ }
50
+ //# sourceMappingURL=internalDispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internalDispatch.js","sourceRoot":"","sources":["../src/internalDispatch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG3D;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,8BAA8B,CAAC;AAEvE,mFAAmF;AACnF,MAAM,UAAU,wBAAwB;IACtC,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC/C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAuB,EAAE,KAAyB;IACnF,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC;IAChC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACzD,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC7C,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC5C,4EAA4E;IAC5E,yEAAyE;IACzE,OAAO,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,IAAI,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACpF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"memoryStore.d.ts","sourceRoot":"","sources":["../src/memoryStore.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,gBAAgB,EAIjB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAgBjD,MAAM,WAAW,kBAAkB;IACjC,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,YAAY,CAAC,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC3C,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,SAAS,EACT,MAAM,EACN,YAAwB,EACxB,KAAoB,GACrB,EAAE,kBAAkB,GAAG,cAAc,CAidrC"}
1
+ {"version":3,"file":"memoryStore.d.ts","sourceRoot":"","sources":["../src/memoryStore.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAIV,gBAAgB,EAUjB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAgBjD,MAAM,WAAW,kBAAkB;IACjC,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,YAAY,CAAC,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC3C,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,SAAS,EACT,MAAM,EACN,YAAwB,EACxB,KAAoB,GACrB,EAAE,kBAAkB,GAAG,cAAc,CAgxBrC"}
@@ -1,4 +1,5 @@
1
1
  import { randomUUID } from "node:crypto";
2
+ import { METADATA_LIMITS, MetadataLimitError, clampMetadataLimit, evaluateBucketMeasure, foldCustomEventVocabulary, toEventRow, MAX_ENABLED_SUBSCRIPTIONS, MAX_SUBSCRIPTIONS_PER_PROJECT, MAX_SUBSCRIPTION_EVENTS, SubscriptionLimitError, clampEventLimit, clampSubscriptionError, rowToSubscription, toSubscriptionColumns, } from "@uptimizr/db";
2
3
  function isSessionStart(event) {
3
4
  return event.type === "session_start";
4
5
  }
@@ -18,6 +19,28 @@ export function createMemoryStore({ projectId, apiKey, capabilities = ["query"],
18
19
  const audit = [];
19
20
  /** Scene regions keyed by scene id; each value is that scene's whole set. */
20
21
  const regions = new Map();
22
+ /** Project metadata (#310): annotations, glossary (keyed by term), analyses. */
23
+ const annotations = [];
24
+ const glossary = new Map();
25
+ const analyses = [];
26
+ /**
27
+ * Pinned panels (#315). An array rather than a `Map` because insertion order
28
+ * *is* the listing order here — the persistent stores order these oldest-first
29
+ * so a pinned panel keeps its place in the grid.
30
+ */
31
+ const panelSpecs = [];
32
+ /**
33
+ * Conditional subscriptions (#311). Kept in insertion order — the persistent
34
+ * stores order by `created_at, id`, and a `Map` preserves exactly that.
35
+ * `secrets` is separate from the records for the same reason the stores keep
36
+ * the secret in its own column: a record handed to a caller can then never
37
+ * carry it, whatever the caller does with it.
38
+ */
39
+ const subscriptions = new Map();
40
+ const secrets = new Map();
41
+ /** Firing log per subscription id, newest last; bounded on write. */
42
+ const firings = new Map();
43
+ let subscriptionSeq = 0;
21
44
  const forSession = (sid) => events
22
45
  .filter((e) => e.projectId === projectId && e.sessionId === sid)
23
46
  .sort((a, b) => a.ts - b.ts);
@@ -27,7 +50,37 @@ export function createMemoryStore({ projectId, apiKey, capabilities = ["query"],
27
50
  return typeof s === "string" && s.length > 0 ? s : "default";
28
51
  };
29
52
  const inRange = (e, opts) => (opts.since == null || e.ts >= opts.since) && (opts.until == null || e.ts < opts.until);
53
+ /**
54
+ * Project a captured event onto the promoted columns an insight bucket
55
+ * measure reads (ADR 0051 §4). `toEventRow` is the same mapping the
56
+ * persistent stores insert through, so the in-memory series is computed from
57
+ * the same columns the SQL series is — the one payload field a measure needs
58
+ * (`ar_placement.scale`) is lifted alongside it.
59
+ */
60
+ const toBucketEvent = (e) => {
61
+ const row = toEventRow(e);
62
+ const scale = e.scale;
63
+ return {
64
+ ts: e.ts,
65
+ event_type: row.event_type,
66
+ scene_id: row.scene_id,
67
+ session_id: row.session_id,
68
+ mesh: row.mesh,
69
+ name: row.name,
70
+ source: row.source,
71
+ fps: row.fps,
72
+ visible_ms: row.visible_ms,
73
+ js_heap_bytes: row.js_heap_bytes,
74
+ long_frames: row.long_frames,
75
+ position: row.position,
76
+ direction: row.direction,
77
+ hit_point: row.hit_point,
78
+ screen: row.screen,
79
+ ...(typeof scale === "number" ? { ar_placement_scale: scale } : {}),
80
+ };
81
+ };
30
82
  return {
83
+ engine: "memory",
31
84
  resolveApiKey: async (key) => key === apiKey
32
85
  ? { projectId, keyId, capabilities: [...capabilities], label: null, rateLimit: null }
33
86
  : null,
@@ -61,6 +114,16 @@ export function createMemoryStore({ projectId, apiKey, capabilities = ["query"],
61
114
  insertEvents: async (incoming) => {
62
115
  events.push(...incoming);
63
116
  },
117
+ // The query DSL (ADR 0051 §3) compiles to SQL, and this store has no SQL
118
+ // engine — it answers a handful of aggregates by walking the array above.
119
+ // Rather than grow a second, JavaScript re-implementation of seventy
120
+ // builders that could silently disagree with the real ones, it reports no
121
+ // rows, exactly as the spatial aggregates below already do. Use the DuckDB
122
+ // store (the OSS default) for the DSL.
123
+ runMetric: async () => [],
124
+ // No SQL is compiled here, so there is no plan to show; `explain` falls back
125
+ // to the registry-derived warnings (#304).
126
+ describeMetric: () => null,
64
127
  listSessions: async () => {
65
128
  const bySession = new Map();
66
129
  for (const e of events) {
@@ -143,6 +206,39 @@ export function createMemoryStore({ projectId, apiKey, capabilities = ["query"],
143
206
  trackingQuality: async () => [],
144
207
  interactionsBySource: async () => [],
145
208
  topInputActions: async () => [],
209
+ // Discovered custom-event vocabulary (ADR 0051 §5). Implemented here (unlike
210
+ // the heavier spatial aggregates) because the playground and the demo run on
211
+ // this store, and an empty vocabulary would make their project context
212
+ // document silently wrong about what the app emits.
213
+ customEventVocabulary: async (_projectId, opts = {}) => {
214
+ const limit = Math.min(opts.limit ?? 100, 200);
215
+ const sampleRows = Math.min(opts.sampleRows ?? 20, 100);
216
+ const byName = new Map();
217
+ for (const e of forProject()) {
218
+ if (e.type !== "custom" || !inRange(e, opts))
219
+ continue;
220
+ if (opts.scene != null && opts.scene.length > 0 && sceneOf(e) !== opts.scene)
221
+ continue;
222
+ const name = e.name;
223
+ if (typeof name !== "string" || name.length === 0)
224
+ continue;
225
+ const list = byName.get(name) ?? [];
226
+ list.push(e);
227
+ byName.set(name, list);
228
+ }
229
+ const samples = [];
230
+ const ranked = [...byName.entries()]
231
+ .sort((a, b) => b[1].length - a[1].length || (a[0] < b[0] ? -1 : 1))
232
+ .slice(0, limit);
233
+ for (const [name, list] of ranked) {
234
+ const sessions = new Set(list.map((e) => e.sessionId)).size;
235
+ const recent = [...list].sort((a, b) => b.ts - a.ts).slice(0, sampleRows);
236
+ for (const event of recent) {
237
+ samples.push({ name, count: list.length, sessions, sample_payload: event });
238
+ }
239
+ }
240
+ return foldCustomEventVocabulary(samples);
241
+ },
146
242
  scenes: async (_projectId, opts = {}) => {
147
243
  const map = new Map();
148
244
  for (const e of forProject()) {
@@ -189,7 +285,11 @@ export function createMemoryStore({ projectId, apiKey, capabilities = ["query"],
189
285
  .map(([bucket, v]) => ({
190
286
  bucket,
191
287
  events: v.events,
192
- avg_fps: v.fpsCount > 0 ? v.fpsSum / v.fpsCount : 0,
288
+ // `null`, not `0`: a bucket can carry traffic and no `frame_perf`
289
+ // sample at all, and an average over nothing is absent. The SQL
290
+ // stores report SQL-NULL here and the registry declares the column
291
+ // `numOrNull` — this store must not be the odd one out.
292
+ avg_fps: v.fpsCount > 0 ? v.fpsSum / v.fpsCount : null,
193
293
  }))
194
294
  .sort((a, b) => a.bucket - b.bucket);
195
295
  },
@@ -206,6 +306,12 @@ export function createMemoryStore({ projectId, apiKey, capabilities = ["query"],
206
306
  .map(([event_type, count]) => ({ event_type, count }))
207
307
  .sort((a, b) => b.count - a.count);
208
308
  },
309
+ // The bucket series behind `baseline` and `movers` (ADR 0051 §4). The
310
+ // persistent stores render the declarative measure to SQL; here the same
311
+ // measure is evaluated over the in-memory events, so the insight endpoints
312
+ // answer in the playground and the E2E harness rather than reporting an
313
+ // empty series — which would read as "no data", a different claim.
314
+ metricBuckets: async (_projectId, opts) => evaluateBucketMeasure(forProject().map(toBucketEvent), opts),
209
315
  funnel: async (_projectId, opts) => {
210
316
  const steps = opts.steps ?? [];
211
317
  if (steps.length === 0)
@@ -457,10 +563,217 @@ export function createMemoryStore({ projectId, apiKey, capabilities = ["query"],
457
563
  listSceneRegions: async () => [...regions.entries()]
458
564
  .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
459
565
  .flatMap(([sceneId, set]) => set.map((r) => ({ sceneId, regionId: r.regionId, label: r.label }))),
566
+ // --- Project metadata (#310, ADR 0051 §5) ------------------------------
567
+ // Same semantics as the persistent stores — per-project caps, newest-first
568
+ // ordering, overlap filtering, `MetadataLimitError` when a table is full —
569
+ // so an E2E run against this store exercises the real contract.
570
+ createAnnotation: async (_projectId, input) => {
571
+ if (annotations.length >= METADATA_LIMITS.annotations) {
572
+ throw new MetadataLimitError("annotations", METADATA_LIMITS.annotations);
573
+ }
574
+ const now = new Date();
575
+ const { annotation } = input;
576
+ const record = {
577
+ id: randomUUID(),
578
+ projectId,
579
+ targetKind: annotation.targetKind,
580
+ targetId: annotation.targetId ?? null,
581
+ since: annotation.since == null ? null : new Date(annotation.since),
582
+ until: annotation.until == null ? null : new Date(annotation.until),
583
+ text: annotation.text,
584
+ authorKind: input.authorKind,
585
+ authorKeyId: input.authorKeyId,
586
+ createdAt: now,
587
+ updatedAt: now,
588
+ };
589
+ annotations.push(record);
590
+ return record;
591
+ },
592
+ listAnnotations: async (_projectId, opts = {}) => annotations
593
+ .filter((row) => opts.targetKind == null || row.targetKind === opts.targetKind)
594
+ .filter((row) => opts.targetId == null || row.targetId === opts.targetId)
595
+ .filter((row) => opts.since == null || row.until == null || row.until.getTime() >= opts.since)
596
+ .filter((row) => opts.until == null || row.since == null || row.since.getTime() < opts.until)
597
+ .sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime())
598
+ .slice(0, clampMetadataLimit(opts.limit)),
599
+ deleteAnnotation: async (_projectId, id) => {
600
+ const index = annotations.findIndex((row) => row.id === id);
601
+ if (index < 0)
602
+ return false;
603
+ annotations.splice(index, 1);
604
+ return true;
605
+ },
606
+ putGlossaryEntry: async (_projectId, input) => {
607
+ const { term, meaning } = input.entry;
608
+ if (!glossary.has(term) && glossary.size >= METADATA_LIMITS.glossary) {
609
+ throw new MetadataLimitError("glossary", METADATA_LIMITS.glossary);
610
+ }
611
+ const record = { projectId, term, meaning, updatedAt: new Date() };
612
+ glossary.set(term, record);
613
+ return record;
614
+ },
615
+ listGlossary: async (_projectId, opts = {}) => [...glossary.values()]
616
+ .sort((a, b) => (a.term < b.term ? -1 : a.term > b.term ? 1 : 0))
617
+ .slice(0, clampMetadataLimit(opts.limit, METADATA_LIMITS.glossary, METADATA_LIMITS.glossary)),
618
+ deleteGlossaryEntry: async (_projectId, term) => glossary.delete(term),
619
+ createSavedAnalysis: async (_projectId, input) => {
620
+ if (analyses.length >= METADATA_LIMITS.savedAnalyses) {
621
+ throw new MetadataLimitError("savedAnalyses", METADATA_LIMITS.savedAnalyses);
622
+ }
623
+ const { analysis } = input;
624
+ const record = {
625
+ id: randomUUID(),
626
+ projectId,
627
+ title: analysis.title,
628
+ query: analysis.query,
629
+ conclusion: analysis.conclusion ?? null,
630
+ authorKind: input.authorKind,
631
+ authorKeyId: input.authorKeyId,
632
+ createdAt: new Date(),
633
+ };
634
+ analyses.push(record);
635
+ return record;
636
+ },
637
+ listSavedAnalyses: async (_projectId, opts = {}) => [...analyses]
638
+ .sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime())
639
+ .slice(0, clampMetadataLimit(opts.limit)),
640
+ deleteSavedAnalysis: async (_projectId, id) => {
641
+ const index = analyses.findIndex((row) => row.id === id);
642
+ if (index < 0)
643
+ return false;
644
+ analyses.splice(index, 1);
645
+ return true;
646
+ },
647
+ // --- Declarative panel specs (#315, ADR 0051 §7) ---------------------
648
+ createPanelSpec: async (_projectId, input) => {
649
+ if (panelSpecs.length >= METADATA_LIMITS.panelSpecs) {
650
+ throw new MetadataLimitError("panelSpecs", METADATA_LIMITS.panelSpecs);
651
+ }
652
+ const now = new Date();
653
+ const record = {
654
+ id: randomUUID(),
655
+ projectId,
656
+ spec: input.spec,
657
+ authorKind: input.authorKind,
658
+ authorKeyId: input.authorKeyId,
659
+ createdAt: now,
660
+ updatedAt: now,
661
+ };
662
+ panelSpecs.push(record);
663
+ return record;
664
+ },
665
+ // Oldest first, which is insertion order — a pinned panel keeps its place.
666
+ listPanelSpecs: async (_projectId, opts = {}) => panelSpecs.slice(0, clampMetadataLimit(opts.limit, METADATA_LIMITS.panelSpecs, METADATA_LIMITS.panelSpecs)),
667
+ updatePanelSpec: async (_projectId, id, input) => {
668
+ const index = panelSpecs.findIndex((row) => row.id === id);
669
+ if (index < 0)
670
+ return null;
671
+ // The row keeps its id, its position and its original authorship — an
672
+ // edit is not a new pin.
673
+ const updated = {
674
+ ...panelSpecs[index],
675
+ spec: input.spec,
676
+ updatedAt: new Date(),
677
+ };
678
+ panelSpecs[index] = updated;
679
+ return updated;
680
+ },
681
+ deletePanelSpec: async (_projectId, id) => {
682
+ const index = panelSpecs.findIndex((row) => row.id === id);
683
+ if (index < 0)
684
+ return false;
685
+ panelSpecs.splice(index, 1);
686
+ return true;
687
+ },
688
+ // --- Conditional subscriptions (#311, ADR 0051 §6) -------------------
689
+ listSubscriptions: async () => [...subscriptions.values()],
690
+ listEnabledSubscriptions: async (limit) => [...subscriptions.values()]
691
+ .filter((sub) => sub.enabled)
692
+ .slice(0, Math.max(1, Math.trunc(limit ?? MAX_ENABLED_SUBSCRIPTIONS))),
693
+ getSubscription: async (_projectId, id) => subscriptions.get(id) ?? null,
694
+ createSubscription: async (_projectId, sub) => {
695
+ if (subscriptions.size >= MAX_SUBSCRIPTIONS_PER_PROJECT)
696
+ throw new SubscriptionLimitError();
697
+ const id = `sub_mem_${++subscriptionSeq}`;
698
+ const cols = toSubscriptionColumns(sub);
699
+ const now = Date.now();
700
+ // Round-trip through the shared row mapper rather than hand-building the
701
+ // record, so the in-memory store cannot drift from the four SQL stores
702
+ // (masking included).
703
+ const record = rowToSubscription({
704
+ id,
705
+ project_id: projectId,
706
+ name: cols.name,
707
+ metric: cols.metric,
708
+ config: cols.config,
709
+ enabled: cols.enabled,
710
+ created_at_ms: now,
711
+ updated_at_ms: now,
712
+ last_fired_at_ms: null,
713
+ last_error: null,
714
+ failures: 0,
715
+ });
716
+ subscriptions.set(id, record);
717
+ if (cols.webhookSecret != null)
718
+ secrets.set(id, cols.webhookSecret);
719
+ return record;
720
+ },
721
+ setSubscriptionEnabled: async (_projectId, id, enabled) => {
722
+ const existing = subscriptions.get(id);
723
+ if (existing == null)
724
+ return null;
725
+ const updated = { ...existing, enabled, updatedAt: new Date() };
726
+ subscriptions.set(id, updated);
727
+ return updated;
728
+ },
729
+ deleteSubscription: async (_projectId, id) => {
730
+ secrets.delete(id);
731
+ firings.delete(id);
732
+ return subscriptions.delete(id);
733
+ },
734
+ recordSubscriptionOutcome: async (_projectId, id, outcome) => {
735
+ const existing = subscriptions.get(id);
736
+ if (existing == null)
737
+ return;
738
+ subscriptions.set(id, {
739
+ ...existing,
740
+ updatedAt: new Date(),
741
+ lastFiredAt: outcome.firedAt ?? existing.lastFiredAt,
742
+ lastError: outcome.lastError === undefined
743
+ ? existing.lastError
744
+ : outcome.lastError == null
745
+ ? null
746
+ : clampSubscriptionError(outcome.lastError),
747
+ failures: outcome.failures ?? existing.failures,
748
+ });
749
+ },
750
+ getWebhookSecret: async (_projectId, id) => secrets.get(id) ?? null,
751
+ recordSubscriptionEvent: async (entry) => {
752
+ const log = firings.get(entry.subscriptionId) ?? [];
753
+ log.push({
754
+ id: randomUUID(),
755
+ subscriptionId: entry.subscriptionId,
756
+ projectId: entry.projectId,
757
+ at: entry.at ?? new Date(),
758
+ payload: entry.payload,
759
+ });
760
+ // Same bound as every persistent store: the oldest fall off the front.
761
+ while (log.length > MAX_SUBSCRIPTION_EVENTS)
762
+ log.shift();
763
+ firings.set(entry.subscriptionId, log);
764
+ },
765
+ listSubscriptionEvents: async (_projectId, id, opts) => [...(firings.get(id) ?? [])].reverse().slice(0, clampEventLimit(opts?.limit)),
460
766
  close: async () => {
461
767
  events.length = 0;
462
768
  representations.clear();
463
769
  regions.clear();
770
+ annotations.length = 0;
771
+ glossary.clear();
772
+ analyses.length = 0;
773
+ panelSpecs.length = 0;
774
+ subscriptions.clear();
775
+ secrets.clear();
776
+ firings.clear();
464
777
  },
465
778
  };
466
779
  }