@selvajs/supabase-provider 0.13.5 → 0.14.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 (31) hide show
  1. package/dist/data/SupabaseDataProvider.d.ts +7 -0
  2. package/dist/data/SupabaseDataProvider.d.ts.map +1 -1
  3. package/dist/data/SupabaseDataProvider.js +8 -0
  4. package/dist/data/SupabaseDataProvider.js.map +1 -1
  5. package/dist/data/SupabaseSolveMetricSink.d.ts +17 -0
  6. package/dist/data/SupabaseSolveMetricSink.d.ts.map +1 -0
  7. package/dist/data/SupabaseSolveMetricSink.js +39 -0
  8. package/dist/data/SupabaseSolveMetricSink.js.map +1 -0
  9. package/dist/data/__tests__/solve-metric-sink-conformance.test.d.ts +2 -0
  10. package/dist/data/__tests__/solve-metric-sink-conformance.test.d.ts.map +1 -0
  11. package/dist/data/__tests__/solve-metric-sink-conformance.test.js +52 -0
  12. package/dist/data/__tests__/solve-metric-sink-conformance.test.js.map +1 -0
  13. package/dist/data/__tests__/test-helpers.d.ts.map +1 -1
  14. package/dist/data/__tests__/test-helpers.js +1 -0
  15. package/dist/data/__tests__/test-helpers.js.map +1 -1
  16. package/dist/data/index.d.ts +1 -0
  17. package/dist/data/index.d.ts.map +1 -1
  18. package/dist/data/index.js +1 -0
  19. package/dist/data/index.js.map +1 -1
  20. package/dist/index.d.ts +1 -1
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +1 -1
  23. package/dist/index.js.map +1 -1
  24. package/package.json +2 -2
  25. package/src/data/SupabaseDataProvider.ts +8 -0
  26. package/src/data/SupabaseSolveMetricSink.ts +38 -0
  27. package/src/data/__tests__/solve-metric-sink-conformance.test.ts +59 -0
  28. package/src/data/__tests__/test-helpers.ts +1 -0
  29. package/src/data/index.ts +1 -0
  30. package/src/index.ts +1 -0
  31. package/supabase/migrations/20260615120000_selva_solve_metrics.sql +56 -0
@@ -1,5 +1,6 @@
1
1
  import type { IDataProvider, IEventSink, IPlatformProjectGrantStore } from '@selvajs/platform';
2
2
  import type { ClientBundle, BuildClientOptions } from './client.js';
3
+ import { SupabaseSolveMetricSink } from './SupabaseSolveMetricSink.js';
3
4
  import { SupabaseAuditQuery } from './SupabaseAuditQuery.js';
4
5
  import { SupabaseOrgStore } from './SupabaseOrgStore.js';
5
6
  import { SupabaseProjectStore } from './SupabaseProjectStore.js';
@@ -26,6 +27,12 @@ export declare class SupabaseDataProvider implements IDataProvider {
26
27
  readonly permissions: SupabasePlatformPermissionStore;
27
28
  readonly platformProjectGrants: IPlatformProjectGrantStore;
28
29
  readonly auditQuery: SupabaseAuditQuery;
30
+ /**
31
+ * Per-solve timing sink, built from the same client bundle. Exposed so the
32
+ * app's provider wiring can hand it to `SelvaConfig.solveMetrics` without
33
+ * constructing a second Supabase client.
34
+ */
35
+ readonly solveMetrics: SupabaseSolveMetricSink;
29
36
  private constructor();
30
37
  static fromEnv(env: Record<string, string | undefined>, events?: IEventSink): SupabaseDataProvider;
31
38
  static create(opts: BuildClientOptions, events?: IEventSink): SupabaseDataProvider;
@@ -1 +1 @@
1
- {"version":3,"file":"SupabaseDataProvider.d.ts","sourceRoot":"","sources":["../../src/data/SupabaseDataProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAE/F,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,+CAA+C,CAAC;AAC5F,OAAO,EAAE,+BAA+B,EAAE,MAAM,mDAAmD,CAAC;AA0BpG;;;;GAIG;AACH,qBAAa,oBAAqB,YAAW,aAAa;IAaxD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAZzB,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,WAAW,EAAE,uBAAuB,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACtC,QAAQ,CAAC,aAAa,EAAE,0BAA0B,CAAC;IACnD,QAAQ,CAAC,UAAU,EAAE,sBAAsB,CAAC;IAC5C,QAAQ,CAAC,WAAW,EAAE,2BAA2B,CAAC;IAClD,QAAQ,CAAC,WAAW,EAAE,+BAA+B,CAAC;IACtD,QAAQ,CAAC,qBAAqB,EAAE,0BAA0B,CAAC;IAC3D,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;IAExC,OAAO;IAgBP,MAAM,CAAC,OAAO,CACb,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,MAAM,CAAC,EAAE,UAAU,GACjB,oBAAoB;IAWvB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,oBAAoB;IAKlF;;;OAGG;IACH,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,oBAAoB;IAIlF;;;OAGG;IACH,eAAe,IAAI,YAAY;IAI/B;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;;;OAIG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAGpC"}
1
+ {"version":3,"file":"SupabaseDataProvider.d.ts","sourceRoot":"","sources":["../../src/data/SupabaseDataProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAE/F,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,+CAA+C,CAAC;AAC5F,OAAO,EAAE,+BAA+B,EAAE,MAAM,mDAAmD,CAAC;AA0BpG;;;;GAIG;AACH,qBAAa,oBAAqB,YAAW,aAAa;IAmBxD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAlBzB,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,WAAW,EAAE,uBAAuB,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACtC,QAAQ,CAAC,aAAa,EAAE,0BAA0B,CAAC;IACnD,QAAQ,CAAC,UAAU,EAAE,sBAAsB,CAAC;IAC5C,QAAQ,CAAC,WAAW,EAAE,2BAA2B,CAAC;IAClD,QAAQ,CAAC,WAAW,EAAE,+BAA+B,CAAC;IACtD,QAAQ,CAAC,qBAAqB,EAAE,0BAA0B,CAAC;IAC3D,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;IACxC;;;;OAIG;IACH,QAAQ,CAAC,YAAY,EAAE,uBAAuB,CAAC;IAE/C,OAAO;IAiBP,MAAM,CAAC,OAAO,CACb,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,MAAM,CAAC,EAAE,UAAU,GACjB,oBAAoB;IAWvB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,oBAAoB;IAKlF;;;OAGG;IACH,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,oBAAoB;IAIlF;;;OAGG;IACH,eAAe,IAAI,YAAY;IAI/B;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;;;OAIG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAGpC"}
@@ -1,6 +1,7 @@
1
1
  import { ProviderError } from '@selvajs/platform';
2
2
  import { buildClientBundle } from './client.js';
3
3
  import { SupabaseEventSink } from './SupabaseEventSink.js';
4
+ import { SupabaseSolveMetricSink } from './SupabaseSolveMetricSink.js';
4
5
  import { SupabaseAuditQuery } from './SupabaseAuditQuery.js';
5
6
  import { SupabaseOrgStore } from './SupabaseOrgStore.js';
6
7
  import { SupabaseProjectStore } from './SupabaseProjectStore.js';
@@ -50,8 +51,15 @@ export class SupabaseDataProvider {
50
51
  permissions;
51
52
  platformProjectGrants;
52
53
  auditQuery;
54
+ /**
55
+ * Per-solve timing sink, built from the same client bundle. Exposed so the
56
+ * app's provider wiring can hand it to `SelvaConfig.solveMetrics` without
57
+ * constructing a second Supabase client.
58
+ */
59
+ solveMetrics;
53
60
  constructor(clients, events) {
54
61
  this.clients = clients;
62
+ this.solveMetrics = new SupabaseSolveMetricSink(clients);
55
63
  this.orgs = new SupabaseOrgStore(clients, events);
56
64
  this.projects = new SupabaseProjectStore(clients, events);
57
65
  this.definitions = new SupabaseDefinitionStore(clients, events);
@@ -1 +1 @@
1
- {"version":3,"file":"SupabaseDataProvider.js","sourceRoot":"","sources":["../../src/data/SupabaseDataProvider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SupabaseDataProvider.js","sourceRoot":"","sources":["../../src/data/SupabaseDataProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { ISolveMetricSink, RequestContext, SolveMetric } from '@selvajs/platform';
2
+ import type { ClientBundle } from './client.js';
3
+ /**
4
+ * Persists every solve's timing to `selva.solve_metrics`. Writes use the
5
+ * service-role client so RLS does not gate the telemetry — the sink runs as a
6
+ * system process attached to the compute route, not the requesting user.
7
+ *
8
+ * Per the `ISolveMetricSink` contract, `record` MUST NOT throw. It sits on the
9
+ * hot path of every solve and the response has already been produced by the
10
+ * time we're here, so a failed insert is logged and swallowed.
11
+ */
12
+ export declare class SupabaseSolveMetricSink implements ISolveMetricSink {
13
+ private readonly clients;
14
+ constructor(clients: ClientBundle);
15
+ record(_ctx: RequestContext, metric: SolveMetric): Promise<void>;
16
+ }
17
+ //# sourceMappingURL=SupabaseSolveMetricSink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SupabaseSolveMetricSink.d.ts","sourceRoot":"","sources":["../../src/data/SupabaseSolveMetricSink.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACvF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD;;;;;;;;GAQG;AACH,qBAAa,uBAAwB,YAAW,gBAAgB;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,YAAY;IAE5C,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CAsBtE"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Persists every solve's timing to `selva.solve_metrics`. Writes use the
3
+ * service-role client so RLS does not gate the telemetry — the sink runs as a
4
+ * system process attached to the compute route, not the requesting user.
5
+ *
6
+ * Per the `ISolveMetricSink` contract, `record` MUST NOT throw. It sits on the
7
+ * hot path of every solve and the response has already been produced by the
8
+ * time we're here, so a failed insert is logged and swallowed.
9
+ */
10
+ export class SupabaseSolveMetricSink {
11
+ clients;
12
+ constructor(clients) {
13
+ this.clients = clients;
14
+ }
15
+ async record(_ctx, metric) {
16
+ try {
17
+ const { error } = await this.clients.serviceClient.from('solve_metrics').insert({
18
+ actor_id: _ctx.userId || 'system',
19
+ definition_url: metric.definitionUrl,
20
+ definition_id: metric.definitionId,
21
+ version_id: metric.versionId,
22
+ channel: metric.channel,
23
+ org_id: metric.orgId,
24
+ duration_ms: metric.durationMs,
25
+ ok: metric.ok,
26
+ failure_kind: metric.failureKind,
27
+ error_count: metric.errorCount,
28
+ warning_count: metric.warningCount
29
+ });
30
+ if (error) {
31
+ console.error('[SupabaseSolveMetricSink] insert failed:', error.message, { metric });
32
+ }
33
+ }
34
+ catch (err) {
35
+ console.error('[SupabaseSolveMetricSink] unexpected error:', err, { metric });
36
+ }
37
+ }
38
+ }
39
+ //# sourceMappingURL=SupabaseSolveMetricSink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SupabaseSolveMetricSink.js","sourceRoot":"","sources":["../../src/data/SupabaseSolveMetricSink.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AACH,MAAM,OAAO,uBAAuB;IACN;IAA7B,YAA6B,OAAqB;QAArB,YAAO,GAAP,OAAO,CAAc;IAAG,CAAC;IAEtD,KAAK,CAAC,MAAM,CAAC,IAAoB,EAAE,MAAmB;QACrD,IAAI,CAAC;YACJ,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC;gBAC/E,QAAQ,EAAE,IAAI,CAAC,MAAM,IAAI,QAAQ;gBACjC,cAAc,EAAE,MAAM,CAAC,aAAa;gBACpC,aAAa,EAAE,MAAM,CAAC,YAAY;gBAClC,UAAU,EAAE,MAAM,CAAC,SAAS;gBAC5B,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,MAAM,EAAE,MAAM,CAAC,KAAK;gBACpB,WAAW,EAAE,MAAM,CAAC,UAAU;gBAC9B,EAAE,EAAE,MAAM,CAAC,EAAE;gBACb,YAAY,EAAE,MAAM,CAAC,WAAW;gBAChC,WAAW,EAAE,MAAM,CAAC,UAAU;gBAC9B,aAAa,EAAE,MAAM,CAAC,YAAY;aAClC,CAAC,CAAC;YACH,IAAI,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YACtF,CAAC;QACF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,CAAC,6CAA6C,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/E,CAAC;IACF,CAAC;CACD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=solve-metric-sink-conformance.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solve-metric-sink-conformance.test.d.ts","sourceRoot":"","sources":["../../../src/data/__tests__/solve-metric-sink-conformance.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,52 @@
1
+ import { describe, beforeEach, it } from 'vitest';
2
+ import { runSolveMetricSinkConformance } from '@selvajs/platform/testing';
3
+ import { SupabaseSolveMetricSink } from '../SupabaseSolveMetricSink.js';
4
+ import { buildClientBundle } from '../client.js';
5
+ import { readEnv, resetAllData } from './test-helpers.js';
6
+ const envCtx = readEnv();
7
+ if (!envCtx) {
8
+ describe.skip('SupabaseSolveMetricSink (skipped: no live stack)', () => {
9
+ it('populate packages/providers/supabase/.env.test with Supabase creds to run these tests', () => { });
10
+ });
11
+ }
12
+ else {
13
+ const ctx = envCtx;
14
+ describe('SupabaseSolveMetricSink', () => {
15
+ beforeEach(async () => {
16
+ await resetAllData(ctx);
17
+ });
18
+ runSolveMetricSinkConformance({
19
+ name: 'SupabaseSolveMetricSink',
20
+ createSink: () => new SupabaseSolveMetricSink(ctx.bundle),
21
+ readRows: async () => {
22
+ const { data, error } = await ctx.adminClient
23
+ .from('solve_metrics')
24
+ .select('actor_id, definition_url, definition_id, version_id, channel, org_id, duration_ms, ok, failure_kind, error_count, warning_count')
25
+ .order('occurred_at', { ascending: true });
26
+ if (error)
27
+ throw new Error(`solve_metrics read failed: ${error.message}`);
28
+ return (data ?? []).map((r) => ({
29
+ actorId: r.actor_id,
30
+ definitionUrl: r.definition_url,
31
+ definitionId: r.definition_id,
32
+ versionId: r.version_id,
33
+ channel: r.channel,
34
+ orgId: r.org_id,
35
+ durationMs: r.duration_ms,
36
+ ok: r.ok,
37
+ failureKind: r.failure_kind,
38
+ errorCount: r.error_count,
39
+ warningCount: r.warning_count
40
+ }));
41
+ },
42
+ // Point the sink at a bundle whose service key is bogus, so the insert
43
+ // fails. record() must still resolve (contract: never throw).
44
+ createFailingSink: () => new SupabaseSolveMetricSink(buildClientBundle({
45
+ supabaseUrl: ctx.url,
46
+ anonKey: ctx.anonKey,
47
+ serviceRoleKey: 'invalid-service-role-key'
48
+ }))
49
+ });
50
+ });
51
+ }
52
+ //# sourceMappingURL=solve-metric-sink-conformance.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solve-metric-sink-conformance.test.js","sourceRoot":"","sources":["../../../src/data/__tests__/solve-metric-sink-conformance.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,6BAA6B,EAA4B,MAAM,2BAA2B,CAAC;AACpG,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE1D,MAAM,MAAM,GAAG,OAAO,EAAE,CAAC;AAEzB,IAAI,CAAC,MAAM,EAAE,CAAC;IACb,QAAQ,CAAC,IAAI,CAAC,kDAAkD,EAAE,GAAG,EAAE;QACtE,EAAE,CAAC,uFAAuF,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACvG,CAAC,CAAC,CAAC;AACJ,CAAC;KAAM,CAAC;IACP,MAAM,GAAG,GAAG,MAAM,CAAC;IACnB,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACxC,UAAU,CAAC,KAAK,IAAI,EAAE;YACrB,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,6BAA6B,CAAC;YAC7B,IAAI,EAAE,yBAAyB;YAC/B,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,uBAAuB,CAAC,GAAG,CAAC,MAAM,CAAC;YACzD,QAAQ,EAAE,KAAK,IAAI,EAAE;gBACpB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,GAAG,CAAC,WAAW;qBAC3C,IAAI,CAAC,eAAe,CAAC;qBACrB,MAAM,CACN,iIAAiI,CACjI;qBACA,KAAK,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC5C,IAAI,KAAK;oBAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC1E,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CACtB,CAAC,CAAC,EAAuB,EAAE,CAAC,CAAC;oBAC5B,OAAO,EAAE,CAAC,CAAC,QAAQ;oBACnB,aAAa,EAAE,CAAC,CAAC,cAAc;oBAC/B,YAAY,EAAE,CAAC,CAAC,aAAa;oBAC7B,SAAS,EAAE,CAAC,CAAC,UAAU;oBACvB,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,KAAK,EAAE,CAAC,CAAC,MAAM;oBACf,UAAU,EAAE,CAAC,CAAC,WAAW;oBACzB,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,WAAW,EAAE,CAAC,CAAC,YAAY;oBAC3B,UAAU,EAAE,CAAC,CAAC,WAAW;oBACzB,YAAY,EAAE,CAAC,CAAC,aAAa;iBAC7B,CAAC,CACF,CAAC;YACH,CAAC;YACD,uEAAuE;YACvE,8DAA8D;YAC9D,iBAAiB,EAAE,GAAG,EAAE,CACvB,IAAI,uBAAuB,CAC1B,iBAAiB,CAAC;gBACjB,WAAW,EAAE,GAAG,CAAC,GAAG;gBACpB,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,cAAc,EAAE,0BAA0B;aAC1C,CAAC,CACF;SACF,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"test-helpers.d.ts","sourceRoot":"","sources":["../../../src/data/__tests__/test-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAqB,KAAK,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAE5F,MAAM,WAAW,WAAW;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,iBAAiB,CAAC;IAC/B,MAAM,EAAE,YAAY,CAAC;CACrB;AAED,wBAAgB,OAAO,IAAI,WAAW,GAAG,IAAI,CAuB5C;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBlE;AAuCD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,QAAQ,CAC7B,GAAG,EAAE,WAAW,EAChB,WAAW,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAEnD;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAClC,GAAG,EAAE,WAAW,EAChB,WAAW,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAEnD"}
1
+ {"version":3,"file":"test-helpers.d.ts","sourceRoot":"","sources":["../../../src/data/__tests__/test-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAqB,KAAK,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAE5F,MAAM,WAAW,WAAW;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,iBAAiB,CAAC;IAC/B,MAAM,EAAE,YAAY,CAAC;CACrB;AAED,wBAAgB,OAAO,IAAI,WAAW,GAAG,IAAI,CAuB5C;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBlE;AAuCD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,QAAQ,CAC7B,GAAG,EAAE,WAAW,EAChB,WAAW,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAEnD;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAClC,GAAG,EAAE,WAAW,EAChB,WAAW,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAEnD"}
@@ -42,6 +42,7 @@ export function readEnv() {
42
42
  * dependents to parents.
43
43
  */
44
44
  export async function resetAllData(ctx) {
45
+ await truncate(ctx, 'solve_metrics');
45
46
  await truncate(ctx, 'share_links');
46
47
  await truncate(ctx, 'invites');
47
48
  // Versions FK to definitions ON DELETE CASCADE, but `definitions` can't
@@ -1 +1 @@
1
- {"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../../../src/data/__tests__/test-helpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../../../src/data/__tests__/test-helpers.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@ export { SupabaseComputeServerStore } from './SupabaseComputeServerStore.js';
6
6
  export { SupabaseShareLinkStore } from './SupabaseShareLinkStore.js';
7
7
  export { SupabaseDataProvider } from './SupabaseDataProvider.js';
8
8
  export { SupabaseEventSink } from './SupabaseEventSink.js';
9
+ export { SupabaseSolveMetricSink } from './SupabaseSolveMetricSink.js';
9
10
  export { SupabaseAuditQuery } from './SupabaseAuditQuery.js';
10
11
  export { buildClientBundle } from './client.js';
11
12
  export type { ClientBundle, BuildClientOptions } from './client.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/data/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/data/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC"}
@@ -6,6 +6,7 @@ export { SupabaseComputeServerStore } from './SupabaseComputeServerStore.js';
6
6
  export { SupabaseShareLinkStore } from './SupabaseShareLinkStore.js';
7
7
  export { SupabaseDataProvider } from './SupabaseDataProvider.js';
8
8
  export { SupabaseEventSink } from './SupabaseEventSink.js';
9
+ export { SupabaseSolveMetricSink } from './SupabaseSolveMetricSink.js';
9
10
  export { SupabaseAuditQuery } from './SupabaseAuditQuery.js';
10
11
  export { buildClientBundle } from './client.js';
11
12
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/data/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/data/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { SupabaseStorageProvider } from './storage/SupabaseStorageProvider.js';
2
2
  export type { SupabaseStorageProviderConfig } from './storage/SupabaseStorageProvider.js';
3
- export { SupabaseOrgStore, SupabaseProjectStore, SupabaseDefinitionStore, SupabaseInviteStore, SupabaseComputeServerStore, SupabaseShareLinkStore, SupabaseDataProvider, SupabaseEventSink, SupabaseAuditQuery, buildClientBundle } from './data/index.js';
3
+ export { SupabaseOrgStore, SupabaseProjectStore, SupabaseDefinitionStore, SupabaseInviteStore, SupabaseComputeServerStore, SupabaseShareLinkStore, SupabaseDataProvider, SupabaseEventSink, SupabaseSolveMetricSink, SupabaseAuditQuery, buildClientBundle } from './data/index.js';
4
4
  export type { ClientBundle, BuildClientOptions } from './data/index.js';
5
5
  export { SupabaseUserProfileProvider } from './userProfile/index.js';
6
6
  export { SupabaseAuthProvider } from './auth/index.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,YAAY,EAAE,6BAA6B,EAAE,MAAM,sCAAsC,CAAC;AAE1F,OAAO,EACN,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,0BAA0B,EAC1B,sBAAsB,EACtB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAExE,OAAO,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAErE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,YAAY,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAElE,OAAO,EAAE,+BAA+B,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,YAAY,EAAE,6BAA6B,EAAE,MAAM,sCAAsC,CAAC;AAE1F,OAAO,EACN,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,0BAA0B,EAC1B,sBAAsB,EACtB,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAClB,iBAAiB,EACjB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAExE,OAAO,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAErE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,YAAY,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAElE,OAAO,EAAE,+BAA+B,EAAE,MAAM,wBAAwB,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  export { SupabaseStorageProvider } from './storage/SupabaseStorageProvider.js';
2
- export { SupabaseOrgStore, SupabaseProjectStore, SupabaseDefinitionStore, SupabaseInviteStore, SupabaseComputeServerStore, SupabaseShareLinkStore, SupabaseDataProvider, SupabaseEventSink, SupabaseAuditQuery, buildClientBundle } from './data/index.js';
2
+ export { SupabaseOrgStore, SupabaseProjectStore, SupabaseDefinitionStore, SupabaseInviteStore, SupabaseComputeServerStore, SupabaseShareLinkStore, SupabaseDataProvider, SupabaseEventSink, SupabaseSolveMetricSink, SupabaseAuditQuery, buildClientBundle } from './data/index.js';
3
3
  export { SupabaseUserProfileProvider } from './userProfile/index.js';
4
4
  export { SupabaseAuthProvider } from './auth/index.js';
5
5
  export { SupabasePlatformPermissionStore } from './permissions/index.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAG/E,OAAO,EACN,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,0BAA0B,EAC1B,sBAAsB,EACtB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAErE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAGvD,OAAO,EAAE,+BAA+B,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAG/E,OAAO,EACN,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,0BAA0B,EAC1B,sBAAsB,EACtB,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAClB,iBAAiB,EACjB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAErE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAGvD,OAAO,EAAE,+BAA+B,EAAE,MAAM,wBAAwB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@selvajs/supabase-provider",
3
- "version": "0.13.5",
3
+ "version": "0.14.0",
4
4
  "description": "Supabase (Auth + Postgres + Storage) implementations of @selvajs/platform interfaces",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
@@ -57,7 +57,7 @@
57
57
  "dependencies": {
58
58
  "@supabase/supabase-js": "^2.104.1",
59
59
  "sharp": "^0.34.5",
60
- "@selvajs/platform": "0.13.0"
60
+ "@selvajs/platform": "0.14.0"
61
61
  },
62
62
  "devDependencies": {
63
63
  "@types/node": "^22.19.17",
@@ -3,6 +3,7 @@ import { ProviderError } from '@selvajs/platform';
3
3
  import type { ClientBundle, BuildClientOptions } from './client.js';
4
4
  import { buildClientBundle } from './client.js';
5
5
  import { SupabaseEventSink } from './SupabaseEventSink.js';
6
+ import { SupabaseSolveMetricSink } from './SupabaseSolveMetricSink.js';
6
7
  import { SupabaseAuditQuery } from './SupabaseAuditQuery.js';
7
8
  import { SupabaseOrgStore } from './SupabaseOrgStore.js';
8
9
  import { SupabaseProjectStore } from './SupabaseProjectStore.js';
@@ -53,11 +54,18 @@ export class SupabaseDataProvider implements IDataProvider {
53
54
  readonly permissions: SupabasePlatformPermissionStore;
54
55
  readonly platformProjectGrants: IPlatformProjectGrantStore;
55
56
  readonly auditQuery: SupabaseAuditQuery;
57
+ /**
58
+ * Per-solve timing sink, built from the same client bundle. Exposed so the
59
+ * app's provider wiring can hand it to `SelvaConfig.solveMetrics` without
60
+ * constructing a second Supabase client.
61
+ */
62
+ readonly solveMetrics: SupabaseSolveMetricSink;
56
63
 
57
64
  private constructor(
58
65
  private readonly clients: ClientBundle,
59
66
  events: IEventSink
60
67
  ) {
68
+ this.solveMetrics = new SupabaseSolveMetricSink(clients);
61
69
  this.orgs = new SupabaseOrgStore(clients, events);
62
70
  this.projects = new SupabaseProjectStore(clients, events);
63
71
  this.definitions = new SupabaseDefinitionStore(clients, events);
@@ -0,0 +1,38 @@
1
+ import type { ISolveMetricSink, RequestContext, SolveMetric } from '@selvajs/platform';
2
+ import type { ClientBundle } from './client.js';
3
+
4
+ /**
5
+ * Persists every solve's timing to `selva.solve_metrics`. Writes use the
6
+ * service-role client so RLS does not gate the telemetry — the sink runs as a
7
+ * system process attached to the compute route, not the requesting user.
8
+ *
9
+ * Per the `ISolveMetricSink` contract, `record` MUST NOT throw. It sits on the
10
+ * hot path of every solve and the response has already been produced by the
11
+ * time we're here, so a failed insert is logged and swallowed.
12
+ */
13
+ export class SupabaseSolveMetricSink implements ISolveMetricSink {
14
+ constructor(private readonly clients: ClientBundle) {}
15
+
16
+ async record(_ctx: RequestContext, metric: SolveMetric): Promise<void> {
17
+ try {
18
+ const { error } = await this.clients.serviceClient.from('solve_metrics').insert({
19
+ actor_id: _ctx.userId || 'system',
20
+ definition_url: metric.definitionUrl,
21
+ definition_id: metric.definitionId,
22
+ version_id: metric.versionId,
23
+ channel: metric.channel,
24
+ org_id: metric.orgId,
25
+ duration_ms: metric.durationMs,
26
+ ok: metric.ok,
27
+ failure_kind: metric.failureKind,
28
+ error_count: metric.errorCount,
29
+ warning_count: metric.warningCount
30
+ });
31
+ if (error) {
32
+ console.error('[SupabaseSolveMetricSink] insert failed:', error.message, { metric });
33
+ }
34
+ } catch (err) {
35
+ console.error('[SupabaseSolveMetricSink] unexpected error:', err, { metric });
36
+ }
37
+ }
38
+ }
@@ -0,0 +1,59 @@
1
+ import { describe, beforeEach, it } from 'vitest';
2
+ import { runSolveMetricSinkConformance, type RecordedSolveMetric } from '@selvajs/platform/testing';
3
+ import { SupabaseSolveMetricSink } from '../SupabaseSolveMetricSink.js';
4
+ import { buildClientBundle } from '../client.js';
5
+ import { readEnv, resetAllData } from './test-helpers.js';
6
+
7
+ const envCtx = readEnv();
8
+
9
+ if (!envCtx) {
10
+ describe.skip('SupabaseSolveMetricSink (skipped: no live stack)', () => {
11
+ it('populate packages/providers/supabase/.env.test with Supabase creds to run these tests', () => {});
12
+ });
13
+ } else {
14
+ const ctx = envCtx;
15
+ describe('SupabaseSolveMetricSink', () => {
16
+ beforeEach(async () => {
17
+ await resetAllData(ctx);
18
+ });
19
+
20
+ runSolveMetricSinkConformance({
21
+ name: 'SupabaseSolveMetricSink',
22
+ createSink: () => new SupabaseSolveMetricSink(ctx.bundle),
23
+ readRows: async () => {
24
+ const { data, error } = await ctx.adminClient
25
+ .from('solve_metrics')
26
+ .select(
27
+ 'actor_id, definition_url, definition_id, version_id, channel, org_id, duration_ms, ok, failure_kind, error_count, warning_count'
28
+ )
29
+ .order('occurred_at', { ascending: true });
30
+ if (error) throw new Error(`solve_metrics read failed: ${error.message}`);
31
+ return (data ?? []).map(
32
+ (r): RecordedSolveMetric => ({
33
+ actorId: r.actor_id,
34
+ definitionUrl: r.definition_url,
35
+ definitionId: r.definition_id,
36
+ versionId: r.version_id,
37
+ channel: r.channel,
38
+ orgId: r.org_id,
39
+ durationMs: r.duration_ms,
40
+ ok: r.ok,
41
+ failureKind: r.failure_kind,
42
+ errorCount: r.error_count,
43
+ warningCount: r.warning_count
44
+ })
45
+ );
46
+ },
47
+ // Point the sink at a bundle whose service key is bogus, so the insert
48
+ // fails. record() must still resolve (contract: never throw).
49
+ createFailingSink: () =>
50
+ new SupabaseSolveMetricSink(
51
+ buildClientBundle({
52
+ supabaseUrl: ctx.url,
53
+ anonKey: ctx.anonKey,
54
+ serviceRoleKey: 'invalid-service-role-key'
55
+ })
56
+ )
57
+ });
58
+ });
59
+ }
@@ -50,6 +50,7 @@ export function readEnv(): TestContext | null {
50
50
  * dependents to parents.
51
51
  */
52
52
  export async function resetAllData(ctx: TestContext): Promise<void> {
53
+ await truncate(ctx, 'solve_metrics');
53
54
  await truncate(ctx, 'share_links');
54
55
  await truncate(ctx, 'invites');
55
56
  // Versions FK to definitions ON DELETE CASCADE, but `definitions` can't
package/src/data/index.ts CHANGED
@@ -6,6 +6,7 @@ export { SupabaseComputeServerStore } from './SupabaseComputeServerStore.js';
6
6
  export { SupabaseShareLinkStore } from './SupabaseShareLinkStore.js';
7
7
  export { SupabaseDataProvider } from './SupabaseDataProvider.js';
8
8
  export { SupabaseEventSink } from './SupabaseEventSink.js';
9
+ export { SupabaseSolveMetricSink } from './SupabaseSolveMetricSink.js';
9
10
  export { SupabaseAuditQuery } from './SupabaseAuditQuery.js';
10
11
  export { buildClientBundle } from './client.js';
11
12
  export type { ClientBundle, BuildClientOptions } from './client.js';
package/src/index.ts CHANGED
@@ -10,6 +10,7 @@ export {
10
10
  SupabaseShareLinkStore,
11
11
  SupabaseDataProvider,
12
12
  SupabaseEventSink,
13
+ SupabaseSolveMetricSink,
13
14
  SupabaseAuditQuery,
14
15
  buildClientBundle
15
16
  } from './data/index.js';
@@ -0,0 +1,56 @@
1
+ -- ============================================================================
2
+ -- solve_metrics
3
+ -- Per-solve timing telemetry. One row per solve attempt, written by
4
+ -- `SupabaseSolveMetricSink` from the compute route AFTER each solve resolves
5
+ -- or rejects. `duration_ms` is wall time around the Rhino.Compute solve call
6
+ -- only — it excludes definition loading, auth, schema work, and serialization.
7
+ --
8
+ -- Append-only from the application's point of view: the sink inserts, nothing
9
+ -- updates or deletes. Failed/timed-out solves are recorded with ok = false.
10
+ -- ============================================================================
11
+
12
+ create table if not exists selva.solve_metrics (
13
+ id uuid primary key default gen_random_uuid(),
14
+ -- The user who triggered the solve, or 'system' for share-link / server flows.
15
+ actor_id text not null,
16
+ definition_url text not null,
17
+ -- Local definition + the exact version solved; null for remote-URL solves.
18
+ -- Plain ids (not FKs) so a deleted definition does not cascade away its history.
19
+ definition_id uuid,
20
+ version_id uuid,
21
+ channel text not null,
22
+ org_id uuid,
23
+ duration_ms double precision not null,
24
+ ok boolean not null,
25
+ -- Why the solve did not return a result; 'ok' when it did. Mirrors
26
+ -- SolveFailureKind: ok | timeout | client_abort | rate_limited | share_cap |
27
+ -- too_large | compute_error.
28
+ failure_kind text not null default 'ok',
29
+ -- Grasshopper runtime error/warning counts from the solve response. A solve
30
+ -- can be ok yet still report component errors (error_count > 0).
31
+ error_count integer not null default 0,
32
+ warning_count integer not null default 0,
33
+ occurred_at timestamptz not null default now()
34
+ );
35
+
36
+ create index if not exists solve_metrics_occurred_at_idx
37
+ on selva.solve_metrics (occurred_at desc);
38
+
39
+ create index if not exists solve_metrics_org_occurred_at_idx
40
+ on selva.solve_metrics (org_id, occurred_at desc);
41
+
42
+ create index if not exists solve_metrics_definition_occurred_at_idx
43
+ on selva.solve_metrics (definition_url, occurred_at desc);
44
+
45
+ -- Per-version timing comparisons ("is this version slower than the last?").
46
+ create index if not exists solve_metrics_version_occurred_at_idx
47
+ on selva.solve_metrics (version_id, occurred_at desc);
48
+
49
+ -- Filter failures fast for error-rate dashboards.
50
+ create index if not exists solve_metrics_failure_kind_idx
51
+ on selva.solve_metrics (failure_kind, occurred_at desc);
52
+
53
+ -- RLS: writes always go through service-role (the sink uses the service
54
+ -- client). Authenticated users have NO read access today — an operator-facing
55
+ -- metrics UI would land later with its own instance_admin-only policy.
56
+ alter table selva.solve_metrics enable row level security;