monora-ai 2.1.0 → 2.1.3

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 (184) hide show
  1. package/README.md +333 -159
  2. package/dist/aims_governance.d.ts +238 -0
  3. package/dist/aims_governance.d.ts.map +1 -0
  4. package/dist/aims_governance.js +922 -0
  5. package/dist/alerts.d.ts +16 -0
  6. package/dist/alerts.d.ts.map +1 -1
  7. package/dist/alerts.js +16 -0
  8. package/dist/api.d.ts +6 -0
  9. package/dist/api.d.ts.map +1 -1
  10. package/dist/api.js +6 -0
  11. package/dist/assessment.d.ts +85 -0
  12. package/dist/assessment.d.ts.map +1 -1
  13. package/dist/assessment.js +506 -13
  14. package/dist/attribution.d.ts +44 -3
  15. package/dist/attribution.d.ts.map +1 -1
  16. package/dist/attribution.js +197 -10
  17. package/dist/autodetect.d.ts +68 -0
  18. package/dist/autodetect.d.ts.map +1 -1
  19. package/dist/autodetect.js +639 -0
  20. package/dist/bias.d.ts +130 -0
  21. package/dist/bias.d.ts.map +1 -0
  22. package/dist/bias.js +223 -0
  23. package/dist/cli/diagnostics.d.ts +5 -1
  24. package/dist/cli/diagnostics.d.ts.map +1 -1
  25. package/dist/cli/diagnostics.js +23 -6
  26. package/dist/cli/doctor.d.ts +25 -0
  27. package/dist/cli/doctor.d.ts.map +1 -0
  28. package/dist/cli/doctor.js +381 -0
  29. package/dist/cli/fix.d.ts +16 -0
  30. package/dist/cli/fix.d.ts.map +1 -0
  31. package/dist/cli/fix.js +284 -0
  32. package/dist/cli/init.d.ts +57 -0
  33. package/dist/cli/init.d.ts.map +1 -0
  34. package/dist/cli/init.js +205 -0
  35. package/dist/cli.js +1550 -176
  36. package/dist/complianceTargets.d.ts +111 -0
  37. package/dist/complianceTargets.d.ts.map +1 -0
  38. package/dist/complianceTargets.js +521 -0
  39. package/dist/config.d.ts +261 -16
  40. package/dist/config.d.ts.map +1 -1
  41. package/dist/config.js +381 -32
  42. package/dist/config_migrations.d.ts.map +1 -1
  43. package/dist/config_migrations.js +38 -1
  44. package/dist/config_schema.d.ts +2490 -1035
  45. package/dist/config_schema.d.ts.map +1 -1
  46. package/dist/config_schema.js +233 -64
  47. package/dist/context.d.ts +34 -0
  48. package/dist/context.d.ts.map +1 -1
  49. package/dist/context.js +118 -7
  50. package/dist/control_backbone.d.ts +122 -0
  51. package/dist/control_backbone.d.ts.map +1 -0
  52. package/dist/control_backbone.js +698 -0
  53. package/dist/data-governance.d.ts +187 -0
  54. package/dist/data-governance.d.ts.map +1 -0
  55. package/dist/data-governance.js +424 -0
  56. package/dist/dataResidency.d.ts +44 -0
  57. package/dist/dataResidency.d.ts.map +1 -0
  58. package/dist/dataResidency.js +203 -0
  59. package/dist/dispatcher.d.ts.map +1 -1
  60. package/dist/dispatcher.js +17 -5
  61. package/dist/evidence_store.d.ts +103 -0
  62. package/dist/evidence_store.d.ts.map +1 -0
  63. package/dist/evidence_store.js +459 -0
  64. package/dist/executiveSummary.d.ts +15 -0
  65. package/dist/executiveSummary.d.ts.map +1 -1
  66. package/dist/executiveSummary.js +135 -22
  67. package/dist/identity.d.ts +143 -0
  68. package/dist/identity.d.ts.map +1 -0
  69. package/dist/identity.js +231 -0
  70. package/dist/impact-assessment.d.ts +350 -0
  71. package/dist/impact-assessment.d.ts.map +1 -0
  72. package/dist/impact-assessment.js +580 -0
  73. package/dist/index.d.ts +20 -4
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +247 -5
  76. package/dist/instrumentation.d.ts +1 -1
  77. package/dist/instrumentation.d.ts.map +1 -1
  78. package/dist/instrumentation.js +123 -22
  79. package/dist/integrations/anthropic.d.ts +3 -0
  80. package/dist/integrations/anthropic.d.ts.map +1 -1
  81. package/dist/integrations/anthropic.js +282 -80
  82. package/dist/integrations/governance.d.ts +33 -0
  83. package/dist/integrations/governance.d.ts.map +1 -0
  84. package/dist/integrations/governance.js +208 -0
  85. package/dist/integrations/langchain.d.ts +4 -0
  86. package/dist/integrations/langchain.d.ts.map +1 -1
  87. package/dist/integrations/langchain.js +362 -142
  88. package/dist/integrations/openai.d.ts +9 -0
  89. package/dist/integrations/openai.d.ts.map +1 -1
  90. package/dist/integrations/openai.js +673 -73
  91. package/dist/iso42001_consolidation.d.ts +16 -0
  92. package/dist/iso42001_consolidation.d.ts.map +1 -0
  93. package/dist/iso42001_consolidation.js +413 -0
  94. package/dist/iso42001_workflows.d.ts +263 -0
  95. package/dist/iso42001_workflows.d.ts.map +1 -0
  96. package/dist/iso42001_workflows.js +781 -0
  97. package/dist/lifecycle.d.ts +299 -0
  98. package/dist/lifecycle.d.ts.map +1 -0
  99. package/dist/lifecycle.js +624 -0
  100. package/dist/lineage.d.ts +2 -2
  101. package/dist/lineage.d.ts.map +1 -1
  102. package/dist/lineage.js +9 -16
  103. package/dist/middleware/express.d.ts.map +1 -1
  104. package/dist/middleware/express.js +18 -3
  105. package/dist/middleware/nextjs.js +2 -2
  106. package/dist/model.d.ts +143 -0
  107. package/dist/model.d.ts.map +1 -0
  108. package/dist/model.js +371 -0
  109. package/dist/onboarding.d.ts +42 -0
  110. package/dist/onboarding.d.ts.map +1 -0
  111. package/dist/onboarding.js +1022 -0
  112. package/dist/oversight.d.ts +264 -0
  113. package/dist/oversight.d.ts.map +1 -0
  114. package/dist/oversight.js +497 -0
  115. package/dist/presets.js +7 -7
  116. package/dist/quotas.d.ts +171 -0
  117. package/dist/quotas.d.ts.map +1 -0
  118. package/dist/quotas.js +259 -0
  119. package/dist/register.d.ts +13 -0
  120. package/dist/register.d.ts.map +1 -0
  121. package/dist/register.js +99 -0
  122. package/dist/registry.d.ts +1 -0
  123. package/dist/registry.d.ts.map +1 -1
  124. package/dist/registry.js +7 -0
  125. package/dist/registryData.json +43 -6
  126. package/dist/report.d.ts +2 -1
  127. package/dist/report.d.ts.map +1 -1
  128. package/dist/report.js +189 -2
  129. package/dist/reporting.d.ts +125 -0
  130. package/dist/reporting.d.ts.map +1 -1
  131. package/dist/reporting.js +192 -2
  132. package/dist/resources.d.ts +285 -0
  133. package/dist/resources.d.ts.map +1 -0
  134. package/dist/resources.js +643 -0
  135. package/dist/risk.d.ts +120 -0
  136. package/dist/risk.d.ts.map +1 -0
  137. package/dist/risk.js +220 -0
  138. package/dist/runtime.d.ts +73 -0
  139. package/dist/runtime.d.ts.map +1 -1
  140. package/dist/runtime.js +415 -18
  141. package/dist/schemaInference.d.ts +92 -0
  142. package/dist/schemaInference.d.ts.map +1 -0
  143. package/dist/schemaInference.js +466 -0
  144. package/dist/schema_validation.js +2 -2
  145. package/dist/schemas/config.schema.json +118 -4
  146. package/dist/security_report.js +4 -4
  147. package/dist/signing.d.ts +1 -1
  148. package/dist/signing.d.ts.map +1 -1
  149. package/dist/signing.js +4 -0
  150. package/dist/sinks/file.d.ts +19 -1
  151. package/dist/sinks/file.d.ts.map +1 -1
  152. package/dist/sinks/file.js +82 -13
  153. package/dist/sinks/https.d.ts +10 -0
  154. package/dist/sinks/https.d.ts.map +1 -1
  155. package/dist/sinks/https.js +76 -16
  156. package/dist/sinks/stdout.d.ts +1 -0
  157. package/dist/sinks/stdout.d.ts.map +1 -1
  158. package/dist/sinks/stdout.js +12 -1
  159. package/dist/spec.d.ts +159 -0
  160. package/dist/spec.d.ts.map +1 -0
  161. package/dist/spec.js +391 -0
  162. package/dist/stakeholders.d.ts +199 -0
  163. package/dist/stakeholders.d.ts.map +1 -0
  164. package/dist/stakeholders.js +398 -0
  165. package/dist/standards.d.ts.map +1 -1
  166. package/dist/standards.js +160 -2
  167. package/dist/standards_ingest.d.ts.map +1 -1
  168. package/dist/standards_ingest.js +1 -4
  169. package/dist/telemetry.d.ts +16 -2
  170. package/dist/telemetry.d.ts.map +1 -1
  171. package/dist/telemetry.js +77 -14
  172. package/dist/templates/controls/iso42001_control_catalog.json +1443 -0
  173. package/dist/traced_emitter.d.ts.map +1 -1
  174. package/dist/traced_emitter.js +19 -9
  175. package/dist/trust_package.d.ts +19 -1
  176. package/dist/trust_package.d.ts.map +1 -1
  177. package/dist/trust_package.js +89 -2
  178. package/dist/verify.d.ts.map +1 -1
  179. package/dist/verify.js +9 -2
  180. package/dist/wal.d.ts.map +1 -1
  181. package/dist/wal.js +2 -1
  182. package/package.json +14 -1
  183. package/scripts/postinstall.js +105 -210
  184. package/templates/controls/iso42001_control_catalog.json +1443 -0
@@ -6,10 +6,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.StdoutSink = void 0;
7
7
  const util_1 = require("util");
8
8
  class StdoutSink {
9
- constructor(format = 'json') {
9
+ constructor(format = 'pretty') {
10
10
  this.format = format;
11
+ this.quiet = isQuietMode();
11
12
  }
12
13
  emit(events) {
14
+ if (this.quiet) {
15
+ return;
16
+ }
13
17
  for (const event of events) {
14
18
  try {
15
19
  const payload = this.format === 'pretty'
@@ -32,3 +36,10 @@ class StdoutSink {
32
36
  }
33
37
  }
34
38
  exports.StdoutSink = StdoutSink;
39
+ function isQuietMode() {
40
+ const raw = String(process.env.MONORA_QUIET || '').trim().toLowerCase();
41
+ if (!raw) {
42
+ return false;
43
+ }
44
+ return ['1', 'true', 'yes', 'on'].includes(raw);
45
+ }
package/dist/spec.d.ts ADDED
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Monora Schema Specification Types
3
+ *
4
+ * Provides typed schema definitions for AI model monitoring with
5
+ * field specifications, PII detection, and compliance configuration.
6
+ */
7
+ /** Field data types for schema definition */
8
+ export type FieldType = 'string' | 'number' | 'integer' | 'boolean' | 'array' | 'object';
9
+ /** Types of PII that can be detected in fields */
10
+ export type PIIType = 'email' | 'phone' | 'ssn' | 'credit_card' | 'name' | 'address' | 'ip_address' | 'date_of_birth' | 'custom';
11
+ /** Field role in the AI system */
12
+ export type FieldRole = 'input' | 'output' | 'metadata' | 'identifier';
13
+ /**
14
+ * Specification for a single field in the schema.
15
+ */
16
+ export interface FieldSpec {
17
+ /** Field name (supports dot notation for nested fields) */
18
+ name: string;
19
+ /** Data type of the field */
20
+ dataType: FieldType;
21
+ /** Whether the field is required */
22
+ required?: boolean;
23
+ /** Whether the field can be null */
24
+ nullable?: boolean;
25
+ /** Human-readable description */
26
+ description?: string;
27
+ /** Type of PII contained, if any */
28
+ piiType?: PIIType;
29
+ /** Regex pattern for redacting PII */
30
+ redactionPattern?: string;
31
+ /** Minimum value for numeric fields */
32
+ minValue?: number;
33
+ /** Maximum value for numeric fields */
34
+ maxValue?: number;
35
+ /** Regex pattern for string validation */
36
+ pattern?: string;
37
+ /** Role of the field (input/output/metadata/identifier) */
38
+ role?: FieldRole;
39
+ }
40
+ /**
41
+ * Create a FieldSpec with defaults applied.
42
+ */
43
+ export declare function createFieldSpec(name: string, dataType: FieldType, options?: Partial<Omit<FieldSpec, 'name' | 'dataType'>>): FieldSpec;
44
+ /**
45
+ * Convert FieldSpec to JSON Schema property definition.
46
+ */
47
+ export declare function fieldSpecToJsonSchema(spec: FieldSpec): Record<string, any>;
48
+ /**
49
+ * Convert FieldSpec to a redaction rule for data handling.
50
+ */
51
+ export declare function fieldSpecToRedactionRule(spec: FieldSpec): Record<string, any> | null;
52
+ /**
53
+ * Enrichment configuration for compliance features.
54
+ */
55
+ export interface EnrichmentConfig {
56
+ /** Enable bias detection */
57
+ biasDetection?: boolean;
58
+ /** Enable risk tracking */
59
+ riskTracking?: boolean;
60
+ /** Enable human oversight */
61
+ humanOversight?: boolean;
62
+ /** Enable data redaction */
63
+ dataRedaction?: boolean;
64
+ /** Enable identity tracking */
65
+ identityTracking?: boolean;
66
+ /** Enable cost tracking */
67
+ costTracking?: boolean;
68
+ /** Enable immutability/hash chain */
69
+ immutability?: boolean;
70
+ /** Enable event signing */
71
+ signing?: boolean;
72
+ /** Enable data governance */
73
+ dataGovernance?: boolean;
74
+ /** Enable lifecycle tracking */
75
+ lifecycleTracking?: boolean;
76
+ /** Enable data residency enforcement */
77
+ dataResidency?: boolean;
78
+ }
79
+ /**
80
+ * Create default EnrichmentConfig.
81
+ */
82
+ export declare function createEnrichmentConfig(options?: Partial<EnrichmentConfig>): EnrichmentConfig;
83
+ /**
84
+ * Get enrichment configuration for a specific compliance framework.
85
+ */
86
+ export declare function enrichmentConfigForFramework(framework: string): EnrichmentConfig;
87
+ /**
88
+ * Merge two enrichment configurations (union of enabled features).
89
+ */
90
+ export declare function mergeEnrichmentConfigs(base: EnrichmentConfig, other: EnrichmentConfig): EnrichmentConfig;
91
+ /**
92
+ * MonoraSpec - Complete schema specification for an AI model.
93
+ */
94
+ export interface MonoraSpec {
95
+ /** Input fields (prompts, queries, etc.) */
96
+ inputs: FieldSpec[];
97
+ /** Output fields (responses, completions, etc.) */
98
+ outputs: FieldSpec[];
99
+ /** Metadata fields (timestamps, service info, etc.) */
100
+ metadata?: FieldSpec[];
101
+ /** Identifier fields (trace_id, event_id, etc.) */
102
+ identifiers?: FieldSpec[];
103
+ /** Enrichment configuration */
104
+ enrichments?: EnrichmentConfig;
105
+ /** Compliance frameworks to target */
106
+ complianceTargets?: string[];
107
+ /** Model/application name */
108
+ modelName?: string;
109
+ /** Model version */
110
+ modelVersion?: string;
111
+ /** Human-readable description */
112
+ description?: string;
113
+ /** Event timestamp field name */
114
+ eventTimestampField?: string;
115
+ }
116
+ /**
117
+ * Create a MonoraSpec with defaults applied.
118
+ */
119
+ export declare function createMonoraSpec(options: {
120
+ inputs: FieldSpec[];
121
+ outputs: FieldSpec[];
122
+ metadata?: FieldSpec[];
123
+ identifiers?: FieldSpec[];
124
+ enrichments?: EnrichmentConfig;
125
+ complianceTargets?: string[];
126
+ modelName?: string;
127
+ modelVersion?: string;
128
+ description?: string;
129
+ eventTimestampField?: string;
130
+ }): MonoraSpec;
131
+ /**
132
+ * Get all fields from a MonoraSpec.
133
+ */
134
+ export declare function getAllFields(spec: MonoraSpec): FieldSpec[];
135
+ /**
136
+ * Get fields with PII from a MonoraSpec.
137
+ */
138
+ export declare function getPiiFields(spec: MonoraSpec): FieldSpec[];
139
+ /**
140
+ * Convert MonoraSpec to schema contract format for onboarding validation.
141
+ */
142
+ export declare function specToSchemaContract(spec: MonoraSpec): Record<string, any>;
143
+ /**
144
+ * Convert MonoraSpec to Monora configuration format.
145
+ */
146
+ export declare function specToConfig(spec: MonoraSpec): Record<string, any>;
147
+ /**
148
+ * Create MonoraSpec from a schema contract.
149
+ */
150
+ export declare function specFromSchemaContract(contract: Record<string, any>): MonoraSpec;
151
+ /**
152
+ * Convert MonoraSpec to dictionary representation.
153
+ */
154
+ export declare function specToDict(spec: MonoraSpec): Record<string, any>;
155
+ /**
156
+ * Create MonoraSpec from dictionary representation.
157
+ */
158
+ export declare function specFromDict(data: Record<string, any>): MonoraSpec;
159
+ //# sourceMappingURL=spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../src/spec.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,6CAA6C;AAC7C,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEzF,kDAAkD;AAClD,MAAM,MAAM,OAAO,GACf,OAAO,GACP,OAAO,GACP,KAAK,GACL,aAAa,GACb,MAAM,GACN,SAAS,GACT,YAAY,GACZ,eAAe,GACf,QAAQ,CAAC;AAEb,kCAAkC;AAClC,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,YAAY,CAAC;AAEvE;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,QAAQ,EAAE,SAAS,CAAC;IACpB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sCAAsC;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,SAAS,EACnB,OAAO,GAAE,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,CAAC,CAAM,GAC1D,SAAS,CAcX;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAsB1E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAsBpF;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,4BAA4B;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,2BAA2B;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,6BAA6B;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,4BAA4B;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,+BAA+B;IAC/B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,2BAA2B;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,qCAAqC;IACrC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,2BAA2B;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6BAA6B;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gCAAgC;IAChC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,wCAAwC;IACxC,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAyDD;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,OAAO,CAAC,gBAAgB,CAAM,GACtC,gBAAgB,CAclB;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,CAIhF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,gBAAgB,GACtB,gBAAgB,CAclB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,4CAA4C;IAC5C,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,mDAAmD;IACnD,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC;IACvB,mDAAmD;IACnD,WAAW,CAAC,EAAE,SAAS,EAAE,CAAC;IAC1B,+BAA+B;IAC/B,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,sCAAsC;IACtC,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iCAAiC;IACjC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE;IACxC,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,SAAS,EAAE,CAAC;IAC1B,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,GAAG,UAAU,CAab;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,EAAE,CAO1D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,EAAE,CAE1D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAgC1E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAwElE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,UAAU,CAkChF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAahE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,UAAU,CAalE"}
package/dist/spec.js ADDED
@@ -0,0 +1,391 @@
1
+ "use strict";
2
+ /**
3
+ * Monora Schema Specification Types
4
+ *
5
+ * Provides typed schema definitions for AI model monitoring with
6
+ * field specifications, PII detection, and compliance configuration.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.createFieldSpec = createFieldSpec;
10
+ exports.fieldSpecToJsonSchema = fieldSpecToJsonSchema;
11
+ exports.fieldSpecToRedactionRule = fieldSpecToRedactionRule;
12
+ exports.createEnrichmentConfig = createEnrichmentConfig;
13
+ exports.enrichmentConfigForFramework = enrichmentConfigForFramework;
14
+ exports.mergeEnrichmentConfigs = mergeEnrichmentConfigs;
15
+ exports.createMonoraSpec = createMonoraSpec;
16
+ exports.getAllFields = getAllFields;
17
+ exports.getPiiFields = getPiiFields;
18
+ exports.specToSchemaContract = specToSchemaContract;
19
+ exports.specToConfig = specToConfig;
20
+ exports.specFromSchemaContract = specFromSchemaContract;
21
+ exports.specToDict = specToDict;
22
+ exports.specFromDict = specFromDict;
23
+ /**
24
+ * Create a FieldSpec with defaults applied.
25
+ */
26
+ function createFieldSpec(name, dataType, options = {}) {
27
+ return {
28
+ name,
29
+ dataType,
30
+ required: options.required ?? true,
31
+ nullable: options.nullable ?? false,
32
+ description: options.description,
33
+ piiType: options.piiType,
34
+ redactionPattern: options.redactionPattern,
35
+ minValue: options.minValue,
36
+ maxValue: options.maxValue,
37
+ pattern: options.pattern,
38
+ role: options.role,
39
+ };
40
+ }
41
+ /**
42
+ * Convert FieldSpec to JSON Schema property definition.
43
+ */
44
+ function fieldSpecToJsonSchema(spec) {
45
+ const schema = {
46
+ type: spec.dataType,
47
+ };
48
+ if (spec.description) {
49
+ schema.description = spec.description;
50
+ }
51
+ if (spec.minValue !== undefined) {
52
+ schema.minimum = spec.minValue;
53
+ }
54
+ if (spec.maxValue !== undefined) {
55
+ schema.maximum = spec.maxValue;
56
+ }
57
+ if (spec.pattern) {
58
+ schema.pattern = spec.pattern;
59
+ }
60
+ return schema;
61
+ }
62
+ /**
63
+ * Convert FieldSpec to a redaction rule for data handling.
64
+ */
65
+ function fieldSpecToRedactionRule(spec) {
66
+ if (!spec.piiType) {
67
+ return null;
68
+ }
69
+ const patterns = {
70
+ email: '[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}',
71
+ phone: '\\+?[\\d\\s\\-\\(\\)]{10,}',
72
+ ssn: '\\d{3}-?\\d{2}-?\\d{4}',
73
+ credit_card: '\\d{4}[\\s\\-]?\\d{4}[\\s\\-]?\\d{4}[\\s\\-]?\\d{4}',
74
+ ip_address: '\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}',
75
+ name: '.*',
76
+ address: '.*',
77
+ date_of_birth: '\\d{4}-\\d{2}-\\d{2}',
78
+ custom: '.*',
79
+ };
80
+ return {
81
+ fields: [spec.name],
82
+ pattern: spec.redactionPattern || patterns[spec.piiType],
83
+ replacement: `[REDACTED:${spec.piiType.toUpperCase()}]`,
84
+ };
85
+ }
86
+ /** Framework to enrichment mapping */
87
+ const FRAMEWORK_ENRICHMENTS = {
88
+ gdpr: {
89
+ dataRedaction: true,
90
+ dataGovernance: true,
91
+ identityTracking: true,
92
+ dataResidency: true,
93
+ },
94
+ soc2: {
95
+ identityTracking: true,
96
+ riskTracking: true,
97
+ immutability: true,
98
+ signing: true,
99
+ },
100
+ iso42001: {
101
+ riskTracking: true,
102
+ humanOversight: true,
103
+ biasDetection: true,
104
+ lifecycleTracking: true,
105
+ dataGovernance: true,
106
+ },
107
+ eu_ai_act: {
108
+ riskTracking: true,
109
+ humanOversight: true,
110
+ biasDetection: true,
111
+ dataGovernance: true,
112
+ lifecycleTracking: true,
113
+ },
114
+ hipaa: {
115
+ dataRedaction: true,
116
+ identityTracking: true,
117
+ immutability: true,
118
+ signing: true,
119
+ dataGovernance: true,
120
+ },
121
+ iso27001: {
122
+ immutability: true,
123
+ signing: true,
124
+ identityTracking: true,
125
+ riskTracking: true,
126
+ },
127
+ pci_dss: {
128
+ dataRedaction: true,
129
+ immutability: true,
130
+ signing: true,
131
+ identityTracking: true,
132
+ },
133
+ nist_ai_rmf: {
134
+ riskTracking: true,
135
+ humanOversight: true,
136
+ biasDetection: true,
137
+ lifecycleTracking: true,
138
+ },
139
+ };
140
+ /**
141
+ * Create default EnrichmentConfig.
142
+ */
143
+ function createEnrichmentConfig(options = {}) {
144
+ return {
145
+ biasDetection: options.biasDetection ?? false,
146
+ riskTracking: options.riskTracking ?? false,
147
+ humanOversight: options.humanOversight ?? false,
148
+ dataRedaction: options.dataRedaction ?? true,
149
+ identityTracking: options.identityTracking ?? false,
150
+ costTracking: options.costTracking ?? false,
151
+ immutability: options.immutability ?? true,
152
+ signing: options.signing ?? false,
153
+ dataGovernance: options.dataGovernance ?? false,
154
+ lifecycleTracking: options.lifecycleTracking ?? false,
155
+ dataResidency: options.dataResidency ?? false,
156
+ };
157
+ }
158
+ /**
159
+ * Get enrichment configuration for a specific compliance framework.
160
+ */
161
+ function enrichmentConfigForFramework(framework) {
162
+ const frameworkLower = framework.toLowerCase().replace(/-/g, '_');
163
+ const frameworkConfig = FRAMEWORK_ENRICHMENTS[frameworkLower] || {};
164
+ return createEnrichmentConfig(frameworkConfig);
165
+ }
166
+ /**
167
+ * Merge two enrichment configurations (union of enabled features).
168
+ */
169
+ function mergeEnrichmentConfigs(base, other) {
170
+ return {
171
+ biasDetection: base.biasDetection || other.biasDetection,
172
+ riskTracking: base.riskTracking || other.riskTracking,
173
+ humanOversight: base.humanOversight || other.humanOversight,
174
+ dataRedaction: base.dataRedaction || other.dataRedaction,
175
+ identityTracking: base.identityTracking || other.identityTracking,
176
+ costTracking: base.costTracking || other.costTracking,
177
+ immutability: base.immutability || other.immutability,
178
+ signing: base.signing || other.signing,
179
+ dataGovernance: base.dataGovernance || other.dataGovernance,
180
+ lifecycleTracking: base.lifecycleTracking || other.lifecycleTracking,
181
+ dataResidency: base.dataResidency || other.dataResidency,
182
+ };
183
+ }
184
+ /**
185
+ * Create a MonoraSpec with defaults applied.
186
+ */
187
+ function createMonoraSpec(options) {
188
+ return {
189
+ inputs: options.inputs,
190
+ outputs: options.outputs,
191
+ metadata: options.metadata ?? [],
192
+ identifiers: options.identifiers ?? [],
193
+ enrichments: options.enrichments ?? createEnrichmentConfig(),
194
+ complianceTargets: options.complianceTargets ?? [],
195
+ modelName: options.modelName,
196
+ modelVersion: options.modelVersion ?? '1.0.0',
197
+ description: options.description,
198
+ eventTimestampField: options.eventTimestampField ?? 'timestamp',
199
+ };
200
+ }
201
+ /**
202
+ * Get all fields from a MonoraSpec.
203
+ */
204
+ function getAllFields(spec) {
205
+ return [
206
+ ...spec.inputs,
207
+ ...spec.outputs,
208
+ ...(spec.metadata || []),
209
+ ...(spec.identifiers || []),
210
+ ];
211
+ }
212
+ /**
213
+ * Get fields with PII from a MonoraSpec.
214
+ */
215
+ function getPiiFields(spec) {
216
+ return getAllFields(spec).filter((f) => f.piiType);
217
+ }
218
+ /**
219
+ * Convert MonoraSpec to schema contract format for onboarding validation.
220
+ */
221
+ function specToSchemaContract(spec) {
222
+ const properties = {};
223
+ const required = [];
224
+ for (const field of getAllFields(spec)) {
225
+ properties[field.name] = fieldSpecToJsonSchema(field);
226
+ if (field.required) {
227
+ required.push(field.name);
228
+ }
229
+ }
230
+ return {
231
+ $schema: 'http://json-schema.org/draft-07/schema#',
232
+ type: 'object',
233
+ properties,
234
+ required,
235
+ roles: {
236
+ inputs: spec.inputs.map((f) => f.name),
237
+ outputs: spec.outputs.map((f) => f.name),
238
+ metadata: (spec.metadata || []).map((f) => f.name),
239
+ identifiers: (spec.identifiers || []).map((f) => f.name),
240
+ },
241
+ pii_fields: getPiiFields(spec).map((f) => ({
242
+ field: f.name,
243
+ type: f.piiType,
244
+ })),
245
+ model_info: {
246
+ name: spec.modelName,
247
+ version: spec.modelVersion,
248
+ description: spec.description,
249
+ },
250
+ };
251
+ }
252
+ /**
253
+ * Convert MonoraSpec to Monora configuration format.
254
+ */
255
+ function specToConfig(spec) {
256
+ const enrichments = spec.enrichments || createEnrichmentConfig();
257
+ const redactionRules = [];
258
+ // Build redaction rules from PII fields
259
+ for (const field of getPiiFields(spec)) {
260
+ const rule = fieldSpecToRedactionRule(field);
261
+ if (rule) {
262
+ redactionRules.push(rule);
263
+ }
264
+ }
265
+ const config = {
266
+ defaults: {
267
+ service_name: spec.modelName || 'monora-model',
268
+ },
269
+ model_spec: {
270
+ name: spec.modelName || 'monora-model',
271
+ version: spec.modelVersion || '1.0.0',
272
+ event_ts_field: spec.eventTimestampField || 'timestamp',
273
+ roles: {
274
+ inputs: spec.inputs.map((f) => f.name),
275
+ outputs: spec.outputs.map((f) => f.name),
276
+ metadata: (spec.metadata || []).map((f) => f.name),
277
+ identifiers: (spec.identifiers || []).map((f) => f.name),
278
+ },
279
+ },
280
+ immutability: {
281
+ enabled: enrichments.immutability ?? true,
282
+ verify_on_emit: true,
283
+ },
284
+ signing: {
285
+ enabled: enrichments.signing ?? false,
286
+ },
287
+ identity: {
288
+ enabled: enrichments.identityTracking ?? false,
289
+ },
290
+ risk_register: {
291
+ enabled: enrichments.riskTracking ?? false,
292
+ },
293
+ bias: {
294
+ enabled: enrichments.biasDetection ?? false,
295
+ },
296
+ human_oversight: {
297
+ enabled: enrichments.humanOversight ?? false,
298
+ },
299
+ data_governance: {
300
+ enabled: enrichments.dataGovernance ?? false,
301
+ },
302
+ lifecycle: {
303
+ enabled: enrichments.lifecycleTracking ?? false,
304
+ },
305
+ };
306
+ // Add data handling if redaction enabled
307
+ if (enrichments.dataRedaction && redactionRules.length > 0) {
308
+ config.data_handling = {
309
+ enabled: true,
310
+ mode: 'redact',
311
+ rules: redactionRules,
312
+ };
313
+ }
314
+ // Add compliance targets
315
+ if (spec.complianceTargets && spec.complianceTargets.length > 0) {
316
+ config.onboarding = {
317
+ enabled: true,
318
+ standards: spec.complianceTargets.map((t) => t.toUpperCase()),
319
+ };
320
+ }
321
+ return config;
322
+ }
323
+ /**
324
+ * Create MonoraSpec from a schema contract.
325
+ */
326
+ function specFromSchemaContract(contract) {
327
+ const roles = contract.roles || {};
328
+ const properties = contract.properties || {};
329
+ const piiFieldsRaw = contract.pii_fields || [];
330
+ const modelInfo = contract.model_info || {};
331
+ const piiMap = new Map();
332
+ for (const pii of piiFieldsRaw) {
333
+ if (pii.field && pii.type) {
334
+ piiMap.set(pii.field, pii.type);
335
+ }
336
+ }
337
+ const createFieldsFromRoles = (roleNames, role) => {
338
+ return (roleNames || []).map((name) => {
339
+ const prop = properties[name] || {};
340
+ return createFieldSpec(name, prop.type || 'string', {
341
+ description: prop.description,
342
+ piiType: piiMap.get(name),
343
+ required: (contract.required || []).includes(name),
344
+ role,
345
+ });
346
+ });
347
+ };
348
+ return createMonoraSpec({
349
+ inputs: createFieldsFromRoles(roles.inputs || [], 'input'),
350
+ outputs: createFieldsFromRoles(roles.outputs || [], 'output'),
351
+ metadata: createFieldsFromRoles(roles.metadata || [], 'metadata'),
352
+ identifiers: createFieldsFromRoles(roles.identifiers || [], 'identifier'),
353
+ modelName: modelInfo.name,
354
+ modelVersion: modelInfo.version,
355
+ description: modelInfo.description,
356
+ });
357
+ }
358
+ /**
359
+ * Convert MonoraSpec to dictionary representation.
360
+ */
361
+ function specToDict(spec) {
362
+ return {
363
+ inputs: spec.inputs,
364
+ outputs: spec.outputs,
365
+ metadata: spec.metadata || [],
366
+ identifiers: spec.identifiers || [],
367
+ enrichments: spec.enrichments || createEnrichmentConfig(),
368
+ compliance_targets: spec.complianceTargets || [],
369
+ model_name: spec.modelName,
370
+ model_version: spec.modelVersion,
371
+ description: spec.description,
372
+ event_timestamp_field: spec.eventTimestampField,
373
+ };
374
+ }
375
+ /**
376
+ * Create MonoraSpec from dictionary representation.
377
+ */
378
+ function specFromDict(data) {
379
+ return createMonoraSpec({
380
+ inputs: data.inputs || [],
381
+ outputs: data.outputs || [],
382
+ metadata: data.metadata || [],
383
+ identifiers: data.identifiers || [],
384
+ enrichments: data.enrichments,
385
+ complianceTargets: data.compliance_targets || data.complianceTargets,
386
+ modelName: data.model_name || data.modelName,
387
+ modelVersion: data.model_version || data.modelVersion,
388
+ description: data.description,
389
+ eventTimestampField: data.event_timestamp_field || data.eventTimestampField,
390
+ });
391
+ }