monora-ai 2.1.0 → 2.1.4

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 (193) hide show
  1. package/README.md +339 -158
  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 +525 -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 +1564 -177
  36. package/dist/complianceConsolidation.d.ts +17 -0
  37. package/dist/complianceConsolidation.d.ts.map +1 -0
  38. package/dist/complianceConsolidation.js +68 -0
  39. package/dist/complianceTargets.d.ts +111 -0
  40. package/dist/complianceTargets.d.ts.map +1 -0
  41. package/dist/complianceTargets.js +521 -0
  42. package/dist/config.d.ts +261 -16
  43. package/dist/config.d.ts.map +1 -1
  44. package/dist/config.js +381 -32
  45. package/dist/config_migrations.d.ts.map +1 -1
  46. package/dist/config_migrations.js +38 -1
  47. package/dist/config_schema.d.ts +2490 -1035
  48. package/dist/config_schema.d.ts.map +1 -1
  49. package/dist/config_schema.js +233 -64
  50. package/dist/context.d.ts +34 -0
  51. package/dist/context.d.ts.map +1 -1
  52. package/dist/context.js +118 -7
  53. package/dist/control_backbone.d.ts +128 -0
  54. package/dist/control_backbone.d.ts.map +1 -0
  55. package/dist/control_backbone.js +826 -0
  56. package/dist/data-governance.d.ts +187 -0
  57. package/dist/data-governance.d.ts.map +1 -0
  58. package/dist/data-governance.js +424 -0
  59. package/dist/dataResidency.d.ts +44 -0
  60. package/dist/dataResidency.d.ts.map +1 -0
  61. package/dist/dataResidency.js +203 -0
  62. package/dist/dispatcher.d.ts.map +1 -1
  63. package/dist/dispatcher.js +17 -5
  64. package/dist/evidence_store.d.ts +103 -0
  65. package/dist/evidence_store.d.ts.map +1 -0
  66. package/dist/evidence_store.js +459 -0
  67. package/dist/executiveSummary.d.ts +15 -0
  68. package/dist/executiveSummary.d.ts.map +1 -1
  69. package/dist/executiveSummary.js +135 -22
  70. package/dist/identity.d.ts +143 -0
  71. package/dist/identity.d.ts.map +1 -0
  72. package/dist/identity.js +231 -0
  73. package/dist/impact-assessment.d.ts +350 -0
  74. package/dist/impact-assessment.d.ts.map +1 -0
  75. package/dist/impact-assessment.js +580 -0
  76. package/dist/index.d.ts +21 -4
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +254 -5
  79. package/dist/instrumentation.d.ts +1 -1
  80. package/dist/instrumentation.d.ts.map +1 -1
  81. package/dist/instrumentation.js +123 -22
  82. package/dist/integrations/anthropic.d.ts +3 -0
  83. package/dist/integrations/anthropic.d.ts.map +1 -1
  84. package/dist/integrations/anthropic.js +282 -80
  85. package/dist/integrations/governance.d.ts +33 -0
  86. package/dist/integrations/governance.d.ts.map +1 -0
  87. package/dist/integrations/governance.js +208 -0
  88. package/dist/integrations/langchain.d.ts +4 -0
  89. package/dist/integrations/langchain.d.ts.map +1 -1
  90. package/dist/integrations/langchain.js +362 -142
  91. package/dist/integrations/openai.d.ts +9 -0
  92. package/dist/integrations/openai.d.ts.map +1 -1
  93. package/dist/integrations/openai.js +673 -73
  94. package/dist/iso42001_consolidation.d.ts +16 -0
  95. package/dist/iso42001_consolidation.d.ts.map +1 -0
  96. package/dist/iso42001_consolidation.js +413 -0
  97. package/dist/iso42001_workflows.d.ts +263 -0
  98. package/dist/iso42001_workflows.d.ts.map +1 -0
  99. package/dist/iso42001_workflows.js +781 -0
  100. package/dist/lifecycle.d.ts +299 -0
  101. package/dist/lifecycle.d.ts.map +1 -0
  102. package/dist/lifecycle.js +624 -0
  103. package/dist/lineage.d.ts +2 -2
  104. package/dist/lineage.d.ts.map +1 -1
  105. package/dist/lineage.js +9 -16
  106. package/dist/middleware/express.d.ts.map +1 -1
  107. package/dist/middleware/express.js +18 -3
  108. package/dist/middleware/nextjs.js +2 -2
  109. package/dist/model.d.ts +143 -0
  110. package/dist/model.d.ts.map +1 -0
  111. package/dist/model.js +371 -0
  112. package/dist/onboarding.d.ts +42 -0
  113. package/dist/onboarding.d.ts.map +1 -0
  114. package/dist/onboarding.js +1075 -0
  115. package/dist/oversight.d.ts +264 -0
  116. package/dist/oversight.d.ts.map +1 -0
  117. package/dist/oversight.js +497 -0
  118. package/dist/presets.js +7 -7
  119. package/dist/quotas.d.ts +171 -0
  120. package/dist/quotas.d.ts.map +1 -0
  121. package/dist/quotas.js +259 -0
  122. package/dist/register.d.ts +13 -0
  123. package/dist/register.d.ts.map +1 -0
  124. package/dist/register.js +99 -0
  125. package/dist/registry.d.ts +1 -0
  126. package/dist/registry.d.ts.map +1 -1
  127. package/dist/registry.js +7 -0
  128. package/dist/registryData.json +43 -6
  129. package/dist/report.d.ts +2 -1
  130. package/dist/report.d.ts.map +1 -1
  131. package/dist/report.js +189 -2
  132. package/dist/reporting.d.ts +125 -0
  133. package/dist/reporting.d.ts.map +1 -1
  134. package/dist/reporting.js +192 -2
  135. package/dist/resources.d.ts +285 -0
  136. package/dist/resources.d.ts.map +1 -0
  137. package/dist/resources.js +643 -0
  138. package/dist/risk.d.ts +120 -0
  139. package/dist/risk.d.ts.map +1 -0
  140. package/dist/risk.js +220 -0
  141. package/dist/runtime.d.ts +74 -0
  142. package/dist/runtime.d.ts.map +1 -1
  143. package/dist/runtime.js +416 -18
  144. package/dist/schemaInference.d.ts +92 -0
  145. package/dist/schemaInference.d.ts.map +1 -0
  146. package/dist/schemaInference.js +466 -0
  147. package/dist/schema_validation.js +2 -2
  148. package/dist/schemas/config.schema.json +118 -4
  149. package/dist/security_report.js +4 -4
  150. package/dist/signing.d.ts +1 -1
  151. package/dist/signing.d.ts.map +1 -1
  152. package/dist/signing.js +4 -0
  153. package/dist/sinks/file.d.ts +19 -1
  154. package/dist/sinks/file.d.ts.map +1 -1
  155. package/dist/sinks/file.js +82 -13
  156. package/dist/sinks/https.d.ts +10 -0
  157. package/dist/sinks/https.d.ts.map +1 -1
  158. package/dist/sinks/https.js +76 -16
  159. package/dist/sinks/stdout.d.ts +1 -0
  160. package/dist/sinks/stdout.d.ts.map +1 -1
  161. package/dist/sinks/stdout.js +12 -1
  162. package/dist/spec.d.ts +159 -0
  163. package/dist/spec.d.ts.map +1 -0
  164. package/dist/spec.js +391 -0
  165. package/dist/stakeholders.d.ts +199 -0
  166. package/dist/stakeholders.d.ts.map +1 -0
  167. package/dist/stakeholders.js +398 -0
  168. package/dist/standards.d.ts.map +1 -1
  169. package/dist/standards.js +160 -2
  170. package/dist/standards_ingest.d.ts.map +1 -1
  171. package/dist/standards_ingest.js +1 -4
  172. package/dist/telemetry.d.ts +16 -2
  173. package/dist/telemetry.d.ts.map +1 -1
  174. package/dist/telemetry.js +77 -14
  175. package/dist/templates/controls/gdpr_control_catalog.json +261 -0
  176. package/dist/templates/controls/iso42001_control_catalog.json +1443 -0
  177. package/dist/templates/controls/soc2_control_catalog.json +163 -0
  178. package/dist/templates/standards/iso42001_claims.json +72 -0
  179. package/dist/traced_emitter.d.ts.map +1 -1
  180. package/dist/traced_emitter.js +19 -9
  181. package/dist/trust_package.d.ts +20 -1
  182. package/dist/trust_package.d.ts.map +1 -1
  183. package/dist/trust_package.js +90 -2
  184. package/dist/verify.d.ts.map +1 -1
  185. package/dist/verify.js +9 -2
  186. package/dist/wal.d.ts.map +1 -1
  187. package/dist/wal.js +2 -1
  188. package/package.json +14 -1
  189. package/scripts/postinstall.js +105 -210
  190. package/templates/controls/gdpr_control_catalog.json +261 -0
  191. package/templates/controls/iso42001_control_catalog.json +1443 -0
  192. package/templates/controls/soc2_control_catalog.json +163 -0
  193. package/templates/standards/iso42001_claims.json +72 -0
@@ -22,8 +22,16 @@
22
22
  */
23
23
  Object.defineProperty(exports, "__esModule", { value: true });
24
24
  exports.patchAnthropic = patchAnthropic;
25
+ exports.wrapMessagesCreate = wrapMessagesCreate;
26
+ exports.wrapMessagesStream = wrapMessagesStream;
27
+ exports.wrapCompletions = wrapCompletions;
25
28
  const runtime_1 = require("../runtime");
29
+ const data_handling_1 = require("../data_handling");
30
+ const policy_1 = require("../policy");
31
+ const quotas_1 = require("../quotas");
32
+ const context_1 = require("../context");
26
33
  const lineage_1 = require("../lineage");
34
+ const governance_1 = require("./governance");
27
35
  /**
28
36
  * Patch an Anthropic client to automatically trace all API calls.
29
37
  */
@@ -45,57 +53,110 @@ function patchAnthropic(client, options = {}) {
45
53
  client.completions.create = wrapCompletions(originalCreate, dataClassification, purpose, reason);
46
54
  }
47
55
  }
56
+ function isGovernanceError(error) {
57
+ return (error instanceof data_handling_1.DataHandlingViolation ||
58
+ error instanceof policy_1.PolicyViolation ||
59
+ error instanceof quotas_1.QuotaExceededError);
60
+ }
48
61
  function wrapMessagesCreate(originalFn, dataClassification, purpose, reason) {
49
62
  return async function wrappedMessagesCreate(...args) {
50
63
  const kwargs = args[0] || {};
51
64
  const model = kwargs.model || 'unknown';
52
65
  const messages = kwargs.messages || [];
53
66
  const isStreaming = kwargs.stream === true;
54
- const state = (0, runtime_1.ensureState)();
55
- const startEvent = state.eventBuilder.build('llm_call', {
67
+ const requestPayload = Object.keys(kwargs).length > 0 ? kwargs : { args };
68
+ const { state, trace } = (0, governance_1.preflightLlmCall)({
56
69
  model,
57
- provider: 'anthropic',
58
- api: 'messages',
59
- num_messages: messages.length,
60
- messages: messages.slice(0, 10),
61
- stream: isStreaming,
62
- max_tokens: kwargs.max_tokens,
63
- temperature: kwargs.temperature,
64
- top_p: kwargs.top_p,
65
- system: kwargs.system?.slice?.(0, 500) || null,
66
- }, {
70
+ requestPayload,
67
71
  dataClassification,
68
72
  purpose,
69
73
  reason,
74
+ provider: 'anthropic',
75
+ spanName: 'llm_call:anthropic.messages',
76
+ });
77
+ const startEvent = (0, context_1.runInContext)(trace.context, () => {
78
+ const event = state.eventBuilder.build('llm_call', {
79
+ model,
80
+ provider: 'anthropic',
81
+ api: 'messages',
82
+ num_messages: messages.length,
83
+ messages: messages.slice(0, 10),
84
+ stream: isStreaming,
85
+ max_tokens: kwargs.max_tokens,
86
+ temperature: kwargs.temperature,
87
+ top_p: kwargs.top_p,
88
+ system: kwargs.system?.slice?.(0, 500) || null,
89
+ status: 'started',
90
+ }, {
91
+ dataClassification,
92
+ purpose,
93
+ reason,
94
+ });
95
+ (0, runtime_1.emitEvent)(event);
96
+ return event;
70
97
  });
71
- (0, runtime_1.emitEvent)(startEvent);
72
98
  (0, lineage_1.setCurrentEvent)(startEvent.event_id);
73
99
  try {
74
- const response = await originalFn(...args);
100
+ const response = await originalFn.apply(this, args);
75
101
  if (isStreaming) {
76
- return wrapStreamingResponse(response, model, startEvent.event_id, dataClassification, purpose, state);
102
+ return wrapStreamingResponse(response, {
103
+ model,
104
+ parentEventId: startEvent.event_id,
105
+ dataClassification,
106
+ purpose,
107
+ reason,
108
+ state,
109
+ trace,
110
+ });
77
111
  }
78
112
  // Non-streaming response
79
113
  const completionData = extractMessageResponse(response, model);
80
- const completionEvent = state.eventBuilder.build('llm_call', completionData, {
114
+ (0, context_1.runInContext)(trace.context, () => {
115
+ const completionEvent = state.eventBuilder.build('llm_call', { ...completionData, status: 'success' }, {
116
+ dataClassification,
117
+ purpose,
118
+ parentEventId: startEvent.event_id,
119
+ });
120
+ (0, runtime_1.emitEvent)(completionEvent);
121
+ });
122
+ await (0, governance_1.postflightLlmCall)({
123
+ state,
124
+ trace,
125
+ model,
126
+ response,
81
127
  dataClassification,
82
128
  purpose,
83
- parentEventId: startEvent.event_id,
129
+ reason,
84
130
  });
85
- (0, runtime_1.emitEvent)(completionEvent);
86
131
  return response;
87
132
  }
88
133
  catch (error) {
89
- const errorEvent = state.eventBuilder.build('llm_call', {
134
+ if (isGovernanceError(error)) {
135
+ throw error;
136
+ }
137
+ (0, context_1.runInContext)(trace.context, () => {
138
+ const errorEvent = state.eventBuilder.build('llm_call', {
139
+ model,
140
+ error: error.message || String(error),
141
+ error_type: error.constructor?.name || 'Error',
142
+ status: 'error',
143
+ }, {
144
+ dataClassification,
145
+ purpose,
146
+ parentEventId: startEvent.event_id,
147
+ });
148
+ (0, runtime_1.emitEvent)(errorEvent);
149
+ });
150
+ await (0, governance_1.postflightLlmCall)({
151
+ state,
152
+ trace,
90
153
  model,
91
- error: error.message || String(error),
92
- error_type: error.constructor?.name || 'Error',
93
- }, {
154
+ response: null,
94
155
  dataClassification,
95
156
  purpose,
96
- parentEventId: startEvent.event_id,
157
+ reason,
158
+ error: true,
97
159
  });
98
- (0, runtime_1.emitEvent)(errorEvent);
99
160
  throw error;
100
161
  }
101
162
  };
@@ -105,30 +166,43 @@ function wrapMessagesStream(originalFn, dataClassification, purpose, reason) {
105
166
  const kwargs = args[0] || {};
106
167
  const model = kwargs.model || 'unknown';
107
168
  const messages = kwargs.messages || [];
108
- const state = (0, runtime_1.ensureState)();
109
- const startEvent = state.eventBuilder.build('llm_call', {
169
+ const requestPayload = Object.keys(kwargs).length > 0 ? kwargs : { args };
170
+ const { state, trace } = (0, governance_1.preflightLlmCall)({
110
171
  model,
111
- provider: 'anthropic',
112
- api: 'messages.stream',
113
- num_messages: messages.length,
114
- messages: messages.slice(0, 10),
115
- stream: true,
116
- max_tokens: kwargs.max_tokens,
117
- temperature: kwargs.temperature,
118
- }, {
172
+ requestPayload,
119
173
  dataClassification,
120
174
  purpose,
121
175
  reason,
176
+ provider: 'anthropic',
177
+ spanName: 'llm_call:anthropic.messages.stream',
178
+ });
179
+ const startEvent = (0, context_1.runInContext)(trace.context, () => {
180
+ const event = state.eventBuilder.build('llm_call', {
181
+ model,
182
+ provider: 'anthropic',
183
+ api: 'messages.stream',
184
+ num_messages: messages.length,
185
+ messages: messages.slice(0, 10),
186
+ stream: true,
187
+ max_tokens: kwargs.max_tokens,
188
+ temperature: kwargs.temperature,
189
+ status: 'started',
190
+ }, {
191
+ dataClassification,
192
+ purpose,
193
+ reason,
194
+ });
195
+ (0, runtime_1.emitEvent)(event);
196
+ return event;
122
197
  });
123
- (0, runtime_1.emitEvent)(startEvent);
124
198
  (0, lineage_1.setCurrentEvent)(startEvent.event_id);
125
- const streamManager = originalFn(...args);
199
+ const streamManager = originalFn.apply(this, args);
126
200
  // Return wrapped stream manager
127
- return new StreamManagerWrapper(streamManager, model, startEvent.event_id, dataClassification, purpose, state);
201
+ return new StreamManagerWrapper(streamManager, model, startEvent.event_id, dataClassification, purpose, reason, state, trace);
128
202
  };
129
203
  }
130
204
  class StreamManagerWrapper {
131
- constructor(streamManager, model, parentEventId, dataClassification, purpose, state) {
205
+ constructor(streamManager, model, parentEventId, dataClassification, purpose, reason, state, trace) {
132
206
  this.accumulatedText = '';
133
207
  this.usage = {};
134
208
  this.streamManager = streamManager;
@@ -136,17 +210,24 @@ class StreamManagerWrapper {
136
210
  this.parentEventId = parentEventId;
137
211
  this.dataClassification = dataClassification;
138
212
  this.purpose = purpose;
213
+ this.reason = reason;
139
214
  this.state = state;
215
+ this.trace = trace;
140
216
  }
141
217
  async *[Symbol.asyncIterator]() {
218
+ let error = null;
142
219
  try {
143
220
  for await (const event of this.streamManager) {
144
221
  this.processEvent(event);
145
222
  yield event;
146
223
  }
147
224
  }
225
+ catch (err) {
226
+ error = err;
227
+ throw err;
228
+ }
148
229
  finally {
149
- this.emitCompletion();
230
+ await this.emitCompletion(error);
150
231
  }
151
232
  }
152
233
  processEvent(event) {
@@ -163,19 +244,57 @@ class StreamManagerWrapper {
163
244
  }
164
245
  }
165
246
  }
166
- emitCompletion() {
167
- const completionEvent = this.state.eventBuilder.build('llm_call', {
247
+ async emitCompletion(error) {
248
+ if (error) {
249
+ (0, context_1.runInContext)(this.trace.context, () => {
250
+ const errorEvent = this.state.eventBuilder.build('llm_call', {
251
+ model: this.model,
252
+ error: error.message || String(error),
253
+ error_type: error.constructor?.name || 'Error',
254
+ status: 'error',
255
+ }, {
256
+ dataClassification: this.dataClassification,
257
+ purpose: this.purpose,
258
+ parentEventId: this.parentEventId,
259
+ });
260
+ (0, runtime_1.emitEvent)(errorEvent);
261
+ });
262
+ await (0, governance_1.postflightLlmCall)({
263
+ state: this.state,
264
+ trace: this.trace,
265
+ model: this.model,
266
+ response: null,
267
+ dataClassification: this.dataClassification,
268
+ purpose: this.purpose,
269
+ reason: this.reason,
270
+ error: true,
271
+ });
272
+ return;
273
+ }
274
+ (0, context_1.runInContext)(this.trace.context, () => {
275
+ const completionEvent = this.state.eventBuilder.build('llm_call', {
276
+ model: this.model,
277
+ content: this.accumulatedText.slice(0, 500) || null,
278
+ content_length: this.accumulatedText.length,
279
+ usage: this.usage,
280
+ stream_complete: true,
281
+ status: 'success',
282
+ }, {
283
+ dataClassification: this.dataClassification,
284
+ purpose: this.purpose,
285
+ parentEventId: this.parentEventId,
286
+ });
287
+ (0, runtime_1.emitEvent)(completionEvent);
288
+ });
289
+ await (0, governance_1.postflightLlmCall)({
290
+ state: this.state,
291
+ trace: this.trace,
168
292
  model: this.model,
169
- content: this.accumulatedText.slice(0, 500) || null,
170
- content_length: this.accumulatedText.length,
171
- usage: this.usage,
172
- stream_complete: true,
173
- }, {
293
+ response: this.usage ? { usage: this.usage } : null,
174
294
  dataClassification: this.dataClassification,
175
295
  purpose: this.purpose,
176
- parentEventId: this.parentEventId,
296
+ reason: this.reason,
177
297
  });
178
- (0, runtime_1.emitEvent)(completionEvent);
179
298
  }
180
299
  // Delegate other methods to underlying stream manager
181
300
  on(event, callback) {
@@ -183,15 +302,16 @@ class StreamManagerWrapper {
183
302
  return this;
184
303
  }
185
304
  get controller() {
186
- return this.streamManager.controller;
305
+ return this.streamManager?.controller;
187
306
  }
188
307
  async finalMessage() {
189
308
  return this.streamManager.finalMessage?.();
190
309
  }
191
310
  }
192
- async function* wrapStreamingResponse(stream, model, parentEventId, dataClassification, purpose, state) {
311
+ async function* wrapStreamingResponse(stream, options) {
193
312
  let accumulatedText = '';
194
313
  let usage = {};
314
+ let error = null;
195
315
  try {
196
316
  for await (const event of stream) {
197
317
  // Track content from streaming events
@@ -210,20 +330,62 @@ async function* wrapStreamingResponse(stream, model, parentEventId, dataClassifi
210
330
  yield event;
211
331
  }
212
332
  }
333
+ catch (err) {
334
+ error = err;
335
+ throw err;
336
+ }
213
337
  finally {
338
+ if (error) {
339
+ (0, context_1.runInContext)(options.trace.context, () => {
340
+ const errorEvent = options.state.eventBuilder.build('llm_call', {
341
+ model: options.model,
342
+ error: error.message || String(error),
343
+ error_type: error.constructor?.name || 'Error',
344
+ status: 'error',
345
+ }, {
346
+ dataClassification: options.dataClassification,
347
+ purpose: options.purpose,
348
+ parentEventId: options.parentEventId,
349
+ });
350
+ (0, runtime_1.emitEvent)(errorEvent);
351
+ });
352
+ await (0, governance_1.postflightLlmCall)({
353
+ state: options.state,
354
+ trace: options.trace,
355
+ model: options.model,
356
+ response: null,
357
+ dataClassification: options.dataClassification,
358
+ purpose: options.purpose,
359
+ reason: options.reason,
360
+ error: true,
361
+ });
362
+ return;
363
+ }
214
364
  // Emit completion event when stream ends
215
- const completionEvent = state.eventBuilder.build('llm_call', {
216
- model,
217
- content: accumulatedText.slice(0, 500) || null,
218
- content_length: accumulatedText.length,
219
- usage,
220
- stream_complete: true,
221
- }, {
222
- dataClassification,
223
- purpose,
224
- parentEventId,
365
+ (0, context_1.runInContext)(options.trace.context, () => {
366
+ const completionEvent = options.state.eventBuilder.build('llm_call', {
367
+ model: options.model,
368
+ content: accumulatedText.slice(0, 500) || null,
369
+ content_length: accumulatedText.length,
370
+ usage,
371
+ stream_complete: true,
372
+ status: 'success',
373
+ }, {
374
+ dataClassification: options.dataClassification,
375
+ purpose: options.purpose,
376
+ parentEventId: options.parentEventId,
377
+ });
378
+ (0, runtime_1.emitEvent)(completionEvent);
379
+ });
380
+ await (0, governance_1.postflightLlmCall)({
381
+ state: options.state,
382
+ trace: options.trace,
383
+ model: options.model,
384
+ response: usage ? { usage } : null,
385
+ dataClassification: options.dataClassification,
386
+ purpose: options.purpose,
387
+ reason: options.reason,
225
388
  });
226
- (0, runtime_1.emitEvent)(completionEvent);
227
389
  }
228
390
  }
229
391
  function extractMessageResponse(response, model) {
@@ -258,23 +420,36 @@ function wrapCompletions(originalFn, dataClassification, purpose, reason) {
258
420
  const kwargs = args[0] || {};
259
421
  const model = kwargs.model || 'unknown';
260
422
  const prompt = kwargs.prompt || '';
261
- const state = (0, runtime_1.ensureState)();
262
- const startEvent = state.eventBuilder.build('llm_call', {
423
+ const requestPayload = Object.keys(kwargs).length > 0 ? kwargs : { args };
424
+ const { state, trace } = (0, governance_1.preflightLlmCall)({
263
425
  model,
264
- provider: 'anthropic',
265
- api: 'completions',
266
- prompt: String(prompt).slice(0, 1000),
267
- max_tokens_to_sample: kwargs.max_tokens_to_sample,
268
- temperature: kwargs.temperature,
269
- }, {
426
+ requestPayload,
270
427
  dataClassification,
271
428
  purpose,
272
429
  reason,
430
+ provider: 'anthropic',
431
+ spanName: 'llm_call:anthropic.completions',
432
+ });
433
+ const startEvent = (0, context_1.runInContext)(trace.context, () => {
434
+ const event = state.eventBuilder.build('llm_call', {
435
+ model,
436
+ provider: 'anthropic',
437
+ api: 'completions',
438
+ prompt: String(prompt).slice(0, 1000),
439
+ max_tokens_to_sample: kwargs.max_tokens_to_sample,
440
+ temperature: kwargs.temperature,
441
+ status: 'started',
442
+ }, {
443
+ dataClassification,
444
+ purpose,
445
+ reason,
446
+ });
447
+ (0, runtime_1.emitEvent)(event);
448
+ return event;
273
449
  });
274
- (0, runtime_1.emitEvent)(startEvent);
275
450
  (0, lineage_1.setCurrentEvent)(startEvent.event_id);
276
451
  try {
277
- const response = await originalFn(...args);
452
+ const response = await originalFn.apply(this, args);
278
453
  const completionData = {
279
454
  model: response.model || model,
280
455
  };
@@ -284,25 +459,52 @@ function wrapCompletions(originalFn, dataClassification, purpose, reason) {
284
459
  if (response.stop_reason) {
285
460
  completionData.stop_reason = response.stop_reason;
286
461
  }
287
- const completionEvent = state.eventBuilder.build('llm_call', completionData, {
462
+ (0, context_1.runInContext)(trace.context, () => {
463
+ const completionEvent = state.eventBuilder.build('llm_call', { ...completionData, status: 'success' }, {
464
+ dataClassification,
465
+ purpose,
466
+ parentEventId: startEvent.event_id,
467
+ });
468
+ (0, runtime_1.emitEvent)(completionEvent);
469
+ });
470
+ await (0, governance_1.postflightLlmCall)({
471
+ state,
472
+ trace,
473
+ model,
474
+ response,
288
475
  dataClassification,
289
476
  purpose,
290
- parentEventId: startEvent.event_id,
477
+ reason,
291
478
  });
292
- (0, runtime_1.emitEvent)(completionEvent);
293
479
  return response;
294
480
  }
295
481
  catch (error) {
296
- const errorEvent = state.eventBuilder.build('llm_call', {
482
+ if (isGovernanceError(error)) {
483
+ throw error;
484
+ }
485
+ (0, context_1.runInContext)(trace.context, () => {
486
+ const errorEvent = state.eventBuilder.build('llm_call', {
487
+ model,
488
+ error: error.message || String(error),
489
+ error_type: error.constructor?.name || 'Error',
490
+ status: 'error',
491
+ }, {
492
+ dataClassification,
493
+ purpose,
494
+ parentEventId: startEvent.event_id,
495
+ });
496
+ (0, runtime_1.emitEvent)(errorEvent);
497
+ });
498
+ await (0, governance_1.postflightLlmCall)({
499
+ state,
500
+ trace,
297
501
  model,
298
- error: error.message || String(error),
299
- error_type: error.constructor?.name || 'Error',
300
- }, {
502
+ response: null,
301
503
  dataClassification,
302
504
  purpose,
303
- parentEventId: startEvent.event_id,
505
+ reason,
506
+ error: true,
304
507
  });
305
- (0, runtime_1.emitEvent)(errorEvent);
306
508
  throw error;
307
509
  }
308
510
  };
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Shared governance helpers for SDK integrations.
3
+ */
4
+ import { ensureState } from '../runtime';
5
+ import type { Span, TraceContext } from '../context';
6
+ export interface LlmTrace {
7
+ span: Span;
8
+ context: TraceContext;
9
+ isRoot: boolean;
10
+ }
11
+ export declare function preflightLlmCall(options: {
12
+ model?: string;
13
+ requestPayload: any;
14
+ dataClassification: string;
15
+ purpose: string;
16
+ reason?: string;
17
+ provider?: string;
18
+ spanName: string;
19
+ }): {
20
+ state: ReturnType<typeof ensureState>;
21
+ trace: LlmTrace;
22
+ };
23
+ export declare function postflightLlmCall(options: {
24
+ state: ReturnType<typeof ensureState>;
25
+ trace: LlmTrace;
26
+ model?: string;
27
+ response: any;
28
+ dataClassification: string;
29
+ purpose: string;
30
+ reason?: string;
31
+ error?: boolean;
32
+ }): Promise<void>;
33
+ //# sourceMappingURL=governance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"governance.d.ts","sourceRoot":"","sources":["../../src/integrations/governance.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAIL,WAAW,EAIZ,MAAM,YAAY,CAAC;AAYpB,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAIrD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;CACjB;AA6DD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,GAAG,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG;IAAE,KAAK,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,CAoH7D;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAC/C,KAAK,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;IACtC,KAAK,EAAE,QAAQ,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,GAAG,CAAC;IACd,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2ChB"}