truthguard-ai 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of truthguard-ai might be problematic. Click here for more details.

Files changed (199) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +363 -0
  3. package/dist/Advisor/index.d.ts +78 -0
  4. package/dist/Advisor/index.d.ts.map +1 -0
  5. package/dist/Advisor/index.js +539 -0
  6. package/dist/Advisor/index.js.map +1 -0
  7. package/dist/Alerting/index.d.ts +35 -0
  8. package/dist/Alerting/index.d.ts.map +1 -0
  9. package/dist/Alerting/index.js +76 -0
  10. package/dist/Alerting/index.js.map +1 -0
  11. package/dist/Auth/index.d.ts +82 -0
  12. package/dist/Auth/index.d.ts.map +1 -0
  13. package/dist/Auth/index.js +242 -0
  14. package/dist/Auth/index.js.map +1 -0
  15. package/dist/Baseline/index.d.ts +43 -0
  16. package/dist/Baseline/index.d.ts.map +1 -0
  17. package/dist/Baseline/index.js +195 -0
  18. package/dist/Baseline/index.js.map +1 -0
  19. package/dist/Claims/index.d.ts +73 -0
  20. package/dist/Claims/index.d.ts.map +1 -0
  21. package/dist/Claims/index.js +1669 -0
  22. package/dist/Claims/index.js.map +1 -0
  23. package/dist/Client/index.d.ts +90 -0
  24. package/dist/Client/index.d.ts.map +1 -0
  25. package/dist/Client/index.js +186 -0
  26. package/dist/Client/index.js.map +1 -0
  27. package/dist/Config/index.d.ts +41 -0
  28. package/dist/Config/index.d.ts.map +1 -0
  29. package/dist/Config/index.js +129 -0
  30. package/dist/Config/index.js.map +1 -0
  31. package/dist/Coverage/index.d.ts +28 -0
  32. package/dist/Coverage/index.d.ts.map +1 -0
  33. package/dist/Coverage/index.js +134 -0
  34. package/dist/Coverage/index.js.map +1 -0
  35. package/dist/Demo/index.d.ts +16 -0
  36. package/dist/Demo/index.d.ts.map +1 -0
  37. package/dist/Demo/index.js +189 -0
  38. package/dist/Demo/index.js.map +1 -0
  39. package/dist/Gate/index.d.ts +39 -0
  40. package/dist/Gate/index.d.ts.map +1 -0
  41. package/dist/Gate/index.js +207 -0
  42. package/dist/Gate/index.js.map +1 -0
  43. package/dist/Grounding/index.d.ts +40 -0
  44. package/dist/Grounding/index.d.ts.map +1 -0
  45. package/dist/Grounding/index.js +1433 -0
  46. package/dist/Grounding/index.js.map +1 -0
  47. package/dist/L2/index.d.ts +93 -0
  48. package/dist/L2/index.d.ts.map +1 -0
  49. package/dist/L2/index.js +1773 -0
  50. package/dist/L2/index.js.map +1 -0
  51. package/dist/MCP/index.d.ts +139 -0
  52. package/dist/MCP/index.d.ts.map +1 -0
  53. package/dist/MCP/index.js +1250 -0
  54. package/dist/MCP/index.js.map +1 -0
  55. package/dist/Matchers/index.d.ts +101 -0
  56. package/dist/Matchers/index.d.ts.map +1 -0
  57. package/dist/Matchers/index.js +690 -0
  58. package/dist/Matchers/index.js.map +1 -0
  59. package/dist/Middleware/index.d.ts +146 -0
  60. package/dist/Middleware/index.d.ts.map +1 -0
  61. package/dist/Middleware/index.js +239 -0
  62. package/dist/Middleware/index.js.map +1 -0
  63. package/dist/Mode/index.d.ts +87 -0
  64. package/dist/Mode/index.d.ts.map +1 -0
  65. package/dist/Mode/index.js +117 -0
  66. package/dist/Mode/index.js.map +1 -0
  67. package/dist/Policy/index.d.ts +89 -0
  68. package/dist/Policy/index.d.ts.map +1 -0
  69. package/dist/Policy/index.js +143 -0
  70. package/dist/Policy/index.js.map +1 -0
  71. package/dist/Proxy/SessionStore.d.ts +94 -0
  72. package/dist/Proxy/SessionStore.d.ts.map +1 -0
  73. package/dist/Proxy/SessionStore.js +225 -0
  74. package/dist/Proxy/SessionStore.js.map +1 -0
  75. package/dist/Proxy/index.d.ts +166 -0
  76. package/dist/Proxy/index.d.ts.map +1 -0
  77. package/dist/Proxy/index.js +531 -0
  78. package/dist/Proxy/index.js.map +1 -0
  79. package/dist/Registry/index.d.ts +93 -0
  80. package/dist/Registry/index.d.ts.map +1 -0
  81. package/dist/Registry/index.js +818 -0
  82. package/dist/Registry/index.js.map +1 -0
  83. package/dist/Reports/index.d.ts +38 -0
  84. package/dist/Reports/index.d.ts.map +1 -0
  85. package/dist/Reports/index.js +149 -0
  86. package/dist/Reports/index.js.map +1 -0
  87. package/dist/Rules/index.d.ts +587 -0
  88. package/dist/Rules/index.d.ts.map +1 -0
  89. package/dist/Rules/index.js +6236 -0
  90. package/dist/Rules/index.js.map +1 -0
  91. package/dist/Rules/intents.d.ts +22 -0
  92. package/dist/Rules/intents.d.ts.map +1 -0
  93. package/dist/Rules/intents.js +242 -0
  94. package/dist/Rules/intents.js.map +1 -0
  95. package/dist/Runner/index.d.ts +39 -0
  96. package/dist/Runner/index.d.ts.map +1 -0
  97. package/dist/Runner/index.js +185 -0
  98. package/dist/Runner/index.js.map +1 -0
  99. package/dist/SDK/anthropic.d.ts +102 -0
  100. package/dist/SDK/anthropic.d.ts.map +1 -0
  101. package/dist/SDK/anthropic.js +425 -0
  102. package/dist/SDK/anthropic.js.map +1 -0
  103. package/dist/SDK/openai.d.ts +164 -0
  104. package/dist/SDK/openai.d.ts.map +1 -0
  105. package/dist/SDK/openai.js +557 -0
  106. package/dist/SDK/openai.js.map +1 -0
  107. package/dist/Store/index.d.ts +72 -0
  108. package/dist/Store/index.d.ts.map +1 -0
  109. package/dist/Store/index.js +136 -0
  110. package/dist/Store/index.js.map +1 -0
  111. package/dist/Telemetry/index.d.ts +84 -0
  112. package/dist/Telemetry/index.d.ts.map +1 -0
  113. package/dist/Telemetry/index.js +239 -0
  114. package/dist/Telemetry/index.js.map +1 -0
  115. package/dist/Trace/index.d.ts +219 -0
  116. package/dist/Trace/index.d.ts.map +1 -0
  117. package/dist/Trace/index.js +763 -0
  118. package/dist/Trace/index.js.map +1 -0
  119. package/dist/TraceReadiness/index.d.ts +42 -0
  120. package/dist/TraceReadiness/index.d.ts.map +1 -0
  121. package/dist/TraceReadiness/index.js +169 -0
  122. package/dist/TraceReadiness/index.js.map +1 -0
  123. package/dist/cli/index.d.ts +15 -0
  124. package/dist/cli/index.d.ts.map +1 -0
  125. package/dist/cli/index.js +807 -0
  126. package/dist/cli/index.js.map +1 -0
  127. package/dist/i18n/index.d.ts +44 -0
  128. package/dist/i18n/index.d.ts.map +1 -0
  129. package/dist/i18n/index.js +124 -0
  130. package/dist/i18n/index.js.map +1 -0
  131. package/dist/index.d.ts +55 -0
  132. package/dist/index.d.ts.map +1 -0
  133. package/dist/index.js +218 -0
  134. package/dist/index.js.map +1 -0
  135. package/dist/thin.d.ts +39 -0
  136. package/dist/thin.d.ts.map +1 -0
  137. package/dist/thin.js +120 -0
  138. package/dist/thin.js.map +1 -0
  139. package/dist/types/index.d.ts +498 -0
  140. package/dist/types/index.d.ts.map +1 -0
  141. package/dist/types/index.js +17 -0
  142. package/dist/types/index.js.map +1 -0
  143. package/dist-npm/Alerting/index.d.ts +35 -0
  144. package/dist-npm/Alerting/index.d.ts.map +1 -0
  145. package/dist-npm/Alerting/index.js +76 -0
  146. package/dist-npm/Alerting/index.js.map +1 -0
  147. package/dist-npm/Auth/index.d.ts +82 -0
  148. package/dist-npm/Auth/index.d.ts.map +1 -0
  149. package/dist-npm/Auth/index.js +242 -0
  150. package/dist-npm/Auth/index.js.map +1 -0
  151. package/dist-npm/Client/index.d.ts +90 -0
  152. package/dist-npm/Client/index.d.ts.map +1 -0
  153. package/dist-npm/Client/index.js +186 -0
  154. package/dist-npm/Client/index.js.map +1 -0
  155. package/dist-npm/Demo/index.d.ts +16 -0
  156. package/dist-npm/Demo/index.d.ts.map +1 -0
  157. package/dist-npm/Demo/index.js +189 -0
  158. package/dist-npm/Demo/index.js.map +1 -0
  159. package/dist-npm/Middleware/index.d.ts +146 -0
  160. package/dist-npm/Middleware/index.d.ts.map +1 -0
  161. package/dist-npm/Middleware/index.js +239 -0
  162. package/dist-npm/Middleware/index.js.map +1 -0
  163. package/dist-npm/Proxy/SessionStore.d.ts +94 -0
  164. package/dist-npm/Proxy/SessionStore.d.ts.map +1 -0
  165. package/dist-npm/Proxy/SessionStore.js +225 -0
  166. package/dist-npm/Proxy/SessionStore.js.map +1 -0
  167. package/dist-npm/Proxy/index.d.ts +166 -0
  168. package/dist-npm/Proxy/index.d.ts.map +1 -0
  169. package/dist-npm/Proxy/index.js +531 -0
  170. package/dist-npm/Proxy/index.js.map +1 -0
  171. package/dist-npm/SDK/anthropic.d.ts +102 -0
  172. package/dist-npm/SDK/anthropic.d.ts.map +1 -0
  173. package/dist-npm/SDK/anthropic.js +425 -0
  174. package/dist-npm/SDK/anthropic.js.map +1 -0
  175. package/dist-npm/SDK/openai.d.ts +164 -0
  176. package/dist-npm/SDK/openai.d.ts.map +1 -0
  177. package/dist-npm/SDK/openai.js +557 -0
  178. package/dist-npm/SDK/openai.js.map +1 -0
  179. package/dist-npm/Store/index.d.ts +72 -0
  180. package/dist-npm/Store/index.d.ts.map +1 -0
  181. package/dist-npm/Store/index.js +136 -0
  182. package/dist-npm/Store/index.js.map +1 -0
  183. package/dist-npm/Telemetry/index.d.ts +84 -0
  184. package/dist-npm/Telemetry/index.d.ts.map +1 -0
  185. package/dist-npm/Telemetry/index.js +239 -0
  186. package/dist-npm/Telemetry/index.js.map +1 -0
  187. package/dist-npm/Trace/index.d.ts +219 -0
  188. package/dist-npm/Trace/index.d.ts.map +1 -0
  189. package/dist-npm/Trace/index.js +763 -0
  190. package/dist-npm/Trace/index.js.map +1 -0
  191. package/dist-npm/thin.d.ts +39 -0
  192. package/dist-npm/thin.d.ts.map +1 -0
  193. package/dist-npm/thin.js +120 -0
  194. package/dist-npm/thin.js.map +1 -0
  195. package/dist-npm/types/index.d.ts +498 -0
  196. package/dist-npm/types/index.d.ts.map +1 -0
  197. package/dist-npm/types/index.js +17 -0
  198. package/dist-npm/types/index.js.map +1 -0
  199. package/package.json +114 -0
@@ -0,0 +1,557 @@
1
+ "use strict";
2
+ /**
3
+ * ai-rcp OpenAI SDK Wrapper
4
+ *
5
+ * Wraps an OpenAI client to automatically capture tool-calling traces
6
+ * and run them through the grounding pipeline.
7
+ *
8
+ * This is the "zero-config" integration: import, wrap, and you get
9
+ * grounding evaluation on every tool-calling conversation.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * import OpenAI from 'openai';
14
+ * import { wrapOpenAI } from 'ai-rcp';
15
+ *
16
+ * const openai = wrapOpenAI(new OpenAI(), {
17
+ * mode: 'warn',
18
+ * threshold: 0.8,
19
+ * onEvaluate: (report) => console.log('Score:', report.groundingScore),
20
+ * });
21
+ *
22
+ * // Use exactly like the normal OpenAI client
23
+ * const response = await openai.chat.completions.create({
24
+ * model: 'gpt-4',
25
+ * messages: [{ role: 'user', content: 'What appointments do I have?' }],
26
+ * tools: [...],
27
+ * });
28
+ *
29
+ * // ai-rcp has already evaluated the trace in the background.
30
+ * // In 'block' mode, a GroundingError is thrown if the score is too low.
31
+ * ```
32
+ */
33
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
34
+ if (k2 === undefined) k2 = k;
35
+ var desc = Object.getOwnPropertyDescriptor(m, k);
36
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
37
+ desc = { enumerable: true, get: function() { return m[k]; } };
38
+ }
39
+ Object.defineProperty(o, k2, desc);
40
+ }) : (function(o, m, k, k2) {
41
+ if (k2 === undefined) k2 = k;
42
+ o[k2] = m[k];
43
+ }));
44
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
45
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
46
+ }) : function(o, v) {
47
+ o["default"] = v;
48
+ });
49
+ var __importStar = (this && this.__importStar) || (function () {
50
+ var ownKeys = function(o) {
51
+ ownKeys = Object.getOwnPropertyNames || function (o) {
52
+ var ar = [];
53
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
54
+ return ar;
55
+ };
56
+ return ownKeys(o);
57
+ };
58
+ return function (mod) {
59
+ if (mod && mod.__esModule) return mod;
60
+ var result = {};
61
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
62
+ __setModuleDefault(result, mod);
63
+ return result;
64
+ };
65
+ })();
66
+ Object.defineProperty(exports, "__esModule", { value: true });
67
+ exports.GroundingError = void 0;
68
+ exports.buildTraceFromOpenAI = buildTraceFromOpenAI;
69
+ exports.buildErrorTrace = buildErrorTrace;
70
+ exports.reportUnavailable = reportUnavailable;
71
+ exports.wrapOpenAI = wrapOpenAI;
72
+ /**
73
+ * Error thrown in block mode when a response fails grounding.
74
+ */
75
+ class GroundingError extends Error {
76
+ constructor(message, report, trace) {
77
+ super(message);
78
+ this.report = report;
79
+ this.trace = trace;
80
+ this.name = 'GroundingError';
81
+ }
82
+ }
83
+ exports.GroundingError = GroundingError;
84
+ function roleToTraceRole(role) {
85
+ switch (role) {
86
+ case 'system':
87
+ return 'system_prompt';
88
+ case 'user':
89
+ return 'user_input';
90
+ case 'assistant':
91
+ return 'final_response'; // overridden for tool_call below
92
+ case 'tool':
93
+ return 'tool_output';
94
+ default:
95
+ return 'llm_call';
96
+ }
97
+ }
98
+ let traceCounter = 0;
99
+ /**
100
+ * Build an ai-rcp Trace from the OpenAI messages array and the final response.
101
+ */
102
+ function buildTraceFromOpenAI(messages,
103
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
104
+ response) {
105
+ const traceId = `openai-${Date.now()}-${++traceCounter}`;
106
+ try {
107
+ return _buildTraceFromOpenAIInner(traceId, messages, response);
108
+ }
109
+ catch (e) {
110
+ return {
111
+ traceId,
112
+ steps: [{
113
+ stepId: 'step-error',
114
+ role: 'final_response',
115
+ content: `[TruthGuard Trace Error] ${e instanceof Error ? e.message : String(e)}`,
116
+ metadata: { traceError: true, errorType: e instanceof Error ? e.name : 'UnknownError' },
117
+ }],
118
+ startedAt: new Date().toISOString(),
119
+ metadata: { provider: 'openai', traceError: true },
120
+ };
121
+ }
122
+ }
123
+ function _buildTraceFromOpenAIInner(traceId, messages,
124
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
125
+ response) {
126
+ const steps = [];
127
+ let stepCounter = 0;
128
+ // Convert input messages to trace steps
129
+ for (const msg of messages) {
130
+ const stepId = `step-${++stepCounter}`;
131
+ if (msg.role === 'assistant' && msg.tool_calls?.length) {
132
+ // Assistant message with tool calls
133
+ steps.push({
134
+ stepId,
135
+ role: 'tool_call',
136
+ content: msg.content ?? '',
137
+ toolCalls: msg.tool_calls.map((tc) => {
138
+ let params = {};
139
+ try {
140
+ params = JSON.parse(tc.function?.arguments ?? '{}');
141
+ }
142
+ catch {
143
+ params = { _raw: tc.function?.arguments };
144
+ }
145
+ return {
146
+ toolName: tc.function?.name ?? 'unknown',
147
+ parameters: params,
148
+ };
149
+ }),
150
+ });
151
+ }
152
+ else if (msg.role === 'tool') {
153
+ // Tool response
154
+ let output = msg.content;
155
+ try {
156
+ output = JSON.parse(msg.content ?? '');
157
+ }
158
+ catch {
159
+ // keep as string
160
+ }
161
+ steps.push({
162
+ stepId,
163
+ role: 'tool_output',
164
+ content: msg.content ?? '',
165
+ toolOutputs: [
166
+ {
167
+ toolName: msg.name ?? 'unknown',
168
+ output,
169
+ },
170
+ ],
171
+ });
172
+ }
173
+ else {
174
+ // system, user, or plain assistant
175
+ steps.push({
176
+ stepId,
177
+ role: roleToTraceRole(msg.role),
178
+ content: msg.content ?? '',
179
+ });
180
+ }
181
+ }
182
+ // Add the final assistant response from the API
183
+ const choice = response?.choices?.[0];
184
+ if (choice?.message) {
185
+ const msg = choice.message;
186
+ if (msg.tool_calls?.length) {
187
+ steps.push({
188
+ stepId: `step-${++stepCounter}`,
189
+ role: 'tool_call',
190
+ content: msg.content ?? '',
191
+ toolCalls: msg.tool_calls.map((tc) => {
192
+ let params = {};
193
+ try {
194
+ params = JSON.parse(tc.function?.arguments ?? '{}');
195
+ }
196
+ catch {
197
+ params = { _raw: tc.function?.arguments };
198
+ }
199
+ return {
200
+ toolName: tc.function?.name ?? 'unknown',
201
+ parameters: params,
202
+ };
203
+ }),
204
+ });
205
+ }
206
+ else {
207
+ steps.push({
208
+ stepId: `step-${++stepCounter}`,
209
+ role: 'final_response',
210
+ content: msg.content ?? '',
211
+ });
212
+ }
213
+ }
214
+ // Token usage + finish reason
215
+ const usage = response?.usage;
216
+ const lastChoice = response?.choices?.[0];
217
+ const finishReason = lastChoice?.finish_reason;
218
+ const tokens = usage
219
+ ? {
220
+ prompt: usage.prompt_tokens ?? 0,
221
+ completion: usage.completion_tokens ?? 0,
222
+ total: usage.total_tokens ?? 0,
223
+ ...(finishReason ? { finishReason } : {}),
224
+ }
225
+ : undefined;
226
+ // Attach tokens to the last step
227
+ if (tokens && steps.length > 0) {
228
+ steps[steps.length - 1].tokens = tokens;
229
+ }
230
+ return {
231
+ traceId,
232
+ steps,
233
+ startedAt: new Date().toISOString(),
234
+ metadata: {
235
+ model: response?.model,
236
+ provider: 'openai',
237
+ },
238
+ };
239
+ }
240
+ /**
241
+ * Build an ai-rcp Trace when the OpenAI API call fails (rate limit, timeout, etc.).
242
+ * Records the conversation context + the error so TruthGuard can still evaluate
243
+ * whatever fallback response the caller surfaces to the user.
244
+ */
245
+ function buildErrorTrace(messages, error) {
246
+ const traceId = `openai-err-${Date.now()}-${++traceCounter}`;
247
+ try {
248
+ return _buildErrorTraceInner(traceId, messages, error);
249
+ }
250
+ catch (e) {
251
+ return {
252
+ traceId,
253
+ steps: [{
254
+ stepId: 'step-error',
255
+ role: 'final_response',
256
+ content: `[TruthGuard Trace Error] ${e instanceof Error ? e.message : String(e)}`,
257
+ metadata: { traceError: true, errorType: e instanceof Error ? e.name : 'UnknownError' },
258
+ }],
259
+ startedAt: new Date().toISOString(),
260
+ metadata: { provider: 'openai', traceError: true },
261
+ };
262
+ }
263
+ }
264
+ function _buildErrorTraceInner(traceId, messages, error) {
265
+ const steps = [];
266
+ let stepCounter = 0;
267
+ // Convert input messages to trace steps (same as buildTraceFromOpenAI)
268
+ for (const msg of messages) {
269
+ const stepId = `step-${++stepCounter}`;
270
+ if (msg.role === 'assistant' && msg.tool_calls?.length) {
271
+ steps.push({
272
+ stepId,
273
+ role: 'tool_call',
274
+ content: msg.content ?? '',
275
+ toolCalls: msg.tool_calls.map((tc) => {
276
+ let params = {};
277
+ try {
278
+ params = JSON.parse(tc.function?.arguments ?? '{}');
279
+ }
280
+ catch {
281
+ params = { _raw: tc.function?.arguments };
282
+ }
283
+ return {
284
+ toolName: tc.function?.name ?? 'unknown',
285
+ parameters: params,
286
+ };
287
+ }),
288
+ });
289
+ }
290
+ else if (msg.role === 'tool') {
291
+ let output = msg.content;
292
+ try {
293
+ output = JSON.parse(msg.content ?? '');
294
+ }
295
+ catch {
296
+ // keep as string
297
+ }
298
+ steps.push({
299
+ stepId,
300
+ role: 'tool_output',
301
+ content: msg.content ?? '',
302
+ toolOutputs: [
303
+ {
304
+ toolName: msg.name ?? 'unknown',
305
+ output,
306
+ },
307
+ ],
308
+ });
309
+ }
310
+ else {
311
+ steps.push({
312
+ stepId,
313
+ role: roleToTraceRole(msg.role),
314
+ content: msg.content ?? '',
315
+ });
316
+ }
317
+ }
318
+ // Add a synthetic final_response step recording the API error
319
+ const errMsg = error instanceof Error ? error.message : String(error);
320
+ const errName = error instanceof Error ? error.name : 'UnknownError';
321
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
322
+ const statusCode = error?.status ?? error?.statusCode;
323
+ steps.push({
324
+ stepId: `step-${++stepCounter}`,
325
+ role: 'final_response',
326
+ content: `[API Error] ${errName}: ${errMsg}`,
327
+ metadata: {
328
+ apiError: true,
329
+ errorType: errName,
330
+ errorMessage: errMsg,
331
+ ...(statusCode ? { statusCode } : {}),
332
+ },
333
+ });
334
+ return {
335
+ traceId,
336
+ steps,
337
+ startedAt: new Date().toISOString(),
338
+ metadata: {
339
+ provider: 'openai',
340
+ apiError: true,
341
+ errorType: errName,
342
+ },
343
+ };
344
+ }
345
+ /**
346
+ * Build a trace for scenarios where the AI service was unavailable.
347
+ *
348
+ * Use this when your application catches an error **before or instead of**
349
+ * calling the AI API, and shows an error message to the user. This ensures
350
+ * the event appears in TruthGuard's Live Observe dashboard.
351
+ *
352
+ * @example
353
+ * ```ts
354
+ * import { reportUnavailable } from 'ai-rcp';
355
+ *
356
+ * try {
357
+ * const response = await callAI(userMessage);
358
+ * } catch (err) {
359
+ * const trace = reportUnavailable({
360
+ * userMessage: 'Daj mi izveštaj za mart',
361
+ * errorMessage: 'AI server trenutno nije dostupan',
362
+ * reason: 'timeout',
363
+ * provider: 'anthropic',
364
+ * });
365
+ * // Send to TruthGuard: await fetch('/api/ingest', { body: JSON.stringify({ trace }) });
366
+ * }
367
+ * ```
368
+ */
369
+ function reportUnavailable(options) {
370
+ const traceId = `unavailable-${Date.now()}-${++traceCounter}`;
371
+ const steps = [];
372
+ let stepCounter = 0;
373
+ if (options.systemPrompt) {
374
+ steps.push({
375
+ stepId: `step-${++stepCounter}`,
376
+ role: 'system_prompt',
377
+ content: options.systemPrompt,
378
+ });
379
+ }
380
+ steps.push({
381
+ stepId: `step-${++stepCounter}`,
382
+ role: 'user_input',
383
+ content: options.userMessage,
384
+ });
385
+ const reason = options.reason ?? 'unknown';
386
+ const errorType = reason === 'timeout' ? 'TimeoutError'
387
+ : reason === 'overloaded' ? 'ServiceOverloaded'
388
+ : reason === 'rate_limit' ? 'RateLimitError'
389
+ : reason === 'quota' ? 'QuotaExhausted'
390
+ : reason === 'network' ? 'NetworkError'
391
+ : 'AIUnavailable';
392
+ steps.push({
393
+ stepId: `step-${++stepCounter}`,
394
+ role: 'final_response',
395
+ content: `[API Error] ${errorType}: ${options.errorMessage}`,
396
+ metadata: {
397
+ apiError: true,
398
+ errorType,
399
+ errorMessage: options.errorMessage,
400
+ ...(options.statusCode ? { statusCode: options.statusCode } : {}),
401
+ reason,
402
+ },
403
+ });
404
+ return {
405
+ traceId,
406
+ steps,
407
+ startedAt: new Date().toISOString(),
408
+ metadata: {
409
+ provider: options.provider ?? 'unknown',
410
+ apiError: true,
411
+ errorType,
412
+ reason,
413
+ },
414
+ };
415
+ }
416
+ function buildEvaluator(options, mode) {
417
+ // Remote evaluation via TruthGuardClient (thin-client mode)
418
+ if (options.client) {
419
+ const client = options.client;
420
+ const threshold = options.threshold;
421
+ return async (trace) => {
422
+ const result = await client.evaluate(trace, { mode, threshold });
423
+ options.onEvaluate?.(result.report, trace);
424
+ return result;
425
+ };
426
+ }
427
+ // Local evaluation via Pipeline (server-side / full engine mode)
428
+ if (options._pipeline) {
429
+ const pipeline = options._pipeline;
430
+ return async (trace) => {
431
+ const result = await pipeline.evaluate(trace);
432
+ options.onEvaluate?.(result.report, trace);
433
+ return result;
434
+ };
435
+ }
436
+ // Fallback: try dynamic import of Pipeline (will fail in thin-client build — that's expected)
437
+ let lazyPipeline = null;
438
+ return async (trace) => {
439
+ if (!lazyPipeline) {
440
+ try {
441
+ // Dynamic import so thin-client build doesn't bundle the engine
442
+ const { Pipeline } = await Promise.resolve().then(() => __importStar(require('../Mode')));
443
+ lazyPipeline = new Pipeline({ ...options, mode });
444
+ }
445
+ catch {
446
+ throw new Error('TruthGuard: No evaluation backend available. ' +
447
+ 'Provide a `client` option (TruthGuardClient) for remote evaluation, ' +
448
+ 'or install the full engine for local evaluation.');
449
+ }
450
+ }
451
+ const result = await lazyPipeline.evaluate(trace);
452
+ options.onEvaluate?.(result.report, trace);
453
+ return result;
454
+ };
455
+ }
456
+ // ---------------------------------------------------------------------------
457
+ // SDK Wrapper
458
+ // ---------------------------------------------------------------------------
459
+ /**
460
+ * Wraps an OpenAI client instance to auto-capture traces and evaluate grounding.
461
+ *
462
+ * Returns a proxy that intercepts `client.chat.completions.create()`.
463
+ * All other methods pass through unchanged.
464
+ *
465
+ * In thin-client mode (when `client` option is provided), traces are sent to
466
+ * the TruthGuard server for evaluation — no engine code runs locally.
467
+ */
468
+ function wrapOpenAI(client, options = {}) {
469
+ const mode = options.mode ?? 'observe';
470
+ const shouldBlock = mode === 'block';
471
+ const awaitEval = options.awaitEvaluation ?? shouldBlock;
472
+ // Build the evaluator — either remote (client) or local (_pipeline)
473
+ const evaluator = buildEvaluator(options, mode);
474
+ // We need to intercept client.chat.completions.create
475
+ // Use a Proxy to transparently wrap the client
476
+ return new Proxy(client, {
477
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
478
+ get(target, prop) {
479
+ if (prop === 'chat') {
480
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
481
+ return new Proxy(target.chat, {
482
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
483
+ get(chatTarget, chatProp) {
484
+ if (chatProp === 'completions') {
485
+ return new Proxy(chatTarget.completions, {
486
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
487
+ get(compTarget, compProp) {
488
+ if (compProp === 'create') {
489
+ return async function wrappedCreate(
490
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
491
+ params,
492
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
493
+ ...rest) {
494
+ let response;
495
+ let apiError;
496
+ try {
497
+ response = await compTarget.create.call(compTarget, params, ...rest);
498
+ }
499
+ catch (err) {
500
+ apiError = err;
501
+ }
502
+ const messages = params.messages ?? [];
503
+ const hasToolContext = messages.some((m) => m.role === 'tool' ||
504
+ (m.role === 'assistant' && m.tool_calls?.length));
505
+ if (apiError) {
506
+ // API failed — still build a trace so TruthGuard
507
+ // can evaluate whatever the caller surfaces to the user
508
+ if (hasToolContext) {
509
+ const trace = buildErrorTrace(messages, apiError);
510
+ if (awaitEval) {
511
+ const result = await evaluator(trace);
512
+ options.onResult?.(result, trace);
513
+ }
514
+ else {
515
+ evaluator(trace).then((result) => options.onResult?.(result, trace), () => { });
516
+ }
517
+ }
518
+ // Re-throw so the caller still sees the original error
519
+ throw apiError;
520
+ }
521
+ // Happy path — evaluate if this is a final response
522
+ const choice = response
523
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
524
+ ? response?.choices?.[0]
525
+ : undefined;
526
+ const isFinalResponse = choice?.message && !choice.message.tool_calls?.length;
527
+ if (hasToolContext && isFinalResponse) {
528
+ const trace = buildTraceFromOpenAI(messages, response);
529
+ if (awaitEval) {
530
+ const result = await evaluator(trace);
531
+ options.onResult?.(result, trace);
532
+ if (shouldBlock && !result.allowed) {
533
+ throw new GroundingError(result.fallbackResponse ??
534
+ 'Response blocked due to low grounding score', result.report, trace);
535
+ }
536
+ }
537
+ else {
538
+ // Fire-and-forget: evaluate async
539
+ evaluator(trace).then((result) => options.onResult?.(result, trace), () => { });
540
+ }
541
+ }
542
+ return response;
543
+ };
544
+ }
545
+ return compTarget[compProp];
546
+ },
547
+ });
548
+ }
549
+ return chatTarget[chatProp];
550
+ },
551
+ });
552
+ }
553
+ return target[prop];
554
+ },
555
+ });
556
+ }
557
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/SDK/openai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Trace Store — Persistence layer for traces and grounding reports.
3
+ *
4
+ * Provides a pluggable interface with a file-based (JSONL) default implementation.
5
+ * Used by observe / warn / block modes to persist evaluation history.
6
+ */
7
+ import type { GroundingReport, Trace } from '../types';
8
+ /** A stored record combining trace + report + metadata. */
9
+ export interface StoredRecord {
10
+ /** ISO-8601 timestamp when the record was stored. */
11
+ storedAt: string;
12
+ /** The original trace. */
13
+ trace: Trace;
14
+ /** The grounding report produced by the engine. */
15
+ report: GroundingReport;
16
+ /** Organization ID (for tenant isolation). */
17
+ orgId?: string;
18
+ /** Project ID (for tenant isolation). */
19
+ projectId?: string;
20
+ /** Environment tag (e.g. "testing", "production"). */
21
+ environment?: string;
22
+ /** User ID who created this trace (for per-user isolation). */
23
+ userId?: string;
24
+ }
25
+ /** Abstract interface for trace persistence. */
26
+ export interface TraceStore {
27
+ /** Persist a trace and its report. */
28
+ save(trace: Trace, report: GroundingReport, meta?: {
29
+ orgId?: string;
30
+ projectId?: string;
31
+ environment?: string;
32
+ userId?: string;
33
+ }): Promise<void>;
34
+ /** Load stored records (most recent first). */
35
+ list(limit?: number, offset?: number): Promise<StoredRecord[]>;
36
+ /** Load a single record by traceId. */
37
+ get(traceId: string): Promise<StoredRecord | null>;
38
+ /** Count total stored records. */
39
+ count(): Promise<number>;
40
+ }
41
+ /**
42
+ * Appends trace+report records as JSONL lines.
43
+ * Simple, requires no dependencies, works everywhere.
44
+ */
45
+ export declare class FileStore implements TraceStore {
46
+ private readonly filePath;
47
+ constructor(filePath: string);
48
+ save(trace: Trace, report: GroundingReport, meta?: {
49
+ orgId?: string;
50
+ projectId?: string;
51
+ environment?: string;
52
+ userId?: string;
53
+ }): Promise<void>;
54
+ list(limit?: number, offset?: number): Promise<StoredRecord[]>;
55
+ get(traceId: string): Promise<StoredRecord | null>;
56
+ count(): Promise<number>;
57
+ }
58
+ export declare class InMemoryStore implements TraceStore {
59
+ private records;
60
+ save(trace: Trace, report: GroundingReport, meta?: {
61
+ orgId?: string;
62
+ projectId?: string;
63
+ environment?: string;
64
+ userId?: string;
65
+ }): Promise<void>;
66
+ list(limit?: number, offset?: number): Promise<StoredRecord[]>;
67
+ get(traceId: string): Promise<StoredRecord | null>;
68
+ count(): Promise<number>;
69
+ /** Clear all records (useful in tests). */
70
+ clear(): void;
71
+ }
72
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Store/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAMvD,2DAA2D;AAC3D,MAAM,WAAW,YAAY;IAC3B,qDAAqD;IACrD,QAAQ,EAAE,MAAM,CAAC;IACjB,0BAA0B;IAC1B,KAAK,EAAE,KAAK,CAAC;IACb,mDAAmD;IACnD,MAAM,EAAE,eAAe,CAAC;IACxB,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,gDAAgD;AAChD,MAAM,WAAW,UAAU;IACzB,sCAAsC;IACtC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjJ,+CAA+C;IAC/C,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAE/D,uCAAuC;IACvC,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAEnD,kCAAkC;IAClC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAC1B;AAMD;;;GAGG;AACH,qBAAa,SAAU,YAAW,UAAU;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,QAAQ,EAAE,MAAM;IAQtB,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAchJ,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAczD,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAKlD,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;CAM/B;AAMD,qBAAa,aAAc,YAAW,UAAU;IAC9C,OAAO,CAAC,OAAO,CAAsB;IAE/B,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAYhJ,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAMzD,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAIlD,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAI9B,2CAA2C;IAC3C,KAAK,IAAI,IAAI;CAGd"}