@contractspec/lib.evolution 1.44.1 → 1.45.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.
@@ -8,7 +8,7 @@ interface SpecGeneratorOptions {
8
8
  config?: EvolutionConfig;
9
9
  logger?: Logger;
10
10
  clock?: () => Date;
11
- getSpec?: (key: string, version?: number) => AnyOperationSpec | undefined;
11
+ getSpec?: (key: string, version?: string) => AnyOperationSpec | undefined;
12
12
  }
13
13
  interface GenerateSpecOptions {
14
14
  summary?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"spec-generator.js","names":["reasons: string[]"],"sources":["../../src/generator/spec-generator.ts"],"sourcesContent":["import type {\n AnyOperationSpec,\n OperationSpec,\n ResourceRefDescriptor,\n} from '@contractspec/lib.contracts';\nimport type { AnySchemaModel } from '@contractspec/lib.schema';\nimport { Logger } from '@contractspec/lib.observability';\nimport { randomUUID } from 'node:crypto';\nimport {\n type EvolutionConfig,\n type IntentPattern,\n type OperationCoordinate,\n type SpecSuggestion,\n type SpecSuggestionProposal,\n type SuggestionStatus,\n} from '../types';\n\nexport interface SpecGeneratorOptions {\n config?: EvolutionConfig;\n logger?: Logger;\n clock?: () => Date;\n getSpec?: (key: string, version?: number) => AnyOperationSpec | undefined;\n}\n\nexport interface GenerateSpecOptions {\n summary?: string;\n rationale?: string;\n changeType?: SpecSuggestionProposal['changeType'];\n kind?: SpecSuggestionProposal['kind'];\n spec?: AnyOperationSpec;\n diff?: string;\n metadata?: Record<string, unknown>;\n status?: SuggestionStatus;\n tags?: string[];\n createdBy?: string;\n}\n\nexport type SpecPatch = Partial<\n OperationSpec<AnySchemaModel, AnySchemaModel | ResourceRefDescriptor<boolean>>\n> & { meta?: Partial<AnyOperationSpec['meta']> };\n\nexport class SpecGenerator {\n private readonly config: EvolutionConfig;\n private readonly logger?: Logger;\n private readonly clock: () => Date;\n private readonly getSpec?: SpecGeneratorOptions['getSpec'];\n\n constructor(options: SpecGeneratorOptions = {}) {\n this.config = options.config ?? {};\n this.logger = options.logger;\n this.clock = options.clock ?? (() => new Date());\n this.getSpec = options.getSpec;\n }\n\n generateFromIntent(\n intent: IntentPattern,\n options: GenerateSpecOptions = {}\n ): SpecSuggestion {\n const now = this.clock();\n const summary =\n options.summary ??\n `${this.intentToVerb(intent.type)} ${intent.operation?.key ?? 'operation'}`;\n const rationale =\n options.rationale ??\n [\n intent.description,\n intent.metadata?.observedValue\n ? `Observed ${intent.metadata.observedValue}`\n : undefined,\n ]\n .filter(Boolean)\n .join(' — ');\n\n const suggestion: SpecSuggestion = {\n id: randomUUID(),\n intent,\n target: intent.operation,\n proposal: {\n summary,\n rationale,\n changeType: options.changeType ?? this.inferChangeType(intent),\n kind: options.kind,\n spec: options.spec,\n diff: options.diff,\n metadata: options.metadata,\n },\n confidence: intent.confidence.score,\n priority: this.intentToPriority(intent),\n createdAt: now,\n createdBy: options.createdBy ?? 'auto-evolution',\n status: options.status ?? 'pending',\n evidence: intent.evidence,\n tags: options.tags,\n };\n return suggestion;\n }\n\n generateVariant(\n operation: OperationCoordinate,\n patch: SpecPatch,\n intent: IntentPattern,\n options: Omit<GenerateSpecOptions, 'spec'> = {}\n ) {\n if (!this.getSpec) {\n throw new Error('SpecGenerator requires getSpec() to generate variants');\n }\n const base = this.getSpec(operation.key, operation.version);\n if (!base) {\n throw new Error(\n `Cannot generate variant; spec ${operation.key}.v${operation.version} not found`\n );\n }\n const merged = mergeContract(base, patch);\n return this.generateFromIntent(intent, { ...options, spec: merged });\n }\n\n validateSuggestion(\n suggestion: SpecSuggestion,\n config: EvolutionConfig = this.config\n ) {\n const reasons: string[] = [];\n if (\n config.minConfidence != null &&\n suggestion.confidence < config.minConfidence\n ) {\n reasons.push(\n `Confidence ${suggestion.confidence.toFixed(2)} below minimum ${config.minConfidence}`\n );\n }\n if (config.requireApproval && suggestion.status === 'approved') {\n reasons.push(\n 'Suggestion cannot be auto-approved when approval is required'\n );\n }\n if (suggestion.proposal.spec && !suggestion.proposal.spec.meta?.key) {\n reasons.push('Proposal spec must include meta.key');\n }\n if (!suggestion.proposal.summary) {\n reasons.push('Proposal summary is required');\n }\n const ok = reasons.length === 0;\n if (!ok) {\n this.logger?.warn('SpecGenerator.validateSuggestion.failed', {\n suggestionId: suggestion.id,\n reasons,\n });\n }\n return { ok, reasons };\n }\n\n private intentToVerb(intent: IntentPattern['type']) {\n switch (intent) {\n case 'error-spike':\n return 'Stabilize';\n case 'latency-regression':\n return 'Optimize';\n case 'missing-operation':\n return 'Introduce';\n case 'throughput-drop':\n return 'Rebalance';\n default:\n return 'Adjust';\n }\n }\n\n private intentToPriority(intent: IntentPattern) {\n const severity = intent.confidence.score;\n if (intent.type === 'error-spike' || severity >= 0.8) return 'high';\n if (severity >= 0.5) return 'medium';\n return 'low';\n }\n\n private inferChangeType(\n intent: IntentPattern\n ): SpecSuggestionProposal['changeType'] {\n switch (intent.type) {\n case 'missing-operation':\n return 'new-spec';\n case 'schema-mismatch':\n return 'schema-update';\n case 'error-spike':\n return 'policy-update';\n default:\n return 'revision';\n }\n }\n}\n\nfunction mergeContract(\n base: AnyOperationSpec,\n patch: SpecPatch\n): AnyOperationSpec {\n return {\n ...base,\n ...patch,\n meta: { ...base.meta, ...patch.meta },\n io: {\n ...base.io,\n ...patch.io,\n },\n policy: {\n ...base.policy,\n ...patch.policy,\n },\n telemetry: {\n ...base.telemetry,\n ...patch.telemetry,\n },\n sideEffects: {\n ...base.sideEffects,\n ...patch.sideEffects,\n },\n } as AnyOperationSpec;\n}\n"],"mappings":";;;;AAyCA,IAAa,gBAAb,MAA2B;CACzB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CAEjB,YAAY,UAAgC,EAAE,EAAE;AAC9C,OAAK,SAAS,QAAQ,UAAU,EAAE;AAClC,OAAK,SAAS,QAAQ;AACtB,OAAK,QAAQ,QAAQ,gCAAgB,IAAI,MAAM;AAC/C,OAAK,UAAU,QAAQ;;CAGzB,mBACE,QACA,UAA+B,EAAE,EACjB;EAChB,MAAM,MAAM,KAAK,OAAO;EACxB,MAAM,UACJ,QAAQ,WACR,GAAG,KAAK,aAAa,OAAO,KAAK,CAAC,GAAG,OAAO,WAAW,OAAO;EAChE,MAAM,YACJ,QAAQ,aACR,CACE,OAAO,aACP,OAAO,UAAU,gBACb,YAAY,OAAO,SAAS,kBAC5B,OACL,CACE,OAAO,QAAQ,CACf,KAAK,MAAM;AAuBhB,SArBmC;GACjC,IAAI,YAAY;GAChB;GACA,QAAQ,OAAO;GACf,UAAU;IACR;IACA;IACA,YAAY,QAAQ,cAAc,KAAK,gBAAgB,OAAO;IAC9D,MAAM,QAAQ;IACd,MAAM,QAAQ;IACd,MAAM,QAAQ;IACd,UAAU,QAAQ;IACnB;GACD,YAAY,OAAO,WAAW;GAC9B,UAAU,KAAK,iBAAiB,OAAO;GACvC,WAAW;GACX,WAAW,QAAQ,aAAa;GAChC,QAAQ,QAAQ,UAAU;GAC1B,UAAU,OAAO;GACjB,MAAM,QAAQ;GACf;;CAIH,gBACE,WACA,OACA,QACA,UAA6C,EAAE,EAC/C;AACA,MAAI,CAAC,KAAK,QACR,OAAM,IAAI,MAAM,wDAAwD;EAE1E,MAAM,OAAO,KAAK,QAAQ,UAAU,KAAK,UAAU,QAAQ;AAC3D,MAAI,CAAC,KACH,OAAM,IAAI,MACR,iCAAiC,UAAU,IAAI,IAAI,UAAU,QAAQ,YACtE;EAEH,MAAM,SAAS,cAAc,MAAM,MAAM;AACzC,SAAO,KAAK,mBAAmB,QAAQ;GAAE,GAAG;GAAS,MAAM;GAAQ,CAAC;;CAGtE,mBACE,YACA,SAA0B,KAAK,QAC/B;EACA,MAAMA,UAAoB,EAAE;AAC5B,MACE,OAAO,iBAAiB,QACxB,WAAW,aAAa,OAAO,cAE/B,SAAQ,KACN,cAAc,WAAW,WAAW,QAAQ,EAAE,CAAC,iBAAiB,OAAO,gBACxE;AAEH,MAAI,OAAO,mBAAmB,WAAW,WAAW,WAClD,SAAQ,KACN,+DACD;AAEH,MAAI,WAAW,SAAS,QAAQ,CAAC,WAAW,SAAS,KAAK,MAAM,IAC9D,SAAQ,KAAK,sCAAsC;AAErD,MAAI,CAAC,WAAW,SAAS,QACvB,SAAQ,KAAK,+BAA+B;EAE9C,MAAM,KAAK,QAAQ,WAAW;AAC9B,MAAI,CAAC,GACH,MAAK,QAAQ,KAAK,2CAA2C;GAC3D,cAAc,WAAW;GACzB;GACD,CAAC;AAEJ,SAAO;GAAE;GAAI;GAAS;;CAGxB,AAAQ,aAAa,QAA+B;AAClD,UAAQ,QAAR;GACE,KAAK,cACH,QAAO;GACT,KAAK,qBACH,QAAO;GACT,KAAK,oBACH,QAAO;GACT,KAAK,kBACH,QAAO;GACT,QACE,QAAO;;;CAIb,AAAQ,iBAAiB,QAAuB;EAC9C,MAAM,WAAW,OAAO,WAAW;AACnC,MAAI,OAAO,SAAS,iBAAiB,YAAY,GAAK,QAAO;AAC7D,MAAI,YAAY,GAAK,QAAO;AAC5B,SAAO;;CAGT,AAAQ,gBACN,QACsC;AACtC,UAAQ,OAAO,MAAf;GACE,KAAK,oBACH,QAAO;GACT,KAAK,kBACH,QAAO;GACT,KAAK,cACH,QAAO;GACT,QACE,QAAO;;;;AAKf,SAAS,cACP,MACA,OACkB;AAClB,QAAO;EACL,GAAG;EACH,GAAG;EACH,MAAM;GAAE,GAAG,KAAK;GAAM,GAAG,MAAM;GAAM;EACrC,IAAI;GACF,GAAG,KAAK;GACR,GAAG,MAAM;GACV;EACD,QAAQ;GACN,GAAG,KAAK;GACR,GAAG,MAAM;GACV;EACD,WAAW;GACT,GAAG,KAAK;GACR,GAAG,MAAM;GACV;EACD,aAAa;GACX,GAAG,KAAK;GACR,GAAG,MAAM;GACV;EACF"}
1
+ {"version":3,"file":"spec-generator.js","names":["reasons: string[]"],"sources":["../../src/generator/spec-generator.ts"],"sourcesContent":["import type {\n AnyOperationSpec,\n OperationSpec,\n ResourceRefDescriptor,\n} from '@contractspec/lib.contracts';\nimport type { AnySchemaModel } from '@contractspec/lib.schema';\nimport { Logger } from '@contractspec/lib.observability';\nimport { randomUUID } from 'node:crypto';\nimport {\n type EvolutionConfig,\n type IntentPattern,\n type OperationCoordinate,\n type SpecSuggestion,\n type SpecSuggestionProposal,\n type SuggestionStatus,\n} from '../types';\n\nexport interface SpecGeneratorOptions {\n config?: EvolutionConfig;\n logger?: Logger;\n clock?: () => Date;\n getSpec?: (key: string, version?: string) => AnyOperationSpec | undefined;\n}\n\nexport interface GenerateSpecOptions {\n summary?: string;\n rationale?: string;\n changeType?: SpecSuggestionProposal['changeType'];\n kind?: SpecSuggestionProposal['kind'];\n spec?: AnyOperationSpec;\n diff?: string;\n metadata?: Record<string, unknown>;\n status?: SuggestionStatus;\n tags?: string[];\n createdBy?: string;\n}\n\nexport type SpecPatch = Partial<\n OperationSpec<AnySchemaModel, AnySchemaModel | ResourceRefDescriptor<boolean>>\n> & { meta?: Partial<AnyOperationSpec['meta']> };\n\nexport class SpecGenerator {\n private readonly config: EvolutionConfig;\n private readonly logger?: Logger;\n private readonly clock: () => Date;\n private readonly getSpec?: SpecGeneratorOptions['getSpec'];\n\n constructor(options: SpecGeneratorOptions = {}) {\n this.config = options.config ?? {};\n this.logger = options.logger;\n this.clock = options.clock ?? (() => new Date());\n this.getSpec = options.getSpec;\n }\n\n generateFromIntent(\n intent: IntentPattern,\n options: GenerateSpecOptions = {}\n ): SpecSuggestion {\n const now = this.clock();\n const summary =\n options.summary ??\n `${this.intentToVerb(intent.type)} ${intent.operation?.key ?? 'operation'}`;\n const rationale =\n options.rationale ??\n [\n intent.description,\n intent.metadata?.observedValue\n ? `Observed ${intent.metadata.observedValue}`\n : undefined,\n ]\n .filter(Boolean)\n .join(' — ');\n\n const suggestion: SpecSuggestion = {\n id: randomUUID(),\n intent,\n target: intent.operation,\n proposal: {\n summary,\n rationale,\n changeType: options.changeType ?? this.inferChangeType(intent),\n kind: options.kind,\n spec: options.spec,\n diff: options.diff,\n metadata: options.metadata,\n },\n confidence: intent.confidence.score,\n priority: this.intentToPriority(intent),\n createdAt: now,\n createdBy: options.createdBy ?? 'auto-evolution',\n status: options.status ?? 'pending',\n evidence: intent.evidence,\n tags: options.tags,\n };\n return suggestion;\n }\n\n generateVariant(\n operation: OperationCoordinate,\n patch: SpecPatch,\n intent: IntentPattern,\n options: Omit<GenerateSpecOptions, 'spec'> = {}\n ) {\n if (!this.getSpec) {\n throw new Error('SpecGenerator requires getSpec() to generate variants');\n }\n const base = this.getSpec(operation.key, operation.version);\n if (!base) {\n throw new Error(\n `Cannot generate variant; spec ${operation.key}.v${operation.version} not found`\n );\n }\n const merged = mergeContract(base, patch);\n return this.generateFromIntent(intent, { ...options, spec: merged });\n }\n\n validateSuggestion(\n suggestion: SpecSuggestion,\n config: EvolutionConfig = this.config\n ) {\n const reasons: string[] = [];\n if (\n config.minConfidence != null &&\n suggestion.confidence < config.minConfidence\n ) {\n reasons.push(\n `Confidence ${suggestion.confidence.toFixed(2)} below minimum ${config.minConfidence}`\n );\n }\n if (config.requireApproval && suggestion.status === 'approved') {\n reasons.push(\n 'Suggestion cannot be auto-approved when approval is required'\n );\n }\n if (suggestion.proposal.spec && !suggestion.proposal.spec.meta?.key) {\n reasons.push('Proposal spec must include meta.key');\n }\n if (!suggestion.proposal.summary) {\n reasons.push('Proposal summary is required');\n }\n const ok = reasons.length === 0;\n if (!ok) {\n this.logger?.warn('SpecGenerator.validateSuggestion.failed', {\n suggestionId: suggestion.id,\n reasons,\n });\n }\n return { ok, reasons };\n }\n\n private intentToVerb(intent: IntentPattern['type']) {\n switch (intent) {\n case 'error-spike':\n return 'Stabilize';\n case 'latency-regression':\n return 'Optimize';\n case 'missing-operation':\n return 'Introduce';\n case 'throughput-drop':\n return 'Rebalance';\n default:\n return 'Adjust';\n }\n }\n\n private intentToPriority(intent: IntentPattern) {\n const severity = intent.confidence.score;\n if (intent.type === 'error-spike' || severity >= 0.8) return 'high';\n if (severity >= 0.5) return 'medium';\n return 'low';\n }\n\n private inferChangeType(\n intent: IntentPattern\n ): SpecSuggestionProposal['changeType'] {\n switch (intent.type) {\n case 'missing-operation':\n return 'new-spec';\n case 'schema-mismatch':\n return 'schema-update';\n case 'error-spike':\n return 'policy-update';\n default:\n return 'revision';\n }\n }\n}\n\nfunction mergeContract(\n base: AnyOperationSpec,\n patch: SpecPatch\n): AnyOperationSpec {\n return {\n ...base,\n ...patch,\n meta: { ...base.meta, ...patch.meta },\n io: {\n ...base.io,\n ...patch.io,\n },\n policy: {\n ...base.policy,\n ...patch.policy,\n },\n telemetry: {\n ...base.telemetry,\n ...patch.telemetry,\n },\n sideEffects: {\n ...base.sideEffects,\n ...patch.sideEffects,\n },\n } as AnyOperationSpec;\n}\n"],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -7,7 +7,7 @@ type AnomalySeverity = 'low' | 'medium' | 'high';
7
7
  type SuggestionStatus = 'pending' | 'approved' | 'rejected';
8
8
  interface OperationCoordinate {
9
9
  key: string;
10
- version: number;
10
+ version: string;
11
11
  tenantId?: string;
12
12
  }
13
13
  interface OperationMetricSample {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contractspec/lib.evolution",
3
- "version": "1.44.1",
3
+ "version": "1.45.0",
4
4
  "description": "AI-powered contract evolution engine",
5
5
  "keywords": [
6
6
  "contractspec",
@@ -33,18 +33,18 @@
33
33
  "dependencies": {
34
34
  "ai": "6.0.3",
35
35
  "zod": "^4.1.13",
36
- "@contractspec/lib.ai-agent": "1.44.1",
37
- "@contractspec/lib.contracts": "1.44.1",
38
- "@contractspec/lib.lifecycle": "1.44.1",
39
- "@contractspec/lib.observability": "1.44.1",
40
- "@contractspec/lib.schema": "1.44.1"
36
+ "@contractspec/lib.ai-agent": "1.45.0",
37
+ "@contractspec/lib.contracts": "1.45.0",
38
+ "@contractspec/lib.lifecycle": "1.45.0",
39
+ "@contractspec/lib.observability": "1.45.0",
40
+ "@contractspec/lib.schema": "1.45.0"
41
41
  },
42
42
  "peerDependencies": {
43
43
  "@prisma/client": "7.2.0"
44
44
  },
45
45
  "devDependencies": {
46
- "@contractspec/tool.tsdown": "1.44.1",
47
- "@contractspec/tool.typescript": "1.44.1",
46
+ "@contractspec/tool.tsdown": "1.45.0",
47
+ "@contractspec/tool.typescript": "1.45.0",
48
48
  "tsdown": "^0.18.3",
49
49
  "typescript": "^5.9.3"
50
50
  },