monora-ai 2.0.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 (202) hide show
  1. package/README.md +441 -150
  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 +269 -0
  12. package/dist/assessment.d.ts.map +1 -0
  13. package/dist/assessment.js +1232 -0
  14. package/dist/attestation.js +23 -1
  15. package/dist/attribution.d.ts +349 -0
  16. package/dist/attribution.d.ts.map +1 -0
  17. package/dist/attribution.js +987 -0
  18. package/dist/autodetect.d.ts +69 -1
  19. package/dist/autodetect.d.ts.map +1 -1
  20. package/dist/autodetect.js +644 -1
  21. package/dist/bias.d.ts +130 -0
  22. package/dist/bias.d.ts.map +1 -0
  23. package/dist/bias.js +223 -0
  24. package/dist/circuit_breaker.js +3 -3
  25. package/dist/cli/diagnostics.d.ts +5 -1
  26. package/dist/cli/diagnostics.d.ts.map +1 -1
  27. package/dist/cli/diagnostics.js +31 -8
  28. package/dist/cli/doctor.d.ts +25 -0
  29. package/dist/cli/doctor.d.ts.map +1 -0
  30. package/dist/cli/doctor.js +381 -0
  31. package/dist/cli/fix.d.ts +16 -0
  32. package/dist/cli/fix.d.ts.map +1 -0
  33. package/dist/cli/fix.js +284 -0
  34. package/dist/cli/init.d.ts +57 -0
  35. package/dist/cli/init.d.ts.map +1 -0
  36. package/dist/cli/init.js +205 -0
  37. package/dist/cli.js +1611 -126
  38. package/dist/complianceTargets.d.ts +111 -0
  39. package/dist/complianceTargets.d.ts.map +1 -0
  40. package/dist/complianceTargets.js +521 -0
  41. package/dist/config.d.ts +301 -17
  42. package/dist/config.d.ts.map +1 -1
  43. package/dist/config.js +428 -36
  44. package/dist/config_migrations.d.ts +41 -0
  45. package/dist/config_migrations.d.ts.map +1 -1
  46. package/dist/config_migrations.js +205 -0
  47. package/dist/config_schema.d.ts +2900 -731
  48. package/dist/config_schema.d.ts.map +1 -1
  49. package/dist/config_schema.js +257 -55
  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 +122 -0
  54. package/dist/control_backbone.d.ts.map +1 -0
  55. package/dist/control_backbone.js +698 -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 +32 -0
  63. package/dist/dispatcher.d.ts.map +1 -1
  64. package/dist/dispatcher.js +91 -4
  65. package/dist/events.d.ts.map +1 -1
  66. package/dist/events.js +38 -0
  67. package/dist/evidence_store.d.ts +103 -0
  68. package/dist/evidence_store.d.ts.map +1 -0
  69. package/dist/evidence_store.js +459 -0
  70. package/dist/executiveSummary.d.ts +65 -8
  71. package/dist/executiveSummary.d.ts.map +1 -1
  72. package/dist/executiveSummary.js +289 -26
  73. package/dist/identity.d.ts +143 -0
  74. package/dist/identity.d.ts.map +1 -0
  75. package/dist/identity.js +231 -0
  76. package/dist/impact-assessment.d.ts +350 -0
  77. package/dist/impact-assessment.d.ts.map +1 -0
  78. package/dist/impact-assessment.js +580 -0
  79. package/dist/index.d.ts +25 -5
  80. package/dist/index.d.ts.map +1 -1
  81. package/dist/index.js +300 -4
  82. package/dist/instrumentation.d.ts +1 -1
  83. package/dist/instrumentation.d.ts.map +1 -1
  84. package/dist/instrumentation.js +243 -27
  85. package/dist/integrations/anthropic.d.ts +3 -0
  86. package/dist/integrations/anthropic.d.ts.map +1 -1
  87. package/dist/integrations/anthropic.js +284 -79
  88. package/dist/integrations/governance.d.ts +33 -0
  89. package/dist/integrations/governance.d.ts.map +1 -0
  90. package/dist/integrations/governance.js +208 -0
  91. package/dist/integrations/langchain.d.ts +7 -0
  92. package/dist/integrations/langchain.d.ts.map +1 -1
  93. package/dist/integrations/langchain.js +387 -143
  94. package/dist/integrations/openai.d.ts +9 -0
  95. package/dist/integrations/openai.d.ts.map +1 -1
  96. package/dist/integrations/openai.js +673 -73
  97. package/dist/iso42001_consolidation.d.ts +16 -0
  98. package/dist/iso42001_consolidation.d.ts.map +1 -0
  99. package/dist/iso42001_consolidation.js +413 -0
  100. package/dist/iso42001_workflows.d.ts +263 -0
  101. package/dist/iso42001_workflows.d.ts.map +1 -0
  102. package/dist/iso42001_workflows.js +781 -0
  103. package/dist/lifecycle.d.ts +299 -0
  104. package/dist/lifecycle.d.ts.map +1 -0
  105. package/dist/lifecycle.js +624 -0
  106. package/dist/lineage.d.ts +2 -2
  107. package/dist/lineage.d.ts.map +1 -1
  108. package/dist/lineage.js +12 -17
  109. package/dist/middleware/express.d.ts.map +1 -1
  110. package/dist/middleware/express.js +33 -3
  111. package/dist/middleware/nextjs.d.ts.map +1 -1
  112. package/dist/middleware/nextjs.js +42 -68
  113. package/dist/model.d.ts +143 -0
  114. package/dist/model.d.ts.map +1 -0
  115. package/dist/model.js +371 -0
  116. package/dist/onboarding.d.ts +42 -0
  117. package/dist/onboarding.d.ts.map +1 -0
  118. package/dist/onboarding.js +1022 -0
  119. package/dist/oversight.d.ts +264 -0
  120. package/dist/oversight.d.ts.map +1 -0
  121. package/dist/oversight.js +497 -0
  122. package/dist/pdf_report.d.ts.map +1 -1
  123. package/dist/pdf_report.js +42 -21
  124. package/dist/presets.d.ts +88 -0
  125. package/dist/presets.d.ts.map +1 -0
  126. package/dist/presets.js +520 -0
  127. package/dist/propagation.d.ts.map +1 -1
  128. package/dist/propagation.js +34 -2
  129. package/dist/quotas.d.ts +171 -0
  130. package/dist/quotas.d.ts.map +1 -0
  131. package/dist/quotas.js +259 -0
  132. package/dist/register.d.ts +13 -0
  133. package/dist/register.d.ts.map +1 -0
  134. package/dist/register.js +99 -0
  135. package/dist/registry.d.ts +1 -0
  136. package/dist/registry.d.ts.map +1 -1
  137. package/dist/registry.js +7 -0
  138. package/dist/registryData.json +43 -6
  139. package/dist/report.d.ts +2 -1
  140. package/dist/report.d.ts.map +1 -1
  141. package/dist/report.js +189 -2
  142. package/dist/reporting.d.ts +125 -0
  143. package/dist/reporting.d.ts.map +1 -1
  144. package/dist/reporting.js +196 -5
  145. package/dist/resources.d.ts +285 -0
  146. package/dist/resources.d.ts.map +1 -0
  147. package/dist/resources.js +643 -0
  148. package/dist/risk.d.ts +120 -0
  149. package/dist/risk.d.ts.map +1 -0
  150. package/dist/risk.js +220 -0
  151. package/dist/runtime.d.ts +74 -1
  152. package/dist/runtime.d.ts.map +1 -1
  153. package/dist/runtime.js +598 -22
  154. package/dist/schemaInference.d.ts +92 -0
  155. package/dist/schemaInference.d.ts.map +1 -0
  156. package/dist/schemaInference.js +466 -0
  157. package/dist/schema_validation.js +2 -2
  158. package/dist/schemas/config.schema.json +169 -6
  159. package/dist/schemas/event.schema.json +4 -0
  160. package/dist/security_report.js +4 -4
  161. package/dist/signing.d.ts +1 -1
  162. package/dist/signing.d.ts.map +1 -1
  163. package/dist/signing.js +4 -0
  164. package/dist/sinks/file.d.ts +19 -1
  165. package/dist/sinks/file.d.ts.map +1 -1
  166. package/dist/sinks/file.js +82 -13
  167. package/dist/sinks/https.d.ts +10 -0
  168. package/dist/sinks/https.d.ts.map +1 -1
  169. package/dist/sinks/https.js +76 -16
  170. package/dist/sinks/stdout.d.ts +1 -0
  171. package/dist/sinks/stdout.d.ts.map +1 -1
  172. package/dist/sinks/stdout.js +12 -1
  173. package/dist/spec.d.ts +159 -0
  174. package/dist/spec.d.ts.map +1 -0
  175. package/dist/spec.js +391 -0
  176. package/dist/stakeholders.d.ts +199 -0
  177. package/dist/stakeholders.d.ts.map +1 -0
  178. package/dist/stakeholders.js +398 -0
  179. package/dist/standards.d.ts.map +1 -1
  180. package/dist/standards.js +160 -2
  181. package/dist/standards_ingest.d.ts +2 -2
  182. package/dist/standards_ingest.d.ts.map +1 -1
  183. package/dist/standards_ingest.js +105 -23
  184. package/dist/streaming.d.ts.map +1 -1
  185. package/dist/streaming.js +7 -2
  186. package/dist/telemetry.d.ts +16 -2
  187. package/dist/telemetry.d.ts.map +1 -1
  188. package/dist/telemetry.js +79 -14
  189. package/dist/templates/controls/iso42001_control_catalog.json +1443 -0
  190. package/dist/traced_emitter.d.ts +3 -0
  191. package/dist/traced_emitter.d.ts.map +1 -1
  192. package/dist/traced_emitter.js +142 -25
  193. package/dist/trust_package.d.ts +21 -1
  194. package/dist/trust_package.d.ts.map +1 -1
  195. package/dist/trust_package.js +101 -4
  196. package/dist/verify.d.ts.map +1 -1
  197. package/dist/verify.js +9 -2
  198. package/dist/wal.d.ts.map +1 -1
  199. package/dist/wal.js +2 -1
  200. package/package.json +14 -1
  201. package/scripts/postinstall.js +119 -97
  202. package/templates/controls/iso42001_control_catalog.json +1443 -0
@@ -22,7 +22,10 @@
22
22
  Object.defineProperty(exports, "__esModule", { value: true });
23
23
  exports.MonoraCallbackHandler = void 0;
24
24
  const runtime_1 = require("../runtime");
25
+ const context_1 = require("../context");
25
26
  const lineage_1 = require("../lineage");
27
+ const governance_1 = require("./governance");
28
+ const ids_1 = require("../ids");
26
29
  /**
27
30
  * LangChain callback handler that traces operations to Monora.
28
31
  *
@@ -32,28 +35,92 @@ class MonoraCallbackHandler {
32
35
  constructor(options = {}) {
33
36
  this.name = 'MonoraCallbackHandler';
34
37
  this.runMap = new Map();
38
+ this.runContexts = new Map();
39
+ this.llmRuns = new Map();
35
40
  this.dataClassification = options.dataClassification ?? 'internal';
36
41
  this.purpose = options.purpose ?? 'general';
37
42
  this.capturePrompts = options.capturePrompts ?? true;
38
43
  this.captureCompletions = options.captureCompletions ?? true;
39
44
  }
45
+ ensureRunContext(runId, parentRunId, spanName) {
46
+ const existing = this.runContexts.get(runId);
47
+ if (existing) {
48
+ return existing;
49
+ }
50
+ let baseContext;
51
+ if (parentRunId) {
52
+ const parent = this.runContexts.get(parentRunId);
53
+ if (parent) {
54
+ baseContext = parent.context;
55
+ }
56
+ }
57
+ if (!baseContext) {
58
+ baseContext = (0, context_1.captureContext)();
59
+ }
60
+ if (!baseContext) {
61
+ const startTime = Date.now();
62
+ const span = {
63
+ traceId: (0, ids_1.generateUlid)('trc'),
64
+ spanId: (0, ids_1.generateUlid)('spn'),
65
+ parentSpanId: null,
66
+ name: spanName,
67
+ metadata: {},
68
+ };
69
+ const context = {
70
+ currentSpan: span,
71
+ spanStack: [span],
72
+ startTime,
73
+ stepCounter: 0,
74
+ eventCounter: 0,
75
+ };
76
+ (0, context_1.recordTraceStart)(span.traceId, startTime);
77
+ const runContext = { context, span, created: true };
78
+ this.runContexts.set(runId, runContext);
79
+ return runContext;
80
+ }
81
+ const span = (0, context_1.runInContext)(baseContext, () => (0, context_1.startSpan)(spanName));
82
+ const runContext = { context: baseContext, span, created: false };
83
+ this.runContexts.set(runId, runContext);
84
+ return runContext;
85
+ }
86
+ async finalizeRunContext(runId) {
87
+ const runContext = this.runContexts.get(runId);
88
+ if (!runContext) {
89
+ return;
90
+ }
91
+ this.runContexts.delete(runId);
92
+ if (runContext.created) {
93
+ const result = (0, context_1.runInContext)(runContext.context, () => (0, context_1.completeTrace)(runContext.span));
94
+ if (result && typeof result.then === 'function') {
95
+ await result;
96
+ }
97
+ return;
98
+ }
99
+ (0, context_1.runInContext)(runContext.context, () => {
100
+ (0, context_1.popSpan)();
101
+ });
102
+ }
40
103
  // Chain callbacks
41
104
  async handleChainStart(chain, inputs, runId, parentRunId, tags, metadata) {
42
105
  const chainType = chain.name || chain.id?.[chain.id.length - 1] || 'unknown';
43
- const state = (0, runtime_1.ensureState)();
44
- const event = state.eventBuilder.build('agent_step', {
45
- step_type: 'chain_start',
46
- chain_type: chainType,
47
- inputs: this.capturePrompts ? inputs : { _truncated: true },
48
- run_id: runId,
49
- parent_run_id: parentRunId || null,
50
- tags: tags || [],
51
- metadata: metadata || {},
52
- }, {
53
- dataClassification: this.dataClassification,
54
- purpose: this.purpose,
106
+ const runContext = this.ensureRunContext(runId, parentRunId, 'langchain.chain');
107
+ const event = (0, context_1.runInContext)(runContext.context, () => {
108
+ const state = (0, runtime_1.ensureState)();
109
+ const built = state.eventBuilder.build('agent_step', {
110
+ step_type: 'chain_start',
111
+ chain_type: chainType,
112
+ inputs: this.capturePrompts ? inputs : { _truncated: true },
113
+ run_id: runId,
114
+ parent_run_id: parentRunId || null,
115
+ tags: tags || [],
116
+ metadata: metadata || {},
117
+ }, {
118
+ dataClassification: this.dataClassification,
119
+ purpose: this.purpose,
120
+ });
121
+ (0, runtime_1.emitEvent)(built);
122
+ return built;
55
123
  });
56
- (0, runtime_1.emitEvent)(event);
57
124
  this.runMap.set(runId, event.event_id);
58
125
  (0, lineage_1.setCurrentEvent)(event.event_id);
59
126
  }
@@ -62,35 +129,57 @@ class MonoraCallbackHandler {
62
129
  if (parentEventId) {
63
130
  (0, lineage_1.addInputEvent)(parentEventId);
64
131
  }
65
- const state = (0, runtime_1.ensureState)();
66
- const event = state.eventBuilder.build('agent_step', {
67
- step_type: 'chain_end',
68
- outputs: this.captureCompletions ? outputs : { _truncated: true },
69
- run_id: runId,
70
- }, {
71
- dataClassification: this.dataClassification,
72
- purpose: this.purpose,
73
- });
74
- (0, runtime_1.emitEvent)(event);
132
+ const runContext = this.runContexts.get(runId);
133
+ const ctx = runContext?.context;
134
+ const emit = () => {
135
+ const state = (0, runtime_1.ensureState)();
136
+ const event = state.eventBuilder.build('agent_step', {
137
+ step_type: 'chain_end',
138
+ outputs: this.captureCompletions ? outputs : { _truncated: true },
139
+ run_id: runId,
140
+ }, {
141
+ dataClassification: this.dataClassification,
142
+ purpose: this.purpose,
143
+ });
144
+ (0, runtime_1.emitEvent)(event);
145
+ };
146
+ if (ctx) {
147
+ (0, context_1.runInContext)(ctx, emit);
148
+ }
149
+ else {
150
+ emit();
151
+ }
75
152
  this.runMap.delete(runId);
153
+ await this.finalizeRunContext(runId);
76
154
  }
77
155
  async handleChainError(error, runId, parentRunId) {
78
156
  const parentEventId = this.runMap.get(runId);
79
157
  if (parentEventId) {
80
158
  (0, lineage_1.addInputEvent)(parentEventId);
81
159
  }
82
- const state = (0, runtime_1.ensureState)();
83
- const event = state.eventBuilder.build('agent_step', {
84
- step_type: 'chain_error',
85
- error: error.message || String(error),
86
- error_type: error.constructor?.name || 'Error',
87
- run_id: runId,
88
- }, {
89
- dataClassification: this.dataClassification,
90
- purpose: this.purpose,
91
- });
92
- (0, runtime_1.emitEvent)(event);
160
+ const runContext = this.runContexts.get(runId);
161
+ const ctx = runContext?.context;
162
+ const emit = () => {
163
+ const state = (0, runtime_1.ensureState)();
164
+ const event = state.eventBuilder.build('agent_step', {
165
+ step_type: 'chain_error',
166
+ error: error.message || String(error),
167
+ error_type: error.constructor?.name || 'Error',
168
+ run_id: runId,
169
+ }, {
170
+ dataClassification: this.dataClassification,
171
+ purpose: this.purpose,
172
+ });
173
+ (0, runtime_1.emitEvent)(event);
174
+ };
175
+ if (ctx) {
176
+ (0, context_1.runInContext)(ctx, emit);
177
+ }
178
+ else {
179
+ emit();
180
+ }
93
181
  this.runMap.delete(runId);
182
+ await this.finalizeRunContext(runId);
94
183
  }
95
184
  // LLM callbacks
96
185
  async handleLLMStart(llm, prompts, runId, parentRunId, extraParams, tags, metadata) {
@@ -104,24 +193,42 @@ class MonoraCallbackHandler {
104
193
  (0, lineage_1.addInputEvent)(parentEventId);
105
194
  }
106
195
  }
107
- const state = (0, runtime_1.ensureState)();
108
- const event = state.eventBuilder.build('llm_call', {
196
+ const requestPayload = {
197
+ prompts,
198
+ metadata,
199
+ tags,
200
+ extra: extraParams,
201
+ };
202
+ const { state, trace } = (0, governance_1.preflightLlmCall)({
109
203
  model,
110
- provider: 'langchain',
111
- prompts: this.capturePrompts
112
- ? prompts
113
- : prompts.map((p) => `<${p.length} chars>`),
114
- num_prompts: prompts.length,
115
- run_id: runId,
116
- parent_run_id: parentRunId || null,
117
- tags: tags || [],
118
- metadata: metadata || {},
119
- }, {
204
+ requestPayload,
120
205
  dataClassification: this.dataClassification,
121
206
  purpose: this.purpose,
207
+ provider: 'langchain',
208
+ spanName: 'llm_call:langchain',
209
+ });
210
+ const event = (0, context_1.runInContext)(trace.context, () => {
211
+ const built = state.eventBuilder.build('llm_call', {
212
+ model,
213
+ provider: 'langchain',
214
+ prompts: this.capturePrompts
215
+ ? prompts
216
+ : prompts.map((p) => `<${p.length} chars>`),
217
+ num_prompts: prompts.length,
218
+ run_id: runId,
219
+ parent_run_id: parentRunId || null,
220
+ tags: tags || [],
221
+ metadata: metadata || {},
222
+ status: 'started',
223
+ }, {
224
+ dataClassification: this.dataClassification,
225
+ purpose: this.purpose,
226
+ });
227
+ (0, runtime_1.emitEvent)(built);
228
+ return built;
122
229
  });
123
- (0, runtime_1.emitEvent)(event);
124
230
  this.runMap.set(runId, event.event_id);
231
+ this.llmRuns.set(runId, { state, trace, model });
125
232
  (0, lineage_1.setCurrentEvent)(event.event_id);
126
233
  }
127
234
  async handleLLMEnd(output, runId, parentRunId) {
@@ -134,7 +241,31 @@ class MonoraCallbackHandler {
134
241
  if (output.generations) {
135
242
  for (const generationList of output.generations) {
136
243
  for (const gen of generationList) {
137
- const text = gen.text || String(gen);
244
+ const text = (() => {
245
+ if (typeof gen?.text === 'string') {
246
+ return gen.text;
247
+ }
248
+ if (typeof gen?.message?.content === 'string') {
249
+ return gen.message.content;
250
+ }
251
+ if (typeof gen?.toString === 'function') {
252
+ try {
253
+ const stringValue = gen.toString();
254
+ if (typeof stringValue === 'string' && stringValue !== '[object Object]') {
255
+ return stringValue;
256
+ }
257
+ }
258
+ catch {
259
+ // Ignore toString failures and fall through.
260
+ }
261
+ }
262
+ try {
263
+ return JSON.stringify(gen);
264
+ }
265
+ catch {
266
+ return String(gen);
267
+ }
268
+ })();
138
269
  if (this.captureCompletions) {
139
270
  completions.push(text);
140
271
  }
@@ -144,17 +275,45 @@ class MonoraCallbackHandler {
144
275
  }
145
276
  }
146
277
  }
147
- const state = (0, runtime_1.ensureState)();
148
- const event = state.eventBuilder.build('llm_call', {
149
- completions,
150
- num_completions: completions.length,
151
- token_usage: tokenUsage,
152
- run_id: runId,
153
- }, {
154
- dataClassification: this.dataClassification,
155
- purpose: this.purpose,
156
- });
157
- (0, runtime_1.emitEvent)(event);
278
+ const runInfo = this.llmRuns.get(runId);
279
+ if (runInfo) {
280
+ (0, context_1.runInContext)(runInfo.trace.context, () => {
281
+ const event = runInfo.state.eventBuilder.build('llm_call', {
282
+ completions,
283
+ num_completions: completions.length,
284
+ token_usage: tokenUsage,
285
+ run_id: runId,
286
+ status: 'success',
287
+ }, {
288
+ dataClassification: this.dataClassification,
289
+ purpose: this.purpose,
290
+ });
291
+ (0, runtime_1.emitEvent)(event);
292
+ });
293
+ const responseStub = Object.keys(tokenUsage).length > 0 ? { usage: tokenUsage } : null;
294
+ await (0, governance_1.postflightLlmCall)({
295
+ state: runInfo.state,
296
+ trace: runInfo.trace,
297
+ model: runInfo.model,
298
+ response: responseStub,
299
+ dataClassification: this.dataClassification,
300
+ purpose: this.purpose,
301
+ });
302
+ this.llmRuns.delete(runId);
303
+ }
304
+ else {
305
+ const state = (0, runtime_1.ensureState)();
306
+ const event = state.eventBuilder.build('llm_call', {
307
+ completions,
308
+ num_completions: completions.length,
309
+ token_usage: tokenUsage,
310
+ run_id: runId,
311
+ }, {
312
+ dataClassification: this.dataClassification,
313
+ purpose: this.purpose,
314
+ });
315
+ (0, runtime_1.emitEvent)(event);
316
+ }
158
317
  this.runMap.delete(runId);
159
318
  }
160
319
  async handleLLMError(error, runId, parentRunId) {
@@ -162,16 +321,43 @@ class MonoraCallbackHandler {
162
321
  if (parentEventId) {
163
322
  (0, lineage_1.addInputEvent)(parentEventId);
164
323
  }
165
- const state = (0, runtime_1.ensureState)();
166
- const event = state.eventBuilder.build('llm_call', {
167
- error: error.message || String(error),
168
- error_type: error.constructor?.name || 'Error',
169
- run_id: runId,
170
- }, {
171
- dataClassification: this.dataClassification,
172
- purpose: this.purpose,
173
- });
174
- (0, runtime_1.emitEvent)(event);
324
+ const runInfo = this.llmRuns.get(runId);
325
+ if (runInfo) {
326
+ (0, context_1.runInContext)(runInfo.trace.context, () => {
327
+ const event = runInfo.state.eventBuilder.build('llm_call', {
328
+ error: error.message || String(error),
329
+ error_type: error.constructor?.name || 'Error',
330
+ run_id: runId,
331
+ status: 'error',
332
+ }, {
333
+ dataClassification: this.dataClassification,
334
+ purpose: this.purpose,
335
+ });
336
+ (0, runtime_1.emitEvent)(event);
337
+ });
338
+ await (0, governance_1.postflightLlmCall)({
339
+ state: runInfo.state,
340
+ trace: runInfo.trace,
341
+ model: runInfo.model,
342
+ response: null,
343
+ dataClassification: this.dataClassification,
344
+ purpose: this.purpose,
345
+ error: true,
346
+ });
347
+ this.llmRuns.delete(runId);
348
+ }
349
+ else {
350
+ const state = (0, runtime_1.ensureState)();
351
+ const event = state.eventBuilder.build('llm_call', {
352
+ error: error.message || String(error),
353
+ error_type: error.constructor?.name || 'Error',
354
+ run_id: runId,
355
+ }, {
356
+ dataClassification: this.dataClassification,
357
+ purpose: this.purpose,
358
+ });
359
+ (0, runtime_1.emitEvent)(event);
360
+ }
175
361
  this.runMap.delete(runId);
176
362
  }
177
363
  // Tool callbacks
@@ -183,19 +369,23 @@ class MonoraCallbackHandler {
183
369
  (0, lineage_1.addInputEvent)(parentEventId);
184
370
  }
185
371
  }
186
- const state = (0, runtime_1.ensureState)();
187
- const event = state.eventBuilder.build('tool_call', {
188
- tool_name: toolName,
189
- input: this.capturePrompts ? input : `<${input.length} chars>`,
190
- run_id: runId,
191
- parent_run_id: parentRunId || null,
192
- tags: tags || [],
193
- metadata: metadata || {},
194
- }, {
195
- dataClassification: this.dataClassification,
196
- purpose: this.purpose,
372
+ const runContext = this.ensureRunContext(runId, parentRunId, 'langchain.tool');
373
+ const event = (0, context_1.runInContext)(runContext.context, () => {
374
+ const state = (0, runtime_1.ensureState)();
375
+ const built = state.eventBuilder.build('tool_call', {
376
+ tool_name: toolName,
377
+ input: this.capturePrompts ? input : `<${input.length} chars>`,
378
+ run_id: runId,
379
+ parent_run_id: parentRunId || null,
380
+ tags: tags || [],
381
+ metadata: metadata || {},
382
+ }, {
383
+ dataClassification: this.dataClassification,
384
+ purpose: this.purpose,
385
+ });
386
+ (0, runtime_1.emitEvent)(built);
387
+ return built;
197
388
  });
198
- (0, runtime_1.emitEvent)(event);
199
389
  this.runMap.set(runId, event.event_id);
200
390
  (0, lineage_1.setCurrentEvent)(event.event_id);
201
391
  }
@@ -204,33 +394,55 @@ class MonoraCallbackHandler {
204
394
  if (parentEventId) {
205
395
  (0, lineage_1.addInputEvent)(parentEventId);
206
396
  }
207
- const state = (0, runtime_1.ensureState)();
208
- const event = state.eventBuilder.build('tool_call', {
209
- output: this.captureCompletions ? output : `<${output.length} chars>`,
210
- run_id: runId,
211
- }, {
212
- dataClassification: this.dataClassification,
213
- purpose: this.purpose,
214
- });
215
- (0, runtime_1.emitEvent)(event);
397
+ const runContext = this.runContexts.get(runId);
398
+ const ctx = runContext?.context;
399
+ const emit = () => {
400
+ const state = (0, runtime_1.ensureState)();
401
+ const event = state.eventBuilder.build('tool_call', {
402
+ output: this.captureCompletions ? output : `<${output.length} chars>`,
403
+ run_id: runId,
404
+ }, {
405
+ dataClassification: this.dataClassification,
406
+ purpose: this.purpose,
407
+ });
408
+ (0, runtime_1.emitEvent)(event);
409
+ };
410
+ if (ctx) {
411
+ (0, context_1.runInContext)(ctx, emit);
412
+ }
413
+ else {
414
+ emit();
415
+ }
216
416
  this.runMap.delete(runId);
417
+ await this.finalizeRunContext(runId);
217
418
  }
218
419
  async handleToolError(error, runId, parentRunId) {
219
420
  const parentEventId = this.runMap.get(runId);
220
421
  if (parentEventId) {
221
422
  (0, lineage_1.addInputEvent)(parentEventId);
222
423
  }
223
- const state = (0, runtime_1.ensureState)();
224
- const event = state.eventBuilder.build('tool_call', {
225
- error: error.message || String(error),
226
- error_type: error.constructor?.name || 'Error',
227
- run_id: runId,
228
- }, {
229
- dataClassification: this.dataClassification,
230
- purpose: this.purpose,
231
- });
232
- (0, runtime_1.emitEvent)(event);
424
+ const runContext = this.runContexts.get(runId);
425
+ const ctx = runContext?.context;
426
+ const emit = () => {
427
+ const state = (0, runtime_1.ensureState)();
428
+ const event = state.eventBuilder.build('tool_call', {
429
+ error: error.message || String(error),
430
+ error_type: error.constructor?.name || 'Error',
431
+ run_id: runId,
432
+ }, {
433
+ dataClassification: this.dataClassification,
434
+ purpose: this.purpose,
435
+ });
436
+ (0, runtime_1.emitEvent)(event);
437
+ };
438
+ if (ctx) {
439
+ (0, context_1.runInContext)(ctx, emit);
440
+ }
441
+ else {
442
+ emit();
443
+ }
233
444
  this.runMap.delete(runId);
445
+ await this.finalizeRunContext(runId);
234
446
  }
235
447
  // Retriever callbacks
236
448
  async handleRetrieverStart(retriever, query, runId, parentRunId, tags, metadata) {
@@ -240,19 +452,23 @@ class MonoraCallbackHandler {
240
452
  (0, lineage_1.addInputEvent)(parentEventId);
241
453
  }
242
454
  }
243
- const state = (0, runtime_1.ensureState)();
244
- const event = state.eventBuilder.build('custom', {
245
- custom_type: 'retriever_query',
246
- query: this.capturePrompts ? query : `<${query.length} chars>`,
247
- run_id: runId,
248
- parent_run_id: parentRunId || null,
249
- tags: tags || [],
250
- metadata: metadata || {},
251
- }, {
252
- dataClassification: this.dataClassification,
253
- purpose: this.purpose,
455
+ const runContext = this.ensureRunContext(runId, parentRunId, 'langchain.retriever');
456
+ const event = (0, context_1.runInContext)(runContext.context, () => {
457
+ const state = (0, runtime_1.ensureState)();
458
+ const built = state.eventBuilder.build('custom', {
459
+ custom_type: 'retriever_query',
460
+ query: this.capturePrompts ? query : `<${query.length} chars>`,
461
+ run_id: runId,
462
+ parent_run_id: parentRunId || null,
463
+ tags: tags || [],
464
+ metadata: metadata || {},
465
+ }, {
466
+ dataClassification: this.dataClassification,
467
+ purpose: this.purpose,
468
+ });
469
+ (0, runtime_1.emitEvent)(built);
470
+ return built;
254
471
  });
255
- (0, runtime_1.emitEvent)(event);
256
472
  this.runMap.set(runId, event.event_id);
257
473
  (0, lineage_1.setCurrentEvent)(event.event_id);
258
474
  }
@@ -261,46 +477,74 @@ class MonoraCallbackHandler {
261
477
  if (parentEventId) {
262
478
  (0, lineage_1.addInputEvent)(parentEventId);
263
479
  }
264
- const docSummaries = documents.slice(0, 10).map((doc) => {
265
- const summary = {
266
- page_content_length: doc.pageContent?.length || 0,
267
- metadata: doc.metadata || {},
268
- };
269
- if (this.captureCompletions && doc.pageContent) {
270
- summary.page_content = doc.pageContent.slice(0, 500);
480
+ const runContext = this.runContexts.get(runId);
481
+ const ctx = runContext?.context;
482
+ const emit = () => {
483
+ for (const doc of documents) {
484
+ const source = doc.metadata?.source;
485
+ if (typeof source === 'string' && source.trim()) {
486
+ (0, lineage_1.addDataSource)(source);
487
+ }
271
488
  }
272
- return summary;
273
- });
274
- const state = (0, runtime_1.ensureState)();
275
- const event = state.eventBuilder.build('custom', {
276
- custom_type: 'retriever_result',
277
- num_documents: documents.length,
278
- documents: docSummaries,
279
- run_id: runId,
280
- }, {
281
- dataClassification: this.dataClassification,
282
- purpose: this.purpose,
283
- });
284
- (0, runtime_1.emitEvent)(event);
489
+ const docSummaries = documents.slice(0, 10).map((doc) => {
490
+ const summary = {
491
+ page_content_length: doc.pageContent?.length || 0,
492
+ metadata: doc.metadata || {},
493
+ };
494
+ if (this.captureCompletions && doc.pageContent) {
495
+ summary.page_content = doc.pageContent.slice(0, 500);
496
+ }
497
+ return summary;
498
+ });
499
+ const state = (0, runtime_1.ensureState)();
500
+ const event = state.eventBuilder.build('custom', {
501
+ custom_type: 'retriever_result',
502
+ num_documents: documents.length,
503
+ documents: docSummaries,
504
+ run_id: runId,
505
+ }, {
506
+ dataClassification: this.dataClassification,
507
+ purpose: this.purpose,
508
+ });
509
+ (0, runtime_1.emitEvent)(event);
510
+ };
511
+ if (ctx) {
512
+ (0, context_1.runInContext)(ctx, emit);
513
+ }
514
+ else {
515
+ emit();
516
+ }
285
517
  this.runMap.delete(runId);
518
+ await this.finalizeRunContext(runId);
286
519
  }
287
520
  async handleRetrieverError(error, runId, parentRunId) {
288
521
  const parentEventId = this.runMap.get(runId);
289
522
  if (parentEventId) {
290
523
  (0, lineage_1.addInputEvent)(parentEventId);
291
524
  }
292
- const state = (0, runtime_1.ensureState)();
293
- const event = state.eventBuilder.build('custom', {
294
- custom_type: 'retriever_error',
295
- error: error.message || String(error),
296
- error_type: error.constructor?.name || 'Error',
297
- run_id: runId,
298
- }, {
299
- dataClassification: this.dataClassification,
300
- purpose: this.purpose,
301
- });
302
- (0, runtime_1.emitEvent)(event);
525
+ const runContext = this.runContexts.get(runId);
526
+ const ctx = runContext?.context;
527
+ const emit = () => {
528
+ const state = (0, runtime_1.ensureState)();
529
+ const event = state.eventBuilder.build('custom', {
530
+ custom_type: 'retriever_error',
531
+ error: error.message || String(error),
532
+ error_type: error.constructor?.name || 'Error',
533
+ run_id: runId,
534
+ }, {
535
+ dataClassification: this.dataClassification,
536
+ purpose: this.purpose,
537
+ });
538
+ (0, runtime_1.emitEvent)(event);
539
+ };
540
+ if (ctx) {
541
+ (0, context_1.runInContext)(ctx, emit);
542
+ }
543
+ else {
544
+ emit();
545
+ }
303
546
  this.runMap.delete(runId);
547
+ await this.finalizeRunContext(runId);
304
548
  }
305
549
  }
306
550
  exports.MonoraCallbackHandler = MonoraCallbackHandler;
@@ -35,10 +35,19 @@ interface OpenAIClient {
35
35
  embeddings?: {
36
36
  create: (...args: any[]) => any;
37
37
  };
38
+ responses?: {
39
+ create: (...args: any[]) => any;
40
+ stream?: (...args: any[]) => any;
41
+ };
38
42
  }
39
43
  /**
40
44
  * Patch an OpenAI client to automatically trace all API calls.
41
45
  */
42
46
  export declare function patchOpenAI(client: OpenAIClient, options?: PatchOpenAIOptions): void;
47
+ export declare function wrapChatCompletions(originalFn: (...args: any[]) => any, dataClassification: string, purpose: string, reason?: string): (...args: any[]) => any;
48
+ export declare function wrapCompletions(originalFn: (...args: any[]) => any, dataClassification: string, purpose: string, reason?: string): (...args: any[]) => any;
49
+ export declare function wrapEmbeddings(originalFn: (...args: any[]) => any, dataClassification: string, purpose: string, reason?: string): (...args: any[]) => any;
50
+ export declare function wrapResponsesStreamMethod(originalFn: (...args: any[]) => any, dataClassification: string, purpose: string, reason?: string): (...args: any[]) => any;
51
+ export declare function wrapResponses(originalFn: (...args: any[]) => any, dataClassification: string, purpose: string, reason?: string): (...args: any[]) => any;
43
52
  export {};
44
53
  //# sourceMappingURL=openai.d.ts.map