feat: phase 3 observability — IMS telemetry merge

Port IMS telemetry into Primora conventions:

- core.components/core.events (migration 00004 + sqlc) scoped to projects
- POST /api/v1/ingest — single or <=500-event batches via project prm_
  keys (X-Primora-Key alias), auto-registering components, permissive CORS
- Issues: fingerprint-grouped errors with count/severity/first+last seen
- Reads: events w/ filters + before-cursor, components, stats (1h/24h/7d/30d
  bucketed series + component health + totals + metric names), metric
  series (avg/p50/p95/max)
- GET .../telemetry/stream — project-scoped SSE through an in-process hub
  (buffered subs, drop-on-slow, 25s keepalives); ?api_key=/?token= auth
  for EventSource
- Telemetry page: health/issues/events/metrics/integrate tabs, live badge,
  390px-clean; demo stubs
- @primora/client SDK (createPrimoraClient: capture*/heartbeat/installAuto,
  queued keepalive flushes)
- MCP: primora_list_issues/list_events/telemetry_stats/metric_series
- IMS README deprecation note pointing here

Also fixes workspace pins to 0.3.0 — npm ci in the frontend image was
resolving the unpublished 0.2.0 spec from the registry.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
Tomas DvorakandDevin committed 2026-09-16 16:21:03 +02:00
1 parent 6507eee606
commit 8cfddf9184
60 files changed
+3694 -30

No files matched your search

+20 -12
View File
@@ -1,12 +1,12 @@
{
"name": "primora",
"version": "0.2.0",
"version": "0.3.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "primora",
"version": "0.2.0",
"version": "0.3.0",
"workspaces": [
"apps/*",
"packages/*"
@@ -14,7 +14,7 @@
},
"apps/auth": {
"name": "@primora/auth",
"version": "0.2.0",
"version": "0.3.0",
"dependencies": {
"@hono/node-server": "^1.19.4",
"@hono/zod-validator": "^0.7.2",
@@ -38,7 +38,7 @@
},
"apps/cli": {
"name": "@primora/cli",
"version": "0.2.0",
"version": "0.3.0",
"dependencies": {
"@clack/prompts": "^1.8.1",
"cac": "^7.0.0",
@@ -48,7 +48,7 @@
"primora": "dist/cli.js"
},
"devDependencies": {
"@primora/api-client": "0.2.0",
"@primora/api-client": "0.3.0",
"@types/node": "^24.0.0",
"esbuild": "^0.27.4",
"typescript": "^5.9.2"
@@ -67,10 +67,10 @@
},
"apps/frontend": {
"name": "@primora/frontend",
"version": "0.2.0",
"version": "0.3.0",
"dependencies": {
"@primora/api-client": "0.2.0",
"@primora/shared-types": "0.2.0",
"@primora/api-client": "0.3.0",
"@primora/shared-types": "0.3.0",
"better-auth": "^1.5.6",
"solid-js": "^1.9.12"
},
@@ -91,7 +91,7 @@
},
"apps/mcp": {
"name": "@primora/mcp",
"version": "0.2.0",
"version": "0.3.0",
"dependencies": {
"@modelcontextprotocol/sdk": "^1.30.0",
"zod": "^4.1.5"
@@ -100,7 +100,7 @@
"primora-mcp": "dist/server.js"
},
"devDependencies": {
"@primora/api-client": "0.2.0",
"@primora/api-client": "0.3.0",
"@types/node": "^24.0.0",
"esbuild": "^0.27.4",
"typescript": "^5.9.2"
@@ -1353,6 +1353,10 @@
"resolved": "apps/cli",
"link": true
},
"node_modules/@primora/client": {
"resolved": "packages/client",
"link": true
},
"node_modules/@primora/frontend": {
"resolved": "apps/frontend",
"link": true
@@ -6783,7 +6787,7 @@
},
"packages/api-client": {
"name": "@primora/api-client",
"version": "0.2.0",
"version": "0.3.0",
"dependencies": {
"cross-fetch": "^4.1.0"
},
@@ -6791,9 +6795,13 @@
"openapi-typescript-codegen": "^0.29.0"
}
},
"packages/client": {
"name": "@primora/client",
"version": "0.3.0"
},
"packages/shared-types": {
"name": "@primora/shared-types",
"version": "0.2.0"
"version": "0.3.0"
}
}
}