pi-mega-compact 0.20.82 → 0.20.84

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 (109) hide show
  1. package/dist/extensions/dashboard-server/routes-rag-settings-helpers.js +0 -1
  2. package/dist/extensions/mega-config.js +3 -2
  3. package/dist/extensions/mega-events/agent-handlers/turnEndHandler/recordTurnRow.js +0 -17
  4. package/dist/extensions/mega-events/context-handler/triggerGuard.js +86 -0
  5. package/dist/extensions/mega-events/context-handler.js +12 -0
  6. package/dist/extensions/mega-events/register.js +0 -3
  7. package/dist/src/failback/types.js +11 -0
  8. package/extensions/dashboard-client/dist/assets/{AdminTab-BTCZLMCc.js → AdminTab-BsA8-_bX.js} +2 -2
  9. package/extensions/dashboard-client/dist/assets/{AdminTab-BTCZLMCc.js.map → AdminTab-BsA8-_bX.js.map} +1 -1
  10. package/extensions/dashboard-client/dist/assets/{AreaChart-BTMI0QnR.js → AreaChart-BRHEfWhc.js} +2 -2
  11. package/extensions/dashboard-client/dist/assets/{AreaChart-BTMI0QnR.js.map → AreaChart-BRHEfWhc.js.map} +1 -1
  12. package/extensions/dashboard-client/dist/assets/{BarChart-C1F8wLM3.js → BarChart-C-M0LaFc.js} +2 -2
  13. package/extensions/dashboard-client/dist/assets/{BarChart-C1F8wLM3.js.map → BarChart-C-M0LaFc.js.map} +1 -1
  14. package/extensions/dashboard-client/dist/assets/{CacheTab-ORjrhSbZ.js → CacheTab-Cj3n59U3.js} +2 -2
  15. package/extensions/dashboard-client/dist/assets/{CacheTab-ORjrhSbZ.js.map → CacheTab-Cj3n59U3.js.map} +1 -1
  16. package/extensions/dashboard-client/dist/assets/{ConfigTab-CtXVSxD_.js → ConfigTab-C016XTNC.js} +2 -2
  17. package/extensions/dashboard-client/dist/assets/{ConfigTab-CtXVSxD_.js.map → ConfigTab-C016XTNC.js.map} +1 -1
  18. package/extensions/dashboard-client/dist/assets/{EventsTab-DQdwa9IB.js → EventsTab-DE29fuqe.js} +2 -2
  19. package/extensions/dashboard-client/dist/assets/{EventsTab-DQdwa9IB.js.map → EventsTab-DE29fuqe.js.map} +1 -1
  20. package/extensions/dashboard-client/dist/assets/{HealthTab-BpVO7BeO.js → HealthTab-D4eVI8ar.js} +2 -2
  21. package/extensions/dashboard-client/dist/assets/{HealthTab-BpVO7BeO.js.map → HealthTab-D4eVI8ar.js.map} +1 -1
  22. package/extensions/dashboard-client/dist/assets/{MaintenanceTab-Cl9mWaR8.js → MaintenanceTab-4fJ7M4S4.js} +2 -2
  23. package/extensions/dashboard-client/dist/assets/{MaintenanceTab-Cl9mWaR8.js.map → MaintenanceTab-4fJ7M4S4.js.map} +1 -1
  24. package/extensions/dashboard-client/dist/assets/{MemoryMapTab-D3kIPeCy.js → MemoryMapTab-CDbcK9e4.js} +2 -2
  25. package/extensions/dashboard-client/dist/assets/{MemoryMapTab-D3kIPeCy.js.map → MemoryMapTab-CDbcK9e4.js.map} +1 -1
  26. package/extensions/dashboard-client/dist/assets/{MetricsCards-Cu1zDkfm.js → MetricsCards-VUEcgGzo.js} +2 -2
  27. package/extensions/dashboard-client/dist/assets/{MetricsCards-Cu1zDkfm.js.map → MetricsCards-VUEcgGzo.js.map} +1 -1
  28. package/extensions/dashboard-client/dist/assets/MetricsTab-CKqJ0Zl-.js +2 -0
  29. package/extensions/dashboard-client/dist/assets/{MetricsTab-BAvMzWuF.js.map → MetricsTab-CKqJ0Zl-.js.map} +1 -1
  30. package/extensions/dashboard-client/dist/assets/OverviewTab-9Kxo79mi.js +16 -0
  31. package/extensions/dashboard-client/dist/assets/OverviewTab-9Kxo79mi.js.map +1 -0
  32. package/extensions/dashboard-client/dist/assets/{ReposTab-BUESjauJ.js → ReposTab-C4iveqrP.js} +2 -2
  33. package/extensions/dashboard-client/dist/assets/{ReposTab-BUESjauJ.js.map → ReposTab-C4iveqrP.js.map} +1 -1
  34. package/extensions/dashboard-client/dist/assets/{SessionsTab-DyJmQ_78.js → SessionsTab-DSEwkMQm.js} +2 -2
  35. package/extensions/dashboard-client/dist/assets/{SessionsTab-DyJmQ_78.js.map → SessionsTab-DSEwkMQm.js.map} +1 -1
  36. package/extensions/dashboard-client/dist/assets/{SetupTab-q8wYL5A-.js → SetupTab-CCyWgy4O.js} +2 -2
  37. package/extensions/dashboard-client/dist/assets/{SetupTab-q8wYL5A-.js.map → SetupTab-CCyWgy4O.js.map} +1 -1
  38. package/extensions/dashboard-client/dist/assets/{TimeSavedCard-DIRH1Pq7.js → TimeSavedCard-CyD8e_e_.js} +2 -2
  39. package/extensions/dashboard-client/dist/assets/{TimeSavedCard-DIRH1Pq7.js.map → TimeSavedCard-CyD8e_e_.js.map} +1 -1
  40. package/extensions/dashboard-client/dist/assets/{TurnMemoryView-CrYSOcZX.js → TurnMemoryView-5tLbWkRv.js} +2 -2
  41. package/extensions/dashboard-client/dist/assets/{TurnMemoryView-CrYSOcZX.js.map → TurnMemoryView-5tLbWkRv.js.map} +1 -1
  42. package/extensions/dashboard-client/dist/assets/TurnsTab-C7pm92Hg.js +2 -0
  43. package/extensions/dashboard-client/dist/assets/{TurnsTab-C0jARSvU.js.map → TurnsTab-C7pm92Hg.js.map} +1 -1
  44. package/extensions/dashboard-client/dist/assets/{VcStatusBadge-D83Fz939.js → VcStatusBadge-ObhcIyfN.js} +2 -2
  45. package/extensions/dashboard-client/dist/assets/{VcStatusBadge-D83Fz939.js.map → VcStatusBadge-ObhcIyfN.js.map} +1 -1
  46. package/extensions/dashboard-client/dist/assets/{VectorCortexTab-BFXh5Nu7.js → VectorCortexTab-BtHZb7o7.js} +2 -2
  47. package/extensions/dashboard-client/dist/assets/{VectorCortexTab-BFXh5Nu7.js.map → VectorCortexTab-BtHZb7o7.js.map} +1 -1
  48. package/extensions/dashboard-client/dist/assets/{WikiTab-CEdJXkou.js → WikiTab-lQ4l3QIK.js} +2 -2
  49. package/extensions/dashboard-client/dist/assets/{WikiTab-CEdJXkou.js.map → WikiTab-lQ4l3QIK.js.map} +1 -1
  50. package/extensions/dashboard-client/dist/assets/{button-BlRKWQsj.js → button-DhQQAJGm.js} +2 -2
  51. package/extensions/dashboard-client/dist/assets/{button-BlRKWQsj.js.map → button-DhQQAJGm.js.map} +1 -1
  52. package/extensions/dashboard-client/dist/assets/{card-Cx6WA_2T.js → card-Cfhz9X31.js} +2 -2
  53. package/extensions/dashboard-client/dist/assets/{card-Cx6WA_2T.js.map → card-Cfhz9X31.js.map} +1 -1
  54. package/extensions/dashboard-client/dist/assets/{client-extra-BRFScIiK.js → client-extra-CKNOGEz_.js} +2 -2
  55. package/extensions/dashboard-client/dist/assets/{client-extra-BRFScIiK.js.map → client-extra-CKNOGEz_.js.map} +1 -1
  56. package/extensions/dashboard-client/dist/assets/{generateCategoricalChart-DrkPNaOf.js → generateCategoricalChart-JKjK9_cB.js} +2 -2
  57. package/extensions/dashboard-client/dist/assets/{generateCategoricalChart-DrkPNaOf.js.map → generateCategoricalChart-JKjK9_cB.js.map} +1 -1
  58. package/extensions/dashboard-client/dist/assets/{index-DUnKr3wN.js → index-iuxgtzEW.js} +6 -6
  59. package/extensions/dashboard-client/dist/assets/index-iuxgtzEW.js.map +1 -0
  60. package/extensions/dashboard-client/dist/assets/{switch-Wr0u4HKw.js → switch-7EHEQMSP.js} +2 -2
  61. package/extensions/dashboard-client/dist/assets/{switch-Wr0u4HKw.js.map → switch-7EHEQMSP.js.map} +1 -1
  62. package/extensions/dashboard-client/dist/assets/{toggle-C_eSNeMT.js → toggle-z1lWY4UM.js} +2 -2
  63. package/extensions/dashboard-client/dist/assets/{toggle-C_eSNeMT.js.map → toggle-z1lWY4UM.js.map} +1 -1
  64. package/extensions/dashboard-client/dist/assets/{useSSE-C_oFqrwF.js → useSSE-sctOZuRM.js} +2 -2
  65. package/extensions/dashboard-client/dist/assets/{useSSE-C_oFqrwF.js.map → useSSE-sctOZuRM.js.map} +1 -1
  66. package/extensions/dashboard-client/dist/index.html +1 -1
  67. package/extensions/dashboard-client/src/App.tsx +1 -11
  68. package/extensions/dashboard-client/src/components/RepoContextStack.tsx +21 -28
  69. package/extensions/dashboard-client/src/tabs/dashHashRouter.ts +1 -31
  70. package/extensions/dashboard-server/routes-rag-settings-helpers.ts +0 -6
  71. package/extensions/mega-config-types.ts +4 -3
  72. package/extensions/mega-config.ts +3 -2
  73. package/extensions/mega-events/agent-handlers/turnEndHandler/recordTurnRow.ts +0 -17
  74. package/extensions/mega-events/context-handler/triggerGuard.ts +137 -0
  75. package/extensions/mega-events/context-handler.ts +11 -0
  76. package/extensions/mega-events/register.ts +0 -3
  77. package/package.json +1 -1
  78. package/src/failback/types.ts +46 -0
  79. package/dist/extensions/mega-events/analytics-handler.js +0 -169
  80. package/dist/src/store/analytics/connection.js +0 -114
  81. package/dist/src/store/analytics/contract-compliance.test/_helpers.js +0 -39
  82. package/dist/src/store/analytics/index.js +0 -25
  83. package/dist/src/store/analytics/memory-store.js +0 -111
  84. package/dist/src/store/analytics/schema.js +0 -108
  85. package/dist/src/store/analytics/sqlite-store/admin.js +0 -84
  86. package/dist/src/store/analytics/sqlite-store/ctx.js +0 -1
  87. package/dist/src/store/analytics/sqlite-store/read.js +0 -25
  88. package/dist/src/store/analytics/sqlite-store/rows.js +0 -44
  89. package/dist/src/store/analytics/sqlite-store/write.js +0 -90
  90. package/dist/src/store/analytics/sqlite-store.js +0 -79
  91. package/dist/src/store/analytics/types.js +0 -17
  92. package/extensions/dashboard-client/dist/assets/MetricsTab-BAvMzWuF.js +0 -2
  93. package/extensions/dashboard-client/dist/assets/OverviewTab-CouEq0qi.js +0 -16
  94. package/extensions/dashboard-client/dist/assets/OverviewTab-CouEq0qi.js.map +0 -1
  95. package/extensions/dashboard-client/dist/assets/TurnsTab-C0jARSvU.js +0 -2
  96. package/extensions/dashboard-client/dist/assets/index-DUnKr3wN.js.map +0 -1
  97. package/extensions/mega-events/analytics-handler.ts +0 -236
  98. package/src/store/analytics/connection.ts +0 -128
  99. package/src/store/analytics/contract-compliance.test/_helpers.ts +0 -47
  100. package/src/store/analytics/index.ts +0 -61
  101. package/src/store/analytics/memory-store.ts +0 -161
  102. package/src/store/analytics/schema.ts +0 -132
  103. package/src/store/analytics/sqlite-store/admin.ts +0 -96
  104. package/src/store/analytics/sqlite-store/ctx.ts +0 -9
  105. package/src/store/analytics/sqlite-store/read.ts +0 -46
  106. package/src/store/analytics/sqlite-store/rows.ts +0 -58
  107. package/src/store/analytics/sqlite-store/write.ts +0 -111
  108. package/src/store/analytics/sqlite-store.ts +0 -119
  109. package/src/store/analytics/types.ts +0 -202
@@ -1,111 +0,0 @@
1
- import { getAnalyticsSchemaVersion } from "./schema.js";
2
- export class InMemoryAnalyticsStore {
3
- events = new Map();
4
- measurements = [];
5
- identities = [];
6
- nextId = 1;
7
- constructor(_options) {
8
- // Options unused — the in-memory store doesn't open a DB.
9
- }
10
- allocId() {
11
- return this.nextId++;
12
- }
13
- // ── AnalyticsReader ───────────────────────────────────────────────
14
- status() {
15
- const lastEvent = this.events.size > 0
16
- ? Math.max(...[...this.events.values()].map((e) => e.observedAt))
17
- : 0;
18
- const lastMeas = this.measurements.length > 0
19
- ? Math.max(...this.measurements.map((m) => m.observedAt))
20
- : 0;
21
- const lastId = this.identities.length > 0
22
- ? Math.max(...this.identities.map((i) => i.observedAt))
23
- : 0;
24
- return {
25
- enabled: true,
26
- schemaVersion: getAnalyticsSchemaVersion(),
27
- requestEventCount: this.events.size,
28
- measurementCount: this.measurements.length,
29
- identityCount: this.identities.length,
30
- freshThrough: Math.max(lastEvent, lastMeas, lastId) || null,
31
- };
32
- }
33
- // ── AnalyticsWriter ───────────────────────────────────────────────
34
- appendRequestEvent(fact) {
35
- if (this.events.has(fact.id)) {
36
- return { status: "duplicate", id: fact.id };
37
- }
38
- this.events.set(fact.id, { ...fact });
39
- return { status: "accepted", id: fact.id };
40
- }
41
- appendMeasurement(sample) {
42
- const id = this.allocId();
43
- this.measurements.push({ ...sample, id });
44
- return { status: "accepted", id };
45
- }
46
- appendIdentity(observation) {
47
- const id = this.allocId();
48
- this.identities.push({ ...observation, id });
49
- return { status: "accepted", id };
50
- }
51
- // ── AnalyticsAdmin ────────────────────────────────────────────────
52
- prune(policy) {
53
- const now = Date.now();
54
- const eventCutoff = now - policy.maxEventAgeMs;
55
- const measCutoff = now - policy.maxMeasurementAgeMs;
56
- const beforeE = this.events.size;
57
- const beforeM = this.measurements.length;
58
- for (const [k, e] of this.events) {
59
- if (e.observedAt < eventCutoff)
60
- this.events.delete(k);
61
- }
62
- this.measurements = this.measurements.filter((m) => m.observedAt >= measCutoff);
63
- return {
64
- eventsRemoved: beforeE - this.events.size,
65
- measurementsRemoved: beforeM - this.measurements.length,
66
- identitiesRemoved: 0,
67
- freedBytes: 0,
68
- };
69
- }
70
- vacuum() {
71
- return { ok: true, detail: "no-op for in-memory store" };
72
- }
73
- integrityCheck() {
74
- return { ok: true, detail: "ok" };
75
- }
76
- backup() {
77
- return { ok: false, detail: "Cannot backup an in-memory database" };
78
- }
79
- clear() {
80
- this.events.clear();
81
- this.measurements = [];
82
- this.identities = [];
83
- this.nextId = 1;
84
- }
85
- close() {
86
- this.clear();
87
- }
88
- // ── Capability views ──────────────────────────────────────────────
89
- asReader() {
90
- return {
91
- status: () => this.status(),
92
- };
93
- }
94
- asWriter() {
95
- return {
96
- appendRequestEvent: (f) => this.appendRequestEvent(f),
97
- appendMeasurement: (s) => this.appendMeasurement(s),
98
- appendIdentity: (o) => this.appendIdentity(o),
99
- };
100
- }
101
- asAdmin() {
102
- return {
103
- prune: (p) => this.prune(p),
104
- vacuum: () => this.vacuum(),
105
- integrityCheck: () => this.integrityCheck(),
106
- backup: () => this.backup(),
107
- clear: () => this.clear(),
108
- close: () => this.close(),
109
- };
110
- }
111
- }
@@ -1,108 +0,0 @@
1
- const SCHEMA_VERSION = 1;
2
- /**
3
- * Initialize the analytics.db schema. Safe to call on every open — every
4
- * statement is CREATE IF NOT EXISTS.
5
- */
6
- export function initAnalyticsSchema(db) {
7
- // ── Lifecycle tables ──────────────────────────────────────────────
8
- db.exec(`
9
- CREATE TABLE IF NOT EXISTS analytics_meta (
10
- key TEXT PRIMARY KEY,
11
- value TEXT NOT NULL
12
- )
13
- `);
14
- db.exec(`
15
- CREATE TABLE IF NOT EXISTS analytics_schema (
16
- version INTEGER PRIMARY KEY,
17
- applied_at INTEGER NOT NULL,
18
- digest TEXT NOT NULL
19
- )
20
- `);
21
- db.exec(`
22
- CREATE TABLE IF NOT EXISTS analytics_migrations (
23
- id TEXT PRIMARY KEY,
24
- started_at INTEGER NOT NULL,
25
- completed_at INTEGER,
26
- source_fingerprint TEXT,
27
- rows_copied INTEGER,
28
- status TEXT NOT NULL,
29
- detail TEXT
30
- )
31
- `);
32
- // ── Append-only fact tables ───────────────────────────────────────
33
- db.exec(`
34
- CREATE TABLE IF NOT EXISTS request_events (
35
- id TEXT PRIMARY KEY,
36
- correlation_id TEXT,
37
- session_id TEXT,
38
- repo_id TEXT,
39
- turn_id TEXT,
40
- event_kind TEXT NOT NULL CHECK(event_kind IN (
41
- 'request_started',
42
- 'provider_selected',
43
- 'first_token',
44
- 'request_completed',
45
- 'request_failed'
46
- )),
47
- observed_at INTEGER NOT NULL,
48
- provider TEXT,
49
- model TEXT,
50
- status TEXT,
51
- input_tokens INTEGER,
52
- output_tokens INTEGER,
53
- cache_read_tokens INTEGER,
54
- cache_write_tokens INTEGER,
55
- duration_ms REAL,
56
- ttft_ms REAL,
57
- source TEXT NOT NULL,
58
- quality_json TEXT NOT NULL
59
- )
60
- `);
61
- db.exec(`
62
- CREATE TABLE IF NOT EXISTS measurement_samples (
63
- id INTEGER PRIMARY KEY AUTOINCREMENT,
64
- observed_at INTEGER NOT NULL,
65
- sample_kind TEXT NOT NULL,
66
- provider TEXT,
67
- model TEXT,
68
- value REAL NOT NULL,
69
- unit TEXT NOT NULL,
70
- correlation_id TEXT,
71
- source TEXT NOT NULL,
72
- quality_json TEXT NOT NULL
73
- )
74
- `);
75
- db.exec(`
76
- CREATE TABLE IF NOT EXISTS identity_observations (
77
- id INTEGER PRIMARY KEY AUTOINCREMENT,
78
- observed_at INTEGER NOT NULL,
79
- provider TEXT,
80
- model TEXT,
81
- source TEXT NOT NULL,
82
- metadata_json TEXT NOT NULL
83
- )
84
- `);
85
- // ── Indexes (spec §6) ─────────────────────────────────────────────
86
- db.exec(`CREATE INDEX IF NOT EXISTS idx_request_events_observed_at ON request_events(observed_at)`);
87
- db.exec(`CREATE INDEX IF NOT EXISTS idx_request_events_provider_observed ON request_events(provider, observed_at)`);
88
- db.exec(`CREATE INDEX IF NOT EXISTS idx_request_events_model_observed ON request_events(model, observed_at)`);
89
- db.exec(`CREATE INDEX IF NOT EXISTS idx_request_events_kind_observed ON request_events(event_kind, observed_at)`);
90
- db.exec(`CREATE INDEX IF NOT EXISTS idx_request_events_correlation ON request_events(correlation_id, observed_at)`);
91
- db.exec(`CREATE INDEX IF NOT EXISTS idx_measurement_samples_kind_observed ON measurement_samples(sample_kind, observed_at)`);
92
- db.exec(`CREATE INDEX IF NOT EXISTS idx_measurement_samples_provider_model ON measurement_samples(provider, model, observed_at)`);
93
- db.exec(`CREATE INDEX IF NOT EXISTS idx_identity_obs_provider_model ON identity_observations(provider, model, observed_at)`);
94
- // ── Schema version stamp (insert-only, never overwrites) ─────────
95
- const existing = db
96
- .prepare("SELECT value FROM analytics_meta WHERE key = 'schema_version'")
97
- .get();
98
- if (!existing) {
99
- db.prepare("INSERT INTO analytics_meta (key, value) VALUES ('schema_version', ?)")
100
- .run(String(SCHEMA_VERSION));
101
- db.prepare("INSERT INTO analytics_schema (version, applied_at, digest) VALUES (?, ?, ?)")
102
- .run(SCHEMA_VERSION, Date.now(), "pma-1-initial");
103
- }
104
- }
105
- /** The current analytics schema version. */
106
- export function getAnalyticsSchemaVersion() {
107
- return SCHEMA_VERSION;
108
- }
@@ -1,84 +0,0 @@
1
- /**
2
- * admin.ts — AnalyticsAdmin delegate bodies for the SQLite backend.
3
- * Destructive/maintenance operations: prune, vacuum, integrityCheck, backup, clear, close.
4
- */
5
- import { copyFileSync, existsSync } from "node:fs";
6
- import { withTx } from "../connection.js";
7
- import { analyticsDbPath } from "../connection.js";
8
- export function prune(ctx, policy) {
9
- const now = Date.now();
10
- const eventCutoff = now - policy.maxEventAgeMs;
11
- const measCutoff = now - policy.maxMeasurementAgeMs;
12
- const delEvents = ctx.db
13
- .prepare("DELETE FROM request_events WHERE observed_at < ?")
14
- .run(eventCutoff);
15
- const delMeas = ctx.db
16
- .prepare("DELETE FROM measurement_samples WHERE observed_at < ?")
17
- .run(measCutoff);
18
- // Identity observations are not age-pruned (they're low-volume snapshots).
19
- if (policy.vacuumAfterPrune) {
20
- try {
21
- ctx.db.exec("VACUUM");
22
- }
23
- catch {
24
- /* non-fatal */
25
- }
26
- }
27
- return {
28
- eventsRemoved: delEvents.changes ?? 0,
29
- measurementsRemoved: delMeas.changes ?? 0,
30
- identitiesRemoved: 0,
31
- freedBytes: 0,
32
- };
33
- }
34
- export function vacuum(ctx) {
35
- try {
36
- ctx.db.exec("VACUUM");
37
- return { ok: true, detail: "VACUUM completed" };
38
- }
39
- catch (e) {
40
- return { ok: false, detail: String(e) };
41
- }
42
- }
43
- export function integrityCheck(ctx) {
44
- try {
45
- const row = ctx.db.prepare("PRAGMA integrity_check").get();
46
- const result = row?.integrity_check ?? "ok";
47
- return { ok: result === "ok", detail: result };
48
- }
49
- catch (e) {
50
- return { ok: false, detail: String(e) };
51
- }
52
- }
53
- export function backup(ctx) {
54
- if (ctx.opts.inMemory) {
55
- return { ok: false, detail: "Cannot backup an in-memory database" };
56
- }
57
- try {
58
- // WAL-safe checkpoint before copy.
59
- ctx.db.exec("PRAGMA wal_checkpoint(TRUNCATE)");
60
- const src = analyticsDbPath(ctx.stateDir);
61
- if (!existsSync(src))
62
- return { ok: false, detail: "analytics.db not found" };
63
- const dest = `${src}.bak-${Date.now()}`;
64
- copyFileSync(src, dest);
65
- return { ok: true, path: dest, detail: `Backup written to ${dest}` };
66
- }
67
- catch (e) {
68
- return { ok: false, detail: String(e) };
69
- }
70
- }
71
- export function clear(ctx) {
72
- withTx(ctx.db, () => {
73
- ctx.db.exec("DELETE FROM request_events");
74
- ctx.db.exec("DELETE FROM measurement_samples");
75
- ctx.db.exec("DELETE FROM identity_observations");
76
- // Reset AUTOINCREMENT sequences for measurement_samples + identity_observations.
77
- try {
78
- ctx.db.exec("DELETE FROM sqlite_sequence WHERE name IN ('measurement_samples', 'identity_observations')");
79
- }
80
- catch {
81
- /* non-fatal: sqlite_sequence may not exist yet */
82
- }
83
- });
84
- }
@@ -1 +0,0 @@
1
- export {};
@@ -1,25 +0,0 @@
1
- import { getAnalyticsSchemaVersion } from "../schema.js";
2
- export function status(ctx) {
3
- const eventCount = ctx.db.prepare("SELECT COUNT(*) AS c FROM request_events").get().c;
4
- const measurementCount = ctx.db.prepare("SELECT COUNT(*) AS c FROM measurement_samples").get().c;
5
- const identityCount = ctx.db.prepare("SELECT COUNT(*) AS c FROM identity_observations").get().c;
6
- // Freshness: the most recent observed_at across all three fact tables.
7
- const lastEvent = ctx.db
8
- .prepare("SELECT MAX(observed_at) AS mx FROM request_events")
9
- .get().mx;
10
- const lastMeas = ctx.db
11
- .prepare("SELECT MAX(observed_at) AS mx FROM measurement_samples")
12
- .get().mx;
13
- const lastId = ctx.db
14
- .prepare("SELECT MAX(observed_at) AS mx FROM identity_observations")
15
- .get().mx;
16
- const freshThrough = Math.max(lastEvent ?? 0, lastMeas ?? 0, lastId ?? 0) || null;
17
- return {
18
- enabled: true,
19
- schemaVersion: getAnalyticsSchemaVersion(),
20
- requestEventCount: eventCount,
21
- measurementCount,
22
- identityCount,
23
- freshThrough,
24
- };
25
- }
@@ -1,44 +0,0 @@
1
- export function rowToRequestEvent(r) {
2
- return {
3
- id: r.id,
4
- correlationId: r.correlation_id ?? undefined,
5
- sessionId: r.session_id ?? undefined,
6
- repoId: r.repo_id ?? undefined,
7
- turnId: r.turn_id ?? undefined,
8
- eventKind: r.event_kind,
9
- observedAt: r.observed_at,
10
- provider: r.provider ?? undefined,
11
- model: r.model ?? undefined,
12
- status: r.status ?? undefined,
13
- inputTokens: r.input_tokens ?? undefined,
14
- outputTokens: r.output_tokens ?? undefined,
15
- cacheReadTokens: r.cache_read_tokens ?? undefined,
16
- cacheWriteTokens: r.cache_write_tokens ?? undefined,
17
- durationMs: r.duration_ms ?? undefined,
18
- ttftMs: r.ttft_ms ?? undefined,
19
- source: r.source,
20
- quality: JSON.parse(r.quality_json ?? "{}"),
21
- };
22
- }
23
- export function rowToMeasurement(r) {
24
- return {
25
- observedAt: r.observed_at,
26
- sampleKind: r.sample_kind,
27
- provider: r.provider ?? undefined,
28
- model: r.model ?? undefined,
29
- value: r.value,
30
- unit: r.unit,
31
- correlationId: r.correlation_id ?? undefined,
32
- source: r.source,
33
- quality: JSON.parse(r.quality_json ?? "{}"),
34
- };
35
- }
36
- export function rowToIdentity(r) {
37
- return {
38
- observedAt: r.observed_at,
39
- provider: r.provider ?? undefined,
40
- model: r.model ?? undefined,
41
- source: r.source,
42
- metadata: JSON.parse(r.metadata_json ?? "{}"),
43
- };
44
- }
@@ -1,90 +0,0 @@
1
- export function appendRequestEvent(ctx, fact) {
2
- try {
3
- const res = ctx.db
4
- .prepare(`INSERT OR IGNORE INTO request_events (
5
- id, correlation_id, session_id, repo_id, turn_id, event_kind,
6
- observed_at, provider, model, status,
7
- input_tokens, output_tokens, cache_read_tokens, cache_write_tokens,
8
- duration_ms, ttft_ms, source, quality_json
9
- ) VALUES (
10
- @id, @correlation_id, @session_id, @repo_id, @turn_id, @event_kind,
11
- @observed_at, @provider, @model, @status,
12
- @input_tokens, @output_tokens, @cache_read_tokens, @cache_write_tokens,
13
- @duration_ms, @ttft_ms, @source, @quality_json
14
- )`)
15
- .run({
16
- "@id": fact.id,
17
- "@correlation_id": fact.correlationId ?? null,
18
- "@session_id": fact.sessionId ?? null,
19
- "@repo_id": fact.repoId ?? null,
20
- "@turn_id": fact.turnId ?? null,
21
- "@event_kind": fact.eventKind,
22
- "@observed_at": fact.observedAt,
23
- "@provider": fact.provider ?? null,
24
- "@model": fact.model ?? null,
25
- "@status": fact.status ?? null,
26
- "@input_tokens": fact.inputTokens ?? null,
27
- "@output_tokens": fact.outputTokens ?? null,
28
- "@cache_read_tokens": fact.cacheReadTokens ?? null,
29
- "@cache_write_tokens": fact.cacheWriteTokens ?? null,
30
- "@duration_ms": fact.durationMs ?? null,
31
- "@ttft_ms": fact.ttftMs ?? null,
32
- "@source": fact.source,
33
- "@quality_json": JSON.stringify(fact.quality ?? {}),
34
- });
35
- return (res.changes ?? 0) > 0
36
- ? { status: "accepted", id: fact.id }
37
- : { status: "duplicate", id: fact.id };
38
- }
39
- catch (e) {
40
- return { status: "failed", error: String(e) };
41
- }
42
- }
43
- export function appendMeasurement(ctx, fact) {
44
- try {
45
- const res = ctx.db
46
- .prepare(`INSERT INTO measurement_samples (
47
- observed_at, sample_kind, provider, model, value, unit,
48
- correlation_id, source, quality_json
49
- ) VALUES (
50
- @observed_at, @sample_kind, @provider, @model, @value, @unit,
51
- @correlation_id, @source, @quality_json
52
- )`)
53
- .run({
54
- "@observed_at": fact.observedAt,
55
- "@sample_kind": fact.sampleKind,
56
- "@provider": fact.provider ?? null,
57
- "@model": fact.model ?? null,
58
- "@value": fact.value,
59
- "@unit": fact.unit,
60
- "@correlation_id": fact.correlationId ?? null,
61
- "@source": fact.source,
62
- "@quality_json": JSON.stringify(fact.quality ?? {}),
63
- });
64
- return { status: "accepted", id: Number(res.lastInsertRowid ?? 0) };
65
- }
66
- catch (e) {
67
- return { status: "failed", error: String(e) };
68
- }
69
- }
70
- export function appendIdentity(ctx, obs) {
71
- try {
72
- const res = ctx.db
73
- .prepare(`INSERT INTO identity_observations (
74
- observed_at, provider, model, source, metadata_json
75
- ) VALUES (
76
- @observed_at, @provider, @model, @source, @metadata_json
77
- )`)
78
- .run({
79
- "@observed_at": obs.observedAt,
80
- "@provider": obs.provider ?? null,
81
- "@model": obs.model ?? null,
82
- "@source": obs.source,
83
- "@metadata_json": JSON.stringify(obs.metadata ?? {}),
84
- });
85
- return { status: "accepted", id: Number(res.lastInsertRowid ?? 0) };
86
- }
87
- catch (e) {
88
- return { status: "failed", error: String(e) };
89
- }
90
- }
@@ -1,79 +0,0 @@
1
- import { openAnalyticsDb, closeAnalyticsDb } from "./connection.js";
2
- import * as read from "./sqlite-store/read.js";
3
- import * as write from "./sqlite-store/write.js";
4
- import * as admin from "./sqlite-store/admin.js";
5
- export class SqliteAnalyticsStore {
6
- db;
7
- stateDir;
8
- opts;
9
- constructor(options) {
10
- this.opts = options;
11
- this.stateDir = options.stateDir;
12
- this.db = openAnalyticsDb(options.stateDir, {
13
- dbPath: options.dbPath,
14
- inMemory: options.inMemory,
15
- });
16
- }
17
- ctx() {
18
- return { db: this.db, stateDir: this.stateDir, opts: this.opts };
19
- }
20
- // ── AnalyticsReader ───────────────────────────────────────────────
21
- status() {
22
- return read.status(this.ctx());
23
- }
24
- // ── AnalyticsWriter ───────────────────────────────────────────────
25
- appendRequestEvent(fact) {
26
- return write.appendRequestEvent(this.ctx(), fact);
27
- }
28
- appendMeasurement(sample) {
29
- return write.appendMeasurement(this.ctx(), sample);
30
- }
31
- appendIdentity(observation) {
32
- return write.appendIdentity(this.ctx(), observation);
33
- }
34
- // ── AnalyticsAdmin ────────────────────────────────────────────────
35
- prune(policy) {
36
- return admin.prune(this.ctx(), policy);
37
- }
38
- vacuum() {
39
- return admin.vacuum(this.ctx());
40
- }
41
- integrityCheck() {
42
- return admin.integrityCheck(this.ctx());
43
- }
44
- backup() {
45
- return admin.backup(this.ctx());
46
- }
47
- clear() {
48
- admin.clear(this.ctx());
49
- }
50
- close() {
51
- closeAnalyticsDb(this.stateDir, {
52
- dbPath: this.opts.dbPath,
53
- inMemory: this.opts.inMemory,
54
- });
55
- }
56
- // ── Capability views ──────────────────────────────────────────────
57
- asReader() {
58
- return {
59
- status: () => this.status(),
60
- };
61
- }
62
- asWriter() {
63
- return {
64
- appendRequestEvent: (f) => this.appendRequestEvent(f),
65
- appendMeasurement: (s) => this.appendMeasurement(s),
66
- appendIdentity: (o) => this.appendIdentity(o),
67
- };
68
- }
69
- asAdmin() {
70
- return {
71
- prune: (p) => this.prune(p),
72
- vacuum: () => this.vacuum(),
73
- integrityCheck: () => this.integrityCheck(),
74
- backup: () => this.backup(),
75
- clear: () => this.clear(),
76
- close: () => this.close(),
77
- };
78
- }
79
- }
@@ -1,17 +0,0 @@
1
- /**
2
- * types.ts — PMA-1 contract module for the Provider/Model Analytics store.
3
- *
4
- * The source of truth. Every implementation (SQLite, in-memory) must satisfy
5
- * these interfaces. SQL schemas are private to implementations.
6
- *
7
- * Design principles (from docs/specs/provider-model-analytics-program.md):
8
- * 1. Contract-first — the interface IS the spec.
9
- * 2. Append-only — AnalyticsWriter.append* are the only write methods; no UPDATE.
10
- * 3. Capability-gated — asReader/asWriter/asAdmin return subset views.
11
- * 4. Host push/store pull — the host supplies facts; the store never initiates.
12
- * 5. Best effort — AppendResult identifies accepted/duplicate/failed without
13
- * throwing into the host; analytics never interrupts the agent loop.
14
- *
15
- * PREVENT-PI-004: zero network. PREVENT-002: no SQL here (private to impls).
16
- */
17
- export {};
@@ -1,2 +0,0 @@
1
- import{j as r}from"./index-DUnKr3wN.js";import{M as t}from"./MetricsCards-Cu1zDkfm.js";import"./card-Cx6WA_2T.js";import"./generateCategoricalChart-DrkPNaOf.js";import"./BarChart-C1F8wLM3.js";import"./AreaChart-BTMI0QnR.js";function e(){return r.jsx(t,{})}export{e as default};
2
- //# sourceMappingURL=MetricsTab-BAvMzWuF.js.map