@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.
- package/AGENTS.md +179 -6
- package/README.md +69 -0
- package/dist/__tests__/support/registryRequests.d.ts +2 -1
- package/dist/__tests__/support/registryRequests.d.ts.map +1 -1
- package/dist/__tests__/support/registryRequests.js +17 -1
- package/dist/__tests__/support/registryRequests.js.map +1 -1
- package/dist/__tests__/support/subscriptionFixtures.d.ts +63 -0
- package/dist/__tests__/support/subscriptionFixtures.d.ts.map +1 -0
- package/dist/__tests__/support/subscriptionFixtures.js +17 -0
- package/dist/__tests__/support/subscriptionFixtures.js.map +1 -0
- package/dist/agentReport.d.ts +256 -0
- package/dist/agentReport.d.ts.map +1 -0
- package/dist/agentReport.js +861 -0
- package/dist/agentReport.js.map +1 -0
- package/dist/app.d.ts +13 -0
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +112 -5
- package/dist/app.js.map +1 -1
- package/dist/audit.d.ts +5 -1
- package/dist/audit.d.ts.map +1 -1
- package/dist/audit.js +24 -4
- package/dist/audit.js.map +1 -1
- package/dist/auth.d.ts +41 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +47 -0
- package/dist/auth.js.map +1 -1
- package/dist/cli.js +99 -2
- package/dist/cli.js.map +1 -1
- package/dist/clickhouseStore.d.ts.map +1 -1
- package/dist/clickhouseStore.js +44 -2
- package/dist/clickhouseStore.js.map +1 -1
- package/dist/config.d.ts +49 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +21 -0
- package/dist/config.js.map +1 -1
- package/dist/connectionLimiter.d.ts +23 -0
- package/dist/connectionLimiter.d.ts.map +1 -0
- package/dist/connectionLimiter.js +24 -0
- package/dist/connectionLimiter.js.map +1 -0
- package/dist/duckdbStore.d.ts.map +1 -1
- package/dist/duckdbStore.js +44 -1
- package/dist/duckdbStore.js.map +1 -1
- package/dist/internalDispatch.d.ts +36 -0
- package/dist/internalDispatch.d.ts.map +1 -0
- package/dist/internalDispatch.js +50 -0
- package/dist/internalDispatch.js.map +1 -0
- package/dist/memoryStore.d.ts.map +1 -1
- package/dist/memoryStore.js +314 -1
- package/dist/memoryStore.js.map +1 -1
- package/dist/mssqlStore.d.ts.map +1 -1
- package/dist/mssqlStore.js +44 -2
- package/dist/mssqlStore.js.map +1 -1
- package/dist/postgresStore.d.ts.map +1 -1
- package/dist/postgresStore.js +44 -2
- package/dist/postgresStore.js.map +1 -1
- package/dist/projectMetadata.d.ts +82 -0
- package/dist/projectMetadata.d.ts.map +1 -0
- package/dist/projectMetadata.js +50 -0
- package/dist/projectMetadata.js.map +1 -0
- package/dist/routes/context.d.ts +135 -0
- package/dist/routes/context.d.ts.map +1 -0
- package/dist/routes/context.js +306 -0
- package/dist/routes/context.js.map +1 -0
- package/dist/routes/insights.d.ts +36 -0
- package/dist/routes/insights.d.ts.map +1 -0
- package/dist/routes/insights.js +810 -0
- package/dist/routes/insights.js.map +1 -0
- package/dist/routes/live.d.ts +8 -0
- package/dist/routes/live.d.ts.map +1 -1
- package/dist/routes/live.js +8 -7
- package/dist/routes/live.js.map +1 -1
- package/dist/routes/mcp.d.ts +36 -0
- package/dist/routes/mcp.d.ts.map +1 -0
- package/dist/routes/mcp.js +262 -0
- package/dist/routes/mcp.js.map +1 -0
- package/dist/routes/meta.d.ts +16 -2
- package/dist/routes/meta.d.ts.map +1 -1
- package/dist/routes/meta.js +699 -10
- package/dist/routes/meta.js.map +1 -1
- package/dist/routes/metadata.d.ts +31 -0
- package/dist/routes/metadata.d.ts.map +1 -0
- package/dist/routes/metadata.js +163 -0
- package/dist/routes/metadata.js.map +1 -0
- package/dist/routes/narrative.d.ts +36 -0
- package/dist/routes/narrative.d.ts.map +1 -0
- package/dist/routes/narrative.js +95 -0
- package/dist/routes/narrative.js.map +1 -0
- package/dist/routes/panels.d.ts +44 -0
- package/dist/routes/panels.d.ts.map +1 -0
- package/dist/routes/panels.js +108 -0
- package/dist/routes/panels.js.map +1 -0
- package/dist/routes/query-dsl.d.ts +50 -0
- package/dist/routes/query-dsl.d.ts.map +1 -0
- package/dist/routes/query-dsl.js +359 -0
- package/dist/routes/query-dsl.js.map +1 -0
- package/dist/routes/query.d.ts +36 -0
- package/dist/routes/query.d.ts.map +1 -1
- package/dist/routes/query.js +101 -13
- package/dist/routes/query.js.map +1 -1
- package/dist/routes/subscriptions.d.ts +52 -0
- package/dist/routes/subscriptions.d.ts.map +1 -0
- package/dist/routes/subscriptions.js +290 -0
- package/dist/routes/subscriptions.js.map +1 -0
- package/dist/store.d.ts +113 -2
- package/dist/store.d.ts.map +1 -1
- package/dist/subscriptions/cli.d.ts +36 -0
- package/dist/subscriptions/cli.d.ts.map +1 -0
- package/dist/subscriptions/cli.js +143 -0
- package/dist/subscriptions/cli.js.map +1 -0
- package/dist/subscriptions/delivery.d.ts +101 -0
- package/dist/subscriptions/delivery.d.ts.map +1 -0
- package/dist/subscriptions/delivery.js +165 -0
- package/dist/subscriptions/delivery.js.map +1 -0
- package/dist/subscriptions/evaluate.d.ts +119 -0
- package/dist/subscriptions/evaluate.d.ts.map +1 -0
- package/dist/subscriptions/evaluate.js +326 -0
- package/dist/subscriptions/evaluate.js.map +1 -0
- package/dist/subscriptions/scheduler.d.ts +97 -0
- package/dist/subscriptions/scheduler.d.ts.map +1 -0
- package/dist/subscriptions/scheduler.js +332 -0
- package/dist/subscriptions/scheduler.js.map +1 -0
- package/dist/subscriptions/stream.d.ts +40 -0
- package/dist/subscriptions/stream.d.ts.map +1 -0
- package/dist/subscriptions/stream.js +38 -0
- package/dist/subscriptions/stream.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +25 -0
- package/dist/version.js.map +1 -0
- package/dist/webhookSignature.d.ts +64 -0
- package/dist/webhookSignature.d.ts.map +1 -0
- package/dist/webhookSignature.js +91 -0
- package/dist/webhookSignature.js.map +1 -0
- package/llms.txt +38 -1
- package/package.json +17 -14
package/dist/duckdbStore.js
CHANGED
|
@@ -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
|
},
|
package/dist/duckdbStore.js.map
CHANGED
|
@@ -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":"
|
|
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"}
|
package/dist/memoryStore.js
CHANGED
|
@@ -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
|
-
|
|
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
|
}
|