@contractspec/lib.evolution 1.57.0 → 1.58.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 (41) hide show
  1. package/dist/analyzer/posthog-telemetry-reader.d.ts +20 -0
  2. package/dist/analyzer/posthog-telemetry-reader.d.ts.map +1 -0
  3. package/dist/analyzer/spec-analyzer.d.ts +31 -0
  4. package/dist/analyzer/spec-analyzer.d.ts.map +1 -0
  5. package/dist/approval/integration.d.ts +39 -0
  6. package/dist/approval/integration.d.ts.map +1 -0
  7. package/dist/generator/ai-spec-generator.d.ts +51 -0
  8. package/dist/generator/ai-spec-generator.d.ts.map +1 -0
  9. package/dist/generator/spec-generator.d.ts +42 -0
  10. package/dist/generator/spec-generator.d.ts.map +1 -0
  11. package/dist/index.d.ts +7 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +1069 -0
  14. package/dist/node/index.js +1068 -0
  15. package/dist/types.d.ts +128 -0
  16. package/dist/types.d.ts.map +1 -0
  17. package/package.json +23 -19
  18. package/dist/analyzer/posthog-telemetry-reader.d.mts +0 -24
  19. package/dist/analyzer/posthog-telemetry-reader.d.mts.map +0 -1
  20. package/dist/analyzer/posthog-telemetry-reader.mjs +0 -225
  21. package/dist/analyzer/posthog-telemetry-reader.mjs.map +0 -1
  22. package/dist/analyzer/spec-analyzer.d.mts +0 -35
  23. package/dist/analyzer/spec-analyzer.d.mts.map +0 -1
  24. package/dist/analyzer/spec-analyzer.mjs +0 -305
  25. package/dist/analyzer/spec-analyzer.mjs.map +0 -1
  26. package/dist/approval/integration.d.mts +0 -43
  27. package/dist/approval/integration.d.mts.map +0 -1
  28. package/dist/approval/integration.mjs +0 -126
  29. package/dist/approval/integration.mjs.map +0 -1
  30. package/dist/generator/ai-spec-generator.d.mts +0 -55
  31. package/dist/generator/ai-spec-generator.d.mts.map +0 -1
  32. package/dist/generator/ai-spec-generator.mjs +0 -186
  33. package/dist/generator/ai-spec-generator.mjs.map +0 -1
  34. package/dist/generator/spec-generator.d.mts +0 -46
  35. package/dist/generator/spec-generator.d.mts.map +0 -1
  36. package/dist/generator/spec-generator.mjs +0 -121
  37. package/dist/generator/spec-generator.mjs.map +0 -1
  38. package/dist/index.d.mts +0 -7
  39. package/dist/index.mjs +0 -7
  40. package/dist/types.d.mts +0 -132
  41. package/dist/types.d.mts.map +0 -1
@@ -0,0 +1,128 @@
1
+ import type { OperationSpec, OpKind, ResourceRefDescriptor } from '@contractspec/lib.contracts';
2
+ import type { AnySchemaModel } from '@contractspec/lib.schema';
3
+ import type { LifecycleStage } from '@contractspec/lib.lifecycle';
4
+ export type AnomalySeverity = 'low' | 'medium' | 'high';
5
+ export type SuggestionStatus = 'pending' | 'approved' | 'rejected';
6
+ export interface OperationCoordinate {
7
+ key: string;
8
+ version: string;
9
+ tenantId?: string;
10
+ }
11
+ export interface OperationMetricSample {
12
+ operation: OperationCoordinate;
13
+ durationMs: number;
14
+ success: boolean;
15
+ timestamp: Date;
16
+ payloadSizeBytes?: number;
17
+ errorCode?: string;
18
+ errorMessage?: string;
19
+ actor?: string;
20
+ channel?: string;
21
+ traceId?: string;
22
+ metadata?: Record<string, unknown>;
23
+ }
24
+ export interface SpecUsageStats {
25
+ operation: OperationCoordinate;
26
+ totalCalls: number;
27
+ successRate: number;
28
+ errorRate: number;
29
+ averageLatencyMs: number;
30
+ p95LatencyMs: number;
31
+ p99LatencyMs: number;
32
+ maxLatencyMs: number;
33
+ lastSeenAt: Date;
34
+ windowStart: Date;
35
+ windowEnd: Date;
36
+ topErrors: Record<string, number>;
37
+ }
38
+ export interface SuggestionEvidence {
39
+ type: 'telemetry' | 'user-feedback' | 'simulation' | 'test';
40
+ description: string;
41
+ data?: Record<string, unknown>;
42
+ }
43
+ export interface SpecAnomaly {
44
+ operation: OperationCoordinate;
45
+ severity: AnomalySeverity;
46
+ metric: 'latency' | 'error-rate' | 'throughput' | 'policy' | 'schema';
47
+ description: string;
48
+ detectedAt: Date;
49
+ threshold?: number;
50
+ observedValue?: number;
51
+ evidence: SuggestionEvidence[];
52
+ }
53
+ export interface PatternConfidence {
54
+ score: number;
55
+ sampleSize: number;
56
+ pValue?: number;
57
+ }
58
+ export interface IntentPattern {
59
+ id: string;
60
+ type: 'latency-regression' | 'error-spike' | 'missing-operation' | 'chained-intent' | 'throughput-drop' | 'schema-mismatch';
61
+ description: string;
62
+ operation?: OperationCoordinate;
63
+ confidence: PatternConfidence;
64
+ metadata?: Record<string, unknown>;
65
+ evidence: SuggestionEvidence[];
66
+ }
67
+ export interface SpecSuggestionProposal {
68
+ summary: string;
69
+ rationale: string;
70
+ changeType: 'new-spec' | 'revision' | 'policy-update' | 'schema-update';
71
+ kind?: OpKind;
72
+ spec?: OperationSpec<AnySchemaModel, AnySchemaModel | ResourceRefDescriptor<boolean>>;
73
+ diff?: string;
74
+ metadata?: Record<string, unknown>;
75
+ }
76
+ export interface SpecSuggestion {
77
+ id: string;
78
+ intent: IntentPattern;
79
+ target?: OperationCoordinate;
80
+ proposal: SpecSuggestionProposal;
81
+ confidence: number;
82
+ createdAt: Date;
83
+ createdBy: string;
84
+ status: SuggestionStatus;
85
+ evidence: SuggestionEvidence[];
86
+ priority: 'low' | 'medium' | 'high';
87
+ tags?: string[];
88
+ approvals?: {
89
+ reviewer?: string;
90
+ notes?: string;
91
+ decidedAt?: Date;
92
+ status?: SuggestionStatus;
93
+ };
94
+ }
95
+ export interface EvolutionConfig {
96
+ minConfidence?: number;
97
+ autoApproveThreshold?: number;
98
+ maxSuggestionsPerOperation?: number;
99
+ requireApproval?: boolean;
100
+ maxConcurrentExperiments?: number;
101
+ }
102
+ export interface SpecSuggestionFilters {
103
+ status?: SuggestionStatus;
104
+ operationKey?: string;
105
+ }
106
+ export interface SpecSuggestionRepository {
107
+ create(suggestion: SpecSuggestion): Promise<void>;
108
+ getById(id: string): Promise<SpecSuggestion | undefined>;
109
+ updateStatus(id: string, status: SuggestionStatus, metadata?: {
110
+ reviewer?: string;
111
+ notes?: string;
112
+ decidedAt?: Date;
113
+ }): Promise<void>;
114
+ list(filters?: SpecSuggestionFilters): Promise<SpecSuggestion[]>;
115
+ }
116
+ export interface SpecSuggestionWriter {
117
+ write(suggestion: SpecSuggestion): Promise<string>;
118
+ }
119
+ export interface OptimizationHint {
120
+ operation: OperationCoordinate;
121
+ category: 'schema' | 'policy' | 'performance' | 'error-handling';
122
+ summary: string;
123
+ justification: string;
124
+ recommendedActions: string[];
125
+ lifecycleStage?: LifecycleStage;
126
+ lifecycleNotes?: string;
127
+ }
128
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contractspec/lib.evolution",
3
- "version": "1.57.0",
3
+ "version": "1.58.0",
4
4
  "description": "AI-powered contract evolution engine",
5
5
  "keywords": [
6
6
  "contractspec",
@@ -18,43 +18,47 @@
18
18
  "scripts": {
19
19
  "publish:pkg": "bun publish --tolerate-republish --ignore-scripts --verbose",
20
20
  "publish:pkg:canary": "bun publish:pkg --tag canary",
21
- "build": "bun build:types && bun build:bundle",
22
- "build:bundle": "tsdown",
23
- "build:types": "tsc --noEmit",
24
- "dev": "bun build:bundle --watch",
21
+ "build": "bun run prebuild && bun run build:bundle && bun run build:types",
22
+ "build:bundle": "contractspec-bun-build transpile",
23
+ "build:types": "contractspec-bun-build types",
24
+ "dev": "contractspec-bun-build dev",
25
25
  "clean": "rimraf dist .turbo",
26
26
  "lint": "bun lint:fix",
27
27
  "lint:fix": "eslint src --fix",
28
28
  "lint:check": "eslint src",
29
- "test": "bun test"
29
+ "test": "bun test",
30
+ "prebuild": "contractspec-bun-build prebuild",
31
+ "typecheck": "tsc --noEmit"
30
32
  },
31
33
  "dependencies": {
32
34
  "ai": "6.0.73",
33
35
  "zod": "^4.3.5",
34
- "@contractspec/lib.ai-agent": "1.57.0",
35
- "@contractspec/lib.contracts": "1.57.0",
36
- "@contractspec/lib.lifecycle": "1.57.0",
37
- "@contractspec/lib.observability": "1.57.0",
38
- "@contractspec/lib.schema": "1.57.0"
36
+ "@contractspec/lib.ai-agent": "1.58.0",
37
+ "@contractspec/lib.contracts": "1.58.0",
38
+ "@contractspec/lib.lifecycle": "1.58.0",
39
+ "@contractspec/lib.observability": "1.58.0",
40
+ "@contractspec/lib.schema": "1.58.0"
39
41
  },
40
42
  "peerDependencies": {
41
43
  "@prisma/client": "7.3.0"
42
44
  },
43
45
  "devDependencies": {
44
- "@contractspec/tool.tsdown": "1.57.0",
45
- "@contractspec/tool.typescript": "1.57.0",
46
- "tsdown": "^0.20.3",
47
- "typescript": "^5.9.3"
46
+ "@contractspec/tool.typescript": "1.58.0",
47
+ "typescript": "^5.9.3",
48
+ "@contractspec/tool.bun": "1.57.0"
48
49
  },
49
50
  "exports": {
50
- ".": "./dist/index.mjs",
51
- "./*": "./*"
51
+ ".": "./src/index.ts"
52
52
  },
53
53
  "publishConfig": {
54
54
  "access": "public",
55
55
  "exports": {
56
- ".": "./dist/index.js",
57
- "./*": "./*"
56
+ ".": {
57
+ "types": "./dist/index.d.ts",
58
+ "bun": "./dist/index.js",
59
+ "node": "./dist/node/index.mjs",
60
+ "default": "./dist/index.js"
61
+ }
58
62
  },
59
63
  "registry": "https://registry.npmjs.org/"
60
64
  },
@@ -1,24 +0,0 @@
1
- import { OperationCoordinate, OperationMetricSample, SpecUsageStats } from "../types.mjs";
2
- import { AnalyticsReader, DateRangeInput } from "@contractspec/lib.contracts/integrations/providers/analytics";
3
-
4
- //#region src/analyzer/posthog-telemetry-reader.d.ts
5
- interface ReadOperationSamplesInput {
6
- operations?: OperationCoordinate[];
7
- dateRange?: DateRangeInput;
8
- limit?: number;
9
- }
10
- interface PosthogTelemetryReaderOptions {
11
- eventPrefix?: string;
12
- }
13
- declare class PosthogTelemetryReader {
14
- private readonly reader;
15
- private readonly eventPrefix;
16
- constructor(reader: AnalyticsReader, options?: PosthogTelemetryReaderOptions);
17
- readOperationSamples(input: ReadOperationSamplesInput): Promise<OperationMetricSample[]>;
18
- readAnomalyBaseline(operation: OperationCoordinate, windowDays?: number): Promise<SpecUsageStats | null>;
19
- private readTopErrors;
20
- private queryHogQL;
21
- }
22
- //#endregion
23
- export { PosthogTelemetryReader, PosthogTelemetryReaderOptions, ReadOperationSamplesInput };
24
- //# sourceMappingURL=posthog-telemetry-reader.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"posthog-telemetry-reader.d.mts","names":[],"sources":["../../src/analyzer/posthog-telemetry-reader.ts"],"mappings":";;;;UAWiB,yBAAA;EACf,UAAA,GAAa,mBAAA;EACb,SAAA,GAAY,cAAA;EACZ,KAAA;AAAA;AAAA,UAGe,6BAAA;EACf,WAAA;AAAA;AAAA,cAGW,sBAAA;EAAA,iBACM,MAAA;EAAA,iBACA,WAAA;cAGf,MAAA,EAAQ,eAAA,EACR,OAAA,GAAS,6BAAA;EAML,oBAAA,CACJ,KAAA,EAAO,yBAAA,GACN,OAAA,CAAQ,qBAAA;EAwBL,mBAAA,CACJ,SAAA,EAAW,mBAAA,EACX,UAAA,YACC,OAAA,CAAQ,cAAA;EAAA,QAkCG,aAAA;EAAA,QAiCA,UAAA;AAAA"}
@@ -1,225 +0,0 @@
1
- //#region src/analyzer/posthog-telemetry-reader.ts
2
- var PosthogTelemetryReader = class {
3
- reader;
4
- eventPrefix;
5
- constructor(reader, options = {}) {
6
- this.reader = reader;
7
- this.eventPrefix = options.eventPrefix ?? "observability";
8
- }
9
- async readOperationSamples(input) {
10
- return mapOperationSamples(await this.queryHogQL({
11
- query: [
12
- "select",
13
- " properties.operation as operationKey,",
14
- " properties.version as version,",
15
- " properties.durationMs as durationMs,",
16
- " properties.success as success,",
17
- " properties.errorCode as errorCode,",
18
- " properties.tenantId as tenantId,",
19
- " properties.traceId as traceId,",
20
- " properties.metadata as metadata,",
21
- " timestamp as timestamp",
22
- "from events",
23
- `where ${buildOperationWhereClause(this.eventPrefix, input)}`,
24
- "order by timestamp desc",
25
- `limit ${input.limit ?? 1e3}`
26
- ].join("\n"),
27
- values: buildOperationValues(input)
28
- }));
29
- }
30
- async readAnomalyBaseline(operation, windowDays = 7) {
31
- const dateRange = buildWindowRange(windowDays);
32
- const stats = mapBaselineStats(await this.queryHogQL({
33
- query: [
34
- "select",
35
- " count() as totalCalls,",
36
- " avg(properties.durationMs) as averageLatencyMs,",
37
- " quantile(0.95)(properties.durationMs) as p95LatencyMs,",
38
- " quantile(0.99)(properties.durationMs) as p99LatencyMs,",
39
- " max(properties.durationMs) as maxLatencyMs,",
40
- " sum(if(properties.success = 1, 1, 0)) as successCount,",
41
- " sum(if(properties.success = 0, 1, 0)) as errorCount",
42
- "from events",
43
- `where ${buildOperationWhereClause(this.eventPrefix, {
44
- operations: [operation],
45
- dateRange
46
- })}`
47
- ].join("\n"),
48
- values: buildOperationValues({
49
- operations: [operation],
50
- dateRange
51
- })
52
- }), operation, dateRange);
53
- if (!stats) return null;
54
- const topErrors = await this.readTopErrors(operation, dateRange);
55
- return {
56
- ...stats,
57
- topErrors
58
- };
59
- }
60
- async readTopErrors(operation, dateRange) {
61
- return mapRows(await this.queryHogQL({
62
- query: [
63
- "select",
64
- " properties.errorCode as errorCode,",
65
- " count() as errorCount",
66
- "from events",
67
- `where ${buildOperationWhereClause(this.eventPrefix, {
68
- operations: [operation],
69
- dateRange
70
- })} and properties.success = 0`,
71
- "group by errorCode",
72
- "order by errorCount desc",
73
- "limit 5"
74
- ].join("\n"),
75
- values: buildOperationValues({
76
- operations: [operation],
77
- dateRange
78
- })
79
- })).reduce((acc, row) => {
80
- const code = asString(row.errorCode);
81
- if (!code) return acc;
82
- acc[code] = asNumber(row.errorCount);
83
- return acc;
84
- }, {});
85
- }
86
- async queryHogQL(input) {
87
- if (!this.reader.queryHogQL) throw new Error("Analytics reader does not support HogQL queries.");
88
- return this.reader.queryHogQL(input);
89
- }
90
- };
91
- function buildOperationWhereClause(eventPrefix, input) {
92
- const clauses = [`event = '${eventPrefix}.operation'`];
93
- if (input.operations?.length) clauses.push(`(${buildOperationFilters(input.operations)})`);
94
- if (input.dateRange?.from) clauses.push("timestamp >= {dateFrom}");
95
- if (input.dateRange?.to) clauses.push("timestamp < {dateTo}");
96
- return clauses.join(" and ");
97
- }
98
- function buildOperationValues(input) {
99
- const values = {
100
- dateFrom: toIsoString(input.dateRange?.from),
101
- dateTo: toIsoString(input.dateRange?.to)
102
- };
103
- input.operations?.forEach((op, index) => {
104
- values[`operationKey${index}`] = op.key;
105
- values[`operationVersion${index}`] = op.version;
106
- if (op.tenantId) values[`operationTenant${index}`] = op.tenantId;
107
- });
108
- return values;
109
- }
110
- function buildOperationFilters(operations) {
111
- return operations.map((op, index) => {
112
- const clauses = [`properties.operation = {operationKey${index}}`, `properties.version = {operationVersion${index}}`];
113
- if (op.tenantId) clauses.push(`properties.tenantId = {operationTenant${index}}`);
114
- return `(${clauses.join(" and ")})`;
115
- }).join(" or ");
116
- }
117
- function mapOperationSamples(result) {
118
- return mapRows(result).flatMap((row) => {
119
- const operationKey = asString(row.operationKey);
120
- const version = asString(row.version);
121
- const timestamp = asDate(row.timestamp);
122
- if (!operationKey || !version || !timestamp) return [];
123
- return [{
124
- operation: {
125
- key: operationKey,
126
- version,
127
- tenantId: asOptionalString(row.tenantId) ?? void 0
128
- },
129
- durationMs: asNumber(row.durationMs),
130
- success: asBoolean(row.success),
131
- timestamp,
132
- errorCode: asOptionalString(row.errorCode) ?? void 0,
133
- traceId: asOptionalString(row.traceId) ?? void 0,
134
- metadata: isRecord(row.metadata) ? row.metadata : void 0
135
- }];
136
- });
137
- }
138
- function mapBaselineStats(result, operation, dateRange) {
139
- const row = mapRows(result)[0];
140
- if (!row) return null;
141
- const totalCalls = asNumber(row.totalCalls);
142
- if (!totalCalls) return null;
143
- const successCount = asNumber(row.successCount);
144
- const errorCount = asNumber(row.errorCount);
145
- return {
146
- operation,
147
- totalCalls,
148
- successRate: totalCalls ? successCount / totalCalls : 0,
149
- errorRate: totalCalls ? errorCount / totalCalls : 0,
150
- averageLatencyMs: asNumber(row.averageLatencyMs),
151
- p95LatencyMs: asNumber(row.p95LatencyMs),
152
- p99LatencyMs: asNumber(row.p99LatencyMs),
153
- maxLatencyMs: asNumber(row.maxLatencyMs),
154
- lastSeenAt: /* @__PURE__ */ new Date(),
155
- windowStart: toDate(dateRange.from) ?? /* @__PURE__ */ new Date(),
156
- windowEnd: toDate(dateRange.to) ?? /* @__PURE__ */ new Date(),
157
- topErrors: {}
158
- };
159
- }
160
- function mapRows(result) {
161
- if (!Array.isArray(result.results) || !Array.isArray(result.columns)) return [];
162
- const columns = result.columns;
163
- return result.results.flatMap((row) => {
164
- if (!Array.isArray(row)) return [];
165
- const record = {};
166
- columns.forEach((column, index) => {
167
- record[column] = row[index];
168
- });
169
- return [record];
170
- });
171
- }
172
- function buildWindowRange(windowDays) {
173
- const windowEnd = /* @__PURE__ */ new Date();
174
- return {
175
- from: /* @__PURE__ */ new Date(windowEnd.getTime() - windowDays * 24 * 60 * 60 * 1e3),
176
- to: windowEnd
177
- };
178
- }
179
- function asString(value) {
180
- if (typeof value === "string" && value.trim()) return value;
181
- if (typeof value === "number") return String(value);
182
- return null;
183
- }
184
- function asOptionalString(value) {
185
- if (typeof value === "string") return value;
186
- if (typeof value === "number") return String(value);
187
- return null;
188
- }
189
- function asNumber(value) {
190
- if (typeof value === "number" && Number.isFinite(value)) return value;
191
- if (typeof value === "string" && value.trim()) {
192
- const parsed = Number(value);
193
- if (Number.isFinite(parsed)) return parsed;
194
- }
195
- return 0;
196
- }
197
- function asBoolean(value) {
198
- if (typeof value === "boolean") return value;
199
- if (typeof value === "number") return value !== 0;
200
- if (typeof value === "string") return value.toLowerCase() === "true";
201
- return false;
202
- }
203
- function asDate(value) {
204
- if (value instanceof Date) return value;
205
- if (typeof value === "string" || typeof value === "number") {
206
- const date = new Date(value);
207
- if (!Number.isNaN(date.getTime())) return date;
208
- }
209
- return null;
210
- }
211
- function toIsoString(value) {
212
- if (!value) return void 0;
213
- return typeof value === "string" ? value : value.toISOString();
214
- }
215
- function toDate(value) {
216
- if (!value) return null;
217
- return value instanceof Date ? value : new Date(value);
218
- }
219
- function isRecord(value) {
220
- return typeof value === "object" && value !== null;
221
- }
222
-
223
- //#endregion
224
- export { PosthogTelemetryReader };
225
- //# sourceMappingURL=posthog-telemetry-reader.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"posthog-telemetry-reader.mjs","names":[],"sources":["../../src/analyzer/posthog-telemetry-reader.ts"],"sourcesContent":["import type {\n AnalyticsReader,\n AnalyticsQueryResult,\n DateRangeInput,\n} from '@contractspec/lib.contracts/integrations/providers/analytics';\nimport type {\n OperationCoordinate,\n OperationMetricSample,\n SpecUsageStats,\n} from '../types';\n\nexport interface ReadOperationSamplesInput {\n operations?: OperationCoordinate[];\n dateRange?: DateRangeInput;\n limit?: number;\n}\n\nexport interface PosthogTelemetryReaderOptions {\n eventPrefix?: string;\n}\n\nexport class PosthogTelemetryReader {\n private readonly reader: AnalyticsReader;\n private readonly eventPrefix: string;\n\n constructor(\n reader: AnalyticsReader,\n options: PosthogTelemetryReaderOptions = {}\n ) {\n this.reader = reader;\n this.eventPrefix = options.eventPrefix ?? 'observability';\n }\n\n async readOperationSamples(\n input: ReadOperationSamplesInput\n ): Promise<OperationMetricSample[]> {\n const result = await this.queryHogQL({\n query: [\n 'select',\n ' properties.operation as operationKey,',\n ' properties.version as version,',\n ' properties.durationMs as durationMs,',\n ' properties.success as success,',\n ' properties.errorCode as errorCode,',\n ' properties.tenantId as tenantId,',\n ' properties.traceId as traceId,',\n ' properties.metadata as metadata,',\n ' timestamp as timestamp',\n 'from events',\n `where ${buildOperationWhereClause(this.eventPrefix, input)}`,\n 'order by timestamp desc',\n `limit ${input.limit ?? 1000}`,\n ].join('\\n'),\n values: buildOperationValues(input),\n });\n\n return mapOperationSamples(result);\n }\n\n async readAnomalyBaseline(\n operation: OperationCoordinate,\n windowDays = 7\n ): Promise<SpecUsageStats | null> {\n const dateRange = buildWindowRange(windowDays);\n const baseResult = await this.queryHogQL({\n query: [\n 'select',\n ' count() as totalCalls,',\n ' avg(properties.durationMs) as averageLatencyMs,',\n ' quantile(0.95)(properties.durationMs) as p95LatencyMs,',\n ' quantile(0.99)(properties.durationMs) as p99LatencyMs,',\n ' max(properties.durationMs) as maxLatencyMs,',\n ' sum(if(properties.success = 1, 1, 0)) as successCount,',\n ' sum(if(properties.success = 0, 1, 0)) as errorCount',\n 'from events',\n `where ${buildOperationWhereClause(this.eventPrefix, {\n operations: [operation],\n dateRange,\n })}`,\n ].join('\\n'),\n values: buildOperationValues({\n operations: [operation],\n dateRange,\n }),\n });\n\n const stats = mapBaselineStats(baseResult, operation, dateRange);\n if (!stats) return null;\n\n const topErrors = await this.readTopErrors(operation, dateRange);\n return {\n ...stats,\n topErrors,\n };\n }\n\n private async readTopErrors(\n operation: OperationCoordinate,\n dateRange: DateRangeInput\n ): Promise<Record<string, number>> {\n const result = await this.queryHogQL({\n query: [\n 'select',\n ' properties.errorCode as errorCode,',\n ' count() as errorCount',\n 'from events',\n `where ${buildOperationWhereClause(this.eventPrefix, {\n operations: [operation],\n dateRange,\n })} and properties.success = 0`,\n 'group by errorCode',\n 'order by errorCount desc',\n 'limit 5',\n ].join('\\n'),\n values: buildOperationValues({\n operations: [operation],\n dateRange,\n }),\n });\n\n const rows = mapRows(result);\n return rows.reduce<Record<string, number>>((acc, row) => {\n const code = asString(row.errorCode);\n if (!code) return acc;\n acc[code] = asNumber(row.errorCount);\n return acc;\n }, {});\n }\n\n private async queryHogQL(input: {\n query: string;\n values: Record<string, unknown>;\n }): Promise<AnalyticsQueryResult> {\n if (!this.reader.queryHogQL) {\n throw new Error('Analytics reader does not support HogQL queries.');\n }\n return this.reader.queryHogQL(input);\n }\n}\n\nfunction buildOperationWhereClause(\n eventPrefix: string,\n input: { operations?: OperationCoordinate[]; dateRange?: DateRangeInput }\n): string {\n const clauses = [`event = '${eventPrefix}.operation'`];\n if (input.operations?.length) {\n clauses.push(`(${buildOperationFilters(input.operations)})`);\n }\n if (input.dateRange?.from) {\n clauses.push('timestamp >= {dateFrom}');\n }\n if (input.dateRange?.to) {\n clauses.push('timestamp < {dateTo}');\n }\n return clauses.join(' and ');\n}\n\nfunction buildOperationValues(input: {\n operations?: OperationCoordinate[];\n dateRange?: DateRangeInput;\n}): Record<string, unknown> {\n const values: Record<string, unknown> = {\n dateFrom: toIsoString(input.dateRange?.from),\n dateTo: toIsoString(input.dateRange?.to),\n };\n input.operations?.forEach((op, index) => {\n values[`operationKey${index}`] = op.key;\n values[`operationVersion${index}`] = op.version;\n if (op.tenantId) {\n values[`operationTenant${index}`] = op.tenantId;\n }\n });\n return values;\n}\n\nfunction buildOperationFilters(operations: OperationCoordinate[]): string {\n return operations\n .map((op, index) => {\n const clauses = [\n `properties.operation = {operationKey${index}}`,\n `properties.version = {operationVersion${index}}`,\n ];\n if (op.tenantId) {\n clauses.push(`properties.tenantId = {operationTenant${index}}`);\n }\n return `(${clauses.join(' and ')})`;\n })\n .join(' or ');\n}\n\nfunction mapOperationSamples(\n result: AnalyticsQueryResult\n): OperationMetricSample[] {\n const rows = mapRows(result);\n return rows.flatMap((row) => {\n const operationKey = asString(row.operationKey);\n const version = asString(row.version);\n const timestamp = asDate(row.timestamp);\n if (!operationKey || !version || !timestamp) {\n return [];\n }\n return [\n {\n operation: {\n key: operationKey,\n version,\n tenantId: asOptionalString(row.tenantId) ?? undefined,\n },\n durationMs: asNumber(row.durationMs),\n success: asBoolean(row.success),\n timestamp,\n errorCode: asOptionalString(row.errorCode) ?? undefined,\n traceId: asOptionalString(row.traceId) ?? undefined,\n metadata: isRecord(row.metadata) ? row.metadata : undefined,\n },\n ];\n });\n}\n\nfunction mapBaselineStats(\n result: AnalyticsQueryResult,\n operation: OperationCoordinate,\n dateRange: DateRangeInput\n): SpecUsageStats | null {\n const rows = mapRows(result);\n const row = rows[0];\n if (!row) return null;\n const totalCalls = asNumber(row.totalCalls);\n if (!totalCalls) return null;\n const successCount = asNumber(row.successCount);\n const errorCount = asNumber(row.errorCount);\n return {\n operation,\n totalCalls,\n successRate: totalCalls ? successCount / totalCalls : 0,\n errorRate: totalCalls ? errorCount / totalCalls : 0,\n averageLatencyMs: asNumber(row.averageLatencyMs),\n p95LatencyMs: asNumber(row.p95LatencyMs),\n p99LatencyMs: asNumber(row.p99LatencyMs),\n maxLatencyMs: asNumber(row.maxLatencyMs),\n lastSeenAt: new Date(),\n windowStart: toDate(dateRange.from) ?? new Date(),\n windowEnd: toDate(dateRange.to) ?? new Date(),\n topErrors: {},\n };\n}\n\nfunction mapRows(result: AnalyticsQueryResult): Record<string, unknown>[] {\n if (!Array.isArray(result.results) || !Array.isArray(result.columns)) {\n return [];\n }\n const columns = result.columns;\n return result.results.flatMap((row) => {\n if (!Array.isArray(row)) return [];\n const record: Record<string, unknown> = {};\n columns.forEach((column, index) => {\n record[column] = row[index];\n });\n return [record];\n });\n}\n\nfunction buildWindowRange(windowDays: number): DateRangeInput {\n const windowEnd = new Date();\n const windowStart = new Date(\n windowEnd.getTime() - windowDays * 24 * 60 * 60 * 1000\n );\n return {\n from: windowStart,\n to: windowEnd,\n };\n}\n\nfunction asString(value: unknown): string | null {\n if (typeof value === 'string' && value.trim()) return value;\n if (typeof value === 'number') return String(value);\n return null;\n}\n\nfunction asOptionalString(value: unknown): string | null {\n if (typeof value === 'string') return value;\n if (typeof value === 'number') return String(value);\n return null;\n}\n\nfunction asNumber(value: unknown): number {\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n if (typeof value === 'string' && value.trim()) {\n const parsed = Number(value);\n if (Number.isFinite(parsed)) return parsed;\n }\n return 0;\n}\n\nfunction asBoolean(value: unknown): boolean {\n if (typeof value === 'boolean') return value;\n if (typeof value === 'number') return value !== 0;\n if (typeof value === 'string') return value.toLowerCase() === 'true';\n return false;\n}\n\nfunction asDate(value: unknown): Date | null {\n if (value instanceof Date) return value;\n if (typeof value === 'string' || typeof value === 'number') {\n const date = new Date(value);\n if (!Number.isNaN(date.getTime())) return date;\n }\n return null;\n}\n\nfunction toIsoString(value?: string | Date): string | undefined {\n if (!value) return undefined;\n return typeof value === 'string' ? value : value.toISOString();\n}\n\nfunction toDate(value?: string | Date): Date | null {\n if (!value) return null;\n return value instanceof Date ? value : new Date(value);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n"],"mappings":"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"}
@@ -1,35 +0,0 @@
1
- import { IntentPattern, OperationMetricSample, OptimizationHint, SpecAnomaly, SpecUsageStats } from "../types.mjs";
2
- import { Logger } from "@contractspec/lib.observability";
3
- import { LifecycleStage } from "@contractspec/lib.lifecycle";
4
-
5
- //#region src/analyzer/spec-analyzer.d.ts
6
- interface SpecAnalyzerOptions {
7
- logger?: Logger;
8
- minSampleSize?: number;
9
- errorRateThreshold?: number;
10
- latencyP99ThresholdMs?: number;
11
- throughputDropThreshold?: number;
12
- }
13
- declare class SpecAnalyzer {
14
- private readonly logger?;
15
- private readonly minSampleSize;
16
- private readonly errorRateThreshold;
17
- private readonly latencyP99ThresholdMs;
18
- private readonly throughputDropThreshold;
19
- constructor(options?: SpecAnalyzerOptions);
20
- analyzeSpecUsage(samples: OperationMetricSample[]): SpecUsageStats[];
21
- detectAnomalies(stats: SpecUsageStats[], baseline?: SpecUsageStats[]): SpecAnomaly[];
22
- toIntentPatterns(anomalies: SpecAnomaly[], stats: SpecUsageStats[]): IntentPattern[];
23
- suggestOptimizations(stats: SpecUsageStats[], anomalies: SpecAnomaly[], lifecycleContext?: {
24
- stage: LifecycleStage;
25
- }): OptimizationHint[];
26
- private operationKey;
27
- private buildUsageStats;
28
- private toSeverity;
29
- private mapMetricToIntent;
30
- private groupByOperation;
31
- private applyLifecycleContext;
32
- }
33
- //#endregion
34
- export { SpecAnalyzer, SpecAnalyzerOptions };
35
- //# sourceMappingURL=spec-analyzer.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"spec-analyzer.d.mts","names":[],"sources":["../../src/analyzer/spec-analyzer.ts"],"mappings":";;;;;UAciB,mBAAA;EACf,MAAA,GAAS,MAAA;EACT,aAAA;EACA,kBAAA;EACA,qBAAA;EACA,uBAAA;AAAA;AAAA,cAcW,YAAA;EAAA,iBACM,MAAA;EAAA,iBACA,aAAA;EAAA,iBACA,kBAAA;EAAA,iBACA,qBAAA;EAAA,iBACA,uBAAA;cAEL,OAAA,GAAS,mBAAA;EAUrB,gBAAA,CAAiB,OAAA,EAAS,qBAAA,KAA0B,cAAA;EAmCpD,eAAA,CACE,KAAA,EAAO,cAAA,IACP,QAAA,GAAW,cAAA,KACV,WAAA;EAqFH,gBAAA,CACE,SAAA,EAAW,WAAA,IACX,KAAA,EAAO,cAAA,KACN,aAAA;EA6BH,oBAAA,CACE,KAAA,EAAO,cAAA,IACP,SAAA,EAAW,WAAA,IACX,gBAAA;IAAqB,KAAA,EAAO,cAAA;EAAA,IAC3B,gBAAA;EAAA,QAsEK,YAAA;EAAA,QAcA,eAAA;EAAA,QAoCA,UAAA;EAAA,QAMA,iBAAA;EAAA,QAeA,gBAAA;EAAA,QAaA,qBAAA;AAAA"}