@axiastudio/aioc 0.1.0-alpha.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.
Files changed (162) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +77 -0
  3. package/dist/agent.d.ts +29 -0
  4. package/dist/agent.d.ts.map +1 -0
  5. package/dist/agent.js +36 -0
  6. package/dist/config.d.ts +5 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +18 -0
  9. package/dist/errors.d.ts +37 -0
  10. package/dist/errors.d.ts.map +1 -0
  11. package/dist/errors.js +46 -0
  12. package/dist/examples/basic/hello-world.d.ts +2 -0
  13. package/dist/examples/basic/hello-world.d.ts.map +1 -0
  14. package/dist/examples/basic/hello-world.js +20 -0
  15. package/dist/examples/basic/run-record-sink.d.ts +2 -0
  16. package/dist/examples/basic/run-record-sink.d.ts.map +1 -0
  17. package/dist/examples/basic/run-record-sink.js +103 -0
  18. package/dist/examples/basic/tools.d.ts +2 -0
  19. package/dist/examples/basic/tools.d.ts.map +1 -0
  20. package/dist/examples/basic/tools.js +84 -0
  21. package/dist/examples/guardrail-smoke.d.ts +2 -0
  22. package/dist/examples/guardrail-smoke.d.ts.map +1 -0
  23. package/dist/examples/guardrail-smoke.js +110 -0
  24. package/dist/examples/hello-run.d.ts +2 -0
  25. package/dist/examples/hello-run.d.ts.map +1 -0
  26. package/dist/examples/hello-run.js +20 -0
  27. package/dist/examples/learn-01-hello-run.d.ts +2 -0
  28. package/dist/examples/learn-01-hello-run.d.ts.map +1 -0
  29. package/dist/examples/learn-01-hello-run.js +29 -0
  30. package/dist/examples/learn-02-tool-policy.d.ts +2 -0
  31. package/dist/examples/learn-02-tool-policy.d.ts.map +1 -0
  32. package/dist/examples/learn-02-tool-policy.js +87 -0
  33. package/dist/examples/learn-03-controlled-handoff.d.ts +2 -0
  34. package/dist/examples/learn-03-controlled-handoff.d.ts.map +1 -0
  35. package/dist/examples/learn-03-controlled-handoff.js +84 -0
  36. package/dist/examples/learn-04-output-guardrail.d.ts +2 -0
  37. package/dist/examples/learn-04-output-guardrail.d.ts.map +1 -0
  38. package/dist/examples/learn-04-output-guardrail.js +61 -0
  39. package/dist/examples/learn-05-run-record-audit.d.ts +2 -0
  40. package/dist/examples/learn-05-run-record-audit.d.ts.map +1 -0
  41. package/dist/examples/learn-05-run-record-audit.js +135 -0
  42. package/dist/examples/mistral-smoke.d.ts +2 -0
  43. package/dist/examples/mistral-smoke.d.ts.map +1 -0
  44. package/dist/examples/mistral-smoke.js +63 -0
  45. package/dist/examples/onboarding-governance-smoke.d.ts +2 -0
  46. package/dist/examples/onboarding-governance-smoke.d.ts.map +1 -0
  47. package/dist/examples/onboarding-governance-smoke.js +477 -0
  48. package/dist/examples/onboarding-governance-tutorial.d.ts +2 -0
  49. package/dist/examples/onboarding-governance-tutorial.d.ts.map +1 -0
  50. package/dist/examples/onboarding-governance-tutorial.js +342 -0
  51. package/dist/examples/policy-smoke.d.ts +2 -0
  52. package/dist/examples/policy-smoke.d.ts.map +1 -0
  53. package/dist/examples/policy-smoke.js +137 -0
  54. package/dist/examples/support/scripted-provider.d.ts +8 -0
  55. package/dist/examples/support/scripted-provider.d.ts.map +1 -0
  56. package/dist/examples/support/scripted-provider.js +21 -0
  57. package/dist/examples/tool-policy-finance.d.ts +2 -0
  58. package/dist/examples/tool-policy-finance.d.ts.map +1 -0
  59. package/dist/examples/tool-policy-finance.js +77 -0
  60. package/dist/examples/tool-run.d.ts +2 -0
  61. package/dist/examples/tool-run.d.ts.map +1 -0
  62. package/dist/examples/tool-run.js +70 -0
  63. package/dist/guardrails.d.ts +20 -0
  64. package/dist/guardrails.d.ts.map +1 -0
  65. package/dist/guardrails.js +6 -0
  66. package/dist/index.d.ts +18 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +33 -0
  69. package/dist/logger.d.ts +76 -0
  70. package/dist/logger.d.ts.map +1 -0
  71. package/dist/logger.js +53 -0
  72. package/dist/messages.d.ts +5 -0
  73. package/dist/messages.d.ts.map +1 -0
  74. package/dist/messages.js +21 -0
  75. package/dist/policy.d.ts +41 -0
  76. package/dist/policy.d.ts.map +1 -0
  77. package/dist/policy.js +20 -0
  78. package/dist/provider-setup.d.ts +14 -0
  79. package/dist/provider-setup.d.ts.map +1 -0
  80. package/dist/provider-setup.js +43 -0
  81. package/dist/providers/base.d.ts +26 -0
  82. package/dist/providers/base.d.ts.map +1 -0
  83. package/dist/providers/base.js +2 -0
  84. package/dist/providers/chat-completions.d.ts +13 -0
  85. package/dist/providers/chat-completions.d.ts.map +1 -0
  86. package/dist/providers/chat-completions.js +314 -0
  87. package/dist/providers/mistral.d.ts +8 -0
  88. package/dist/providers/mistral.d.ts.map +1 -0
  89. package/dist/providers/mistral.js +14 -0
  90. package/dist/providers/openai.d.ts +11 -0
  91. package/dist/providers/openai.d.ts.map +1 -0
  92. package/dist/providers/openai.js +23 -0
  93. package/dist/run-context.d.ts +5 -0
  94. package/dist/run-context.d.ts.map +1 -0
  95. package/dist/run-context.js +10 -0
  96. package/dist/run-log-emitter.d.ts +21 -0
  97. package/dist/run-log-emitter.d.ts.map +1 -0
  98. package/dist/run-log-emitter.js +184 -0
  99. package/dist/run-record.d.ts +61 -0
  100. package/dist/run-record.d.ts.map +1 -0
  101. package/dist/run-record.js +2 -0
  102. package/dist/run-recorder-runtime.d.ts +38 -0
  103. package/dist/run-recorder-runtime.d.ts.map +1 -0
  104. package/dist/run-recorder-runtime.js +148 -0
  105. package/dist/run.d.ts +19 -0
  106. package/dist/run.d.ts.map +1 -0
  107. package/dist/run.js +497 -0
  108. package/dist/tests/integration/chat-completions.integration.d.ts +2 -0
  109. package/dist/tests/integration/chat-completions.integration.d.ts.map +1 -0
  110. package/dist/tests/integration/chat-completions.integration.js +110 -0
  111. package/dist/tests/integration/index.d.ts +2 -0
  112. package/dist/tests/integration/index.d.ts.map +1 -0
  113. package/dist/tests/integration/index.js +12 -0
  114. package/dist/tests/regression/handoff-policy-trace.regression.d.ts +2 -0
  115. package/dist/tests/regression/handoff-policy-trace.regression.d.ts.map +1 -0
  116. package/dist/tests/regression/handoff-policy-trace.regression.js +92 -0
  117. package/dist/tests/regression/handoff-transition.regression.d.ts +2 -0
  118. package/dist/tests/regression/handoff-transition.regression.d.ts.map +1 -0
  119. package/dist/tests/regression/handoff-transition.regression.js +62 -0
  120. package/dist/tests/regression/index.d.ts +2 -0
  121. package/dist/tests/regression/index.d.ts.map +1 -0
  122. package/dist/tests/regression/index.js +14 -0
  123. package/dist/tests/regression/policy-default-deny.regression.d.ts +2 -0
  124. package/dist/tests/regression/policy-default-deny.regression.d.ts.map +1 -0
  125. package/dist/tests/regression/policy-default-deny.regression.js +106 -0
  126. package/dist/tests/support/handoff-name.d.ts +2 -0
  127. package/dist/tests/support/handoff-name.d.ts.map +1 -0
  128. package/dist/tests/support/handoff-name.js +14 -0
  129. package/dist/tests/support/scripted-provider.d.ts +8 -0
  130. package/dist/tests/support/scripted-provider.d.ts.map +1 -0
  131. package/dist/tests/support/scripted-provider.js +19 -0
  132. package/dist/tests/unit/guardrail.unit.d.ts +2 -0
  133. package/dist/tests/unit/guardrail.unit.d.ts.map +1 -0
  134. package/dist/tests/unit/guardrail.unit.js +48 -0
  135. package/dist/tests/unit/handoff.unit.d.ts +2 -0
  136. package/dist/tests/unit/handoff.unit.d.ts.map +1 -0
  137. package/dist/tests/unit/handoff.unit.js +178 -0
  138. package/dist/tests/unit/index.d.ts +2 -0
  139. package/dist/tests/unit/index.d.ts.map +1 -0
  140. package/dist/tests/unit/index.js +24 -0
  141. package/dist/tests/unit/logger.unit.d.ts +2 -0
  142. package/dist/tests/unit/logger.unit.d.ts.map +1 -0
  143. package/dist/tests/unit/logger.unit.js +65 -0
  144. package/dist/tests/unit/policy.unit.d.ts +2 -0
  145. package/dist/tests/unit/policy.unit.d.ts.map +1 -0
  146. package/dist/tests/unit/policy.unit.js +167 -0
  147. package/dist/tests/unit/provider-setup.unit.d.ts +2 -0
  148. package/dist/tests/unit/provider-setup.unit.d.ts.map +1 -0
  149. package/dist/tests/unit/provider-setup.unit.js +75 -0
  150. package/dist/tests/unit/run-record.unit.d.ts +2 -0
  151. package/dist/tests/unit/run-record.unit.d.ts.map +1 -0
  152. package/dist/tests/unit/run-record.unit.js +118 -0
  153. package/dist/tests/unit/run.unit.d.ts +2 -0
  154. package/dist/tests/unit/run.unit.d.ts.map +1 -0
  155. package/dist/tests/unit/run.unit.js +30 -0
  156. package/dist/tool.d.ts +16 -0
  157. package/dist/tool.d.ts.map +1 -0
  158. package/dist/tool.js +6 -0
  159. package/dist/types.d.ts +67 -0
  160. package/dist/types.d.ts.map +1 -0
  161. package/dist/types.js +2 -0
  162. package/package.json +64 -0
@@ -0,0 +1,314 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ChatCompletionsProvider = void 0;
4
+ const zod_to_json_schema_1 = require("zod-to-json-schema");
5
+ function toJsonSchema(schema) {
6
+ const convert = zod_to_json_schema_1.zodToJsonSchema;
7
+ return convert(schema, { $refStrategy: "none" });
8
+ }
9
+ function stringifySafe(value) {
10
+ if (typeof value === "string") {
11
+ return value;
12
+ }
13
+ try {
14
+ return JSON.stringify(value ?? {});
15
+ }
16
+ catch {
17
+ return "{}";
18
+ }
19
+ }
20
+ function normalizeContentPart(part) {
21
+ if (!part || typeof part !== "object") {
22
+ return null;
23
+ }
24
+ const record = part;
25
+ const partType = typeof record.type === "string" ? record.type : "";
26
+ if ((partType === "input_text" ||
27
+ partType === "output_text" ||
28
+ partType === "text") &&
29
+ typeof record.text === "string") {
30
+ return {
31
+ type: "text",
32
+ text: record.text,
33
+ };
34
+ }
35
+ if (partType === "image_url" ||
36
+ partType === "input_audio" ||
37
+ partType === "refusal" ||
38
+ partType === "audio" ||
39
+ partType === "file") {
40
+ return record;
41
+ }
42
+ if (typeof record.text === "string") {
43
+ return {
44
+ type: "text",
45
+ text: record.text,
46
+ };
47
+ }
48
+ return null;
49
+ }
50
+ function normalizeMessageContent(content) {
51
+ if (content === null || typeof content === "undefined") {
52
+ return null;
53
+ }
54
+ if (typeof content === "string") {
55
+ return content;
56
+ }
57
+ if (Array.isArray(content)) {
58
+ const normalizedParts = content
59
+ .map((part) => normalizeContentPart(part))
60
+ .filter((part) => Boolean(part));
61
+ if (normalizedParts.length > 0) {
62
+ return normalizedParts;
63
+ }
64
+ return stringifySafe(content);
65
+ }
66
+ const singlePart = normalizeContentPart(content);
67
+ if (singlePart) {
68
+ return [singlePart];
69
+ }
70
+ return stringifySafe(content);
71
+ }
72
+ function toChatMessages(items, systemPrompt) {
73
+ const messages = [];
74
+ if (systemPrompt) {
75
+ messages.push({
76
+ role: "system",
77
+ content: systemPrompt,
78
+ });
79
+ }
80
+ for (const item of items) {
81
+ if (item.type === "message") {
82
+ messages.push({
83
+ role: item.role,
84
+ content: normalizeMessageContent(item.content),
85
+ });
86
+ continue;
87
+ }
88
+ if (item.type === "tool_call_item") {
89
+ messages.push({
90
+ role: "assistant",
91
+ content: null,
92
+ tool_calls: [
93
+ {
94
+ id: item.callId,
95
+ type: "function",
96
+ function: {
97
+ name: item.name,
98
+ arguments: stringifySafe(item.arguments),
99
+ },
100
+ },
101
+ ],
102
+ });
103
+ continue;
104
+ }
105
+ if (item.type === "tool_call_output_item") {
106
+ messages.push({
107
+ role: "tool",
108
+ tool_call_id: item.callId,
109
+ content: stringifySafe(item.output),
110
+ });
111
+ }
112
+ }
113
+ return messages;
114
+ }
115
+ function toModelSettings(modelSettings) {
116
+ if (!modelSettings) {
117
+ return {};
118
+ }
119
+ const allowed = [
120
+ "temperature",
121
+ "top_p",
122
+ "max_tokens",
123
+ "presence_penalty",
124
+ "frequency_penalty",
125
+ "seed",
126
+ "parallel_tool_calls",
127
+ ];
128
+ const parsed = {};
129
+ for (const key of allowed) {
130
+ if (typeof modelSettings[key] !== "undefined") {
131
+ parsed[key] = modelSettings[key];
132
+ }
133
+ }
134
+ return parsed;
135
+ }
136
+ function toTools(tools) {
137
+ return tools.map((definition) => {
138
+ const rawSchema = toJsonSchema(definition.parameters);
139
+ const schema = { ...rawSchema };
140
+ delete schema.$schema;
141
+ return {
142
+ type: "function",
143
+ function: {
144
+ name: definition.name,
145
+ description: definition.description,
146
+ parameters: schema,
147
+ },
148
+ };
149
+ });
150
+ }
151
+ function buildHeaders(options) {
152
+ const headers = {
153
+ Authorization: `Bearer ${options.apiKey}`,
154
+ "Content-Type": "application/json",
155
+ ...(options.headers ?? {}),
156
+ };
157
+ return headers;
158
+ }
159
+ function normalizeBaseURL(baseURL) {
160
+ return baseURL.replace(/\/+$/, "");
161
+ }
162
+ async function* parseSseEvents(body) {
163
+ const reader = body.getReader();
164
+ const decoder = new TextDecoder();
165
+ let buffer = "";
166
+ while (true) {
167
+ const { value, done } = await reader.read();
168
+ if (done) {
169
+ break;
170
+ }
171
+ buffer += decoder.decode(value, { stream: true });
172
+ let separatorIndex = buffer.indexOf("\n\n");
173
+ while (separatorIndex !== -1) {
174
+ const rawEvent = buffer.slice(0, separatorIndex);
175
+ buffer = buffer.slice(separatorIndex + 2);
176
+ const payloadLines = rawEvent
177
+ .split("\n")
178
+ .map((line) => line.trim())
179
+ .filter((line) => line.startsWith("data:"))
180
+ .map((line) => line.replace(/^data:\s?/, ""));
181
+ if (payloadLines.length > 0) {
182
+ yield payloadLines.join("\n");
183
+ }
184
+ separatorIndex = buffer.indexOf("\n\n");
185
+ }
186
+ }
187
+ const finalChunk = decoder.decode();
188
+ if (finalChunk) {
189
+ buffer += finalChunk;
190
+ }
191
+ const remaining = buffer.trim();
192
+ if (!remaining) {
193
+ return;
194
+ }
195
+ const payloadLines = remaining
196
+ .split("\n")
197
+ .map((line) => line.trim())
198
+ .filter((line) => line.startsWith("data:"))
199
+ .map((line) => line.replace(/^data:\s?/, ""));
200
+ if (payloadLines.length > 0) {
201
+ yield payloadLines.join("\n");
202
+ }
203
+ }
204
+ class ChatCompletionsProvider {
205
+ baseURL;
206
+ headers;
207
+ constructor(options) {
208
+ this.baseURL = normalizeBaseURL(options.baseURL);
209
+ this.headers = buildHeaders(options);
210
+ }
211
+ async *stream(request) {
212
+ const payload = {
213
+ model: request.model,
214
+ messages: toChatMessages(request.messages, request.systemPrompt),
215
+ tools: request.tools.length > 0 ? toTools(request.tools) : undefined,
216
+ tool_choice: request.tools.length > 0 ? "auto" : undefined,
217
+ stream: true,
218
+ ...toModelSettings(request.modelSettings),
219
+ };
220
+ const response = await fetch(`${this.baseURL}/chat/completions`, {
221
+ method: "POST",
222
+ headers: this.headers,
223
+ body: JSON.stringify(payload),
224
+ });
225
+ if (!response.ok) {
226
+ const details = await response.text().catch(() => "");
227
+ throw new Error(`Chat completions request failed (${response.status}): ${details || response.statusText}`);
228
+ }
229
+ if (!response.body) {
230
+ throw new Error("Chat completions response has no stream body.");
231
+ }
232
+ const pendingToolCalls = new Map();
233
+ let outputText = "";
234
+ let completed = false;
235
+ for await (const rawEvent of parseSseEvents(response.body)) {
236
+ if (rawEvent === "[DONE]") {
237
+ continue;
238
+ }
239
+ let chunk;
240
+ try {
241
+ chunk = JSON.parse(rawEvent);
242
+ }
243
+ catch {
244
+ continue;
245
+ }
246
+ const choice = chunk.choices?.[0];
247
+ if (!choice) {
248
+ continue;
249
+ }
250
+ if (typeof choice.delta?.content === "string") {
251
+ outputText += choice.delta.content;
252
+ yield {
253
+ type: "delta",
254
+ delta: choice.delta.content,
255
+ };
256
+ }
257
+ if (choice.delta?.tool_calls) {
258
+ for (const partialCall of choice.delta.tool_calls) {
259
+ const index = partialCall.index ?? 0;
260
+ const existing = pendingToolCalls.get(index) ?? {
261
+ id: `call_${index}`,
262
+ name: "",
263
+ arguments: "",
264
+ };
265
+ if (partialCall.id) {
266
+ existing.id = partialCall.id;
267
+ }
268
+ if (partialCall.function?.name) {
269
+ existing.name = partialCall.function.name;
270
+ }
271
+ if (partialCall.function?.arguments) {
272
+ existing.arguments += partialCall.function.arguments;
273
+ }
274
+ pendingToolCalls.set(index, existing);
275
+ }
276
+ }
277
+ if (choice.finish_reason && !completed) {
278
+ completed = true;
279
+ if (choice.finish_reason === "tool_calls") {
280
+ for (const call of pendingToolCalls.values()) {
281
+ yield {
282
+ type: "tool_call",
283
+ callId: call.id,
284
+ name: call.name,
285
+ arguments: call.arguments || "{}",
286
+ };
287
+ }
288
+ }
289
+ yield {
290
+ type: "completed",
291
+ message: outputText,
292
+ finishReason: choice.finish_reason,
293
+ };
294
+ }
295
+ }
296
+ if (!completed) {
297
+ if (pendingToolCalls.size > 0) {
298
+ for (const call of pendingToolCalls.values()) {
299
+ yield {
300
+ type: "tool_call",
301
+ callId: call.id,
302
+ name: call.name,
303
+ arguments: call.arguments || "{}",
304
+ };
305
+ }
306
+ }
307
+ yield {
308
+ type: "completed",
309
+ message: outputText,
310
+ };
311
+ }
312
+ }
313
+ }
314
+ exports.ChatCompletionsProvider = ChatCompletionsProvider;
@@ -0,0 +1,8 @@
1
+ import { ChatCompletionsProvider, ChatCompletionsProviderOptions } from "./chat-completions";
2
+ export type MistralProviderOptions = Omit<ChatCompletionsProviderOptions, "baseURL"> & {
3
+ baseURL?: string;
4
+ };
5
+ export declare class MistralProvider extends ChatCompletionsProvider {
6
+ constructor(options: MistralProviderOptions);
7
+ }
8
+ //# sourceMappingURL=mistral.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mistral.d.ts","sourceRoot":"","sources":["../../src/providers/mistral.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,8BAA8B,EAC/B,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,sBAAsB,GAAG,IAAI,CACvC,8BAA8B,EAC9B,SAAS,CACV,GAAG;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,qBAAa,eAAgB,SAAQ,uBAAuB;gBAC9C,OAAO,EAAE,sBAAsB;CAO5C"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MistralProvider = void 0;
4
+ const chat_completions_1 = require("./chat-completions");
5
+ class MistralProvider extends chat_completions_1.ChatCompletionsProvider {
6
+ constructor(options) {
7
+ super({
8
+ apiKey: options.apiKey,
9
+ baseURL: options.baseURL ?? "https://api.mistral.ai/v1",
10
+ headers: options.headers,
11
+ });
12
+ }
13
+ }
14
+ exports.MistralProvider = MistralProvider;
@@ -0,0 +1,11 @@
1
+ import { ChatCompletionsProvider, ChatCompletionsProviderOptions } from "./chat-completions";
2
+ export type OpenAIProviderOptions = Omit<ChatCompletionsProviderOptions, "baseURL" | "headers"> & {
3
+ baseURL?: string;
4
+ organization?: string;
5
+ project?: string;
6
+ headers?: Record<string, string>;
7
+ };
8
+ export declare class OpenAIProvider extends ChatCompletionsProvider {
9
+ constructor(options: OpenAIProviderOptions);
10
+ }
11
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,8BAA8B,EAC/B,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,qBAAqB,GAAG,IAAI,CACtC,8BAA8B,EAC9B,SAAS,GAAG,SAAS,CACtB,GAAG;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC,CAAC;AAcF,qBAAa,cAAe,SAAQ,uBAAuB;gBAC7C,OAAO,EAAE,qBAAqB;CAO3C"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OpenAIProvider = void 0;
4
+ const chat_completions_1 = require("./chat-completions");
5
+ function toOpenAIHeaders(options) {
6
+ return {
7
+ ...(options.headers ?? {}),
8
+ ...(options.organization
9
+ ? { "OpenAI-Organization": options.organization }
10
+ : {}),
11
+ ...(options.project ? { "OpenAI-Project": options.project } : {}),
12
+ };
13
+ }
14
+ class OpenAIProvider extends chat_completions_1.ChatCompletionsProvider {
15
+ constructor(options) {
16
+ super({
17
+ apiKey: options.apiKey,
18
+ baseURL: options.baseURL ?? "https://api.openai.com/v1",
19
+ headers: toOpenAIHeaders(options),
20
+ });
21
+ }
22
+ }
23
+ exports.OpenAIProvider = OpenAIProvider;
@@ -0,0 +1,5 @@
1
+ export declare class RunContext<TContext = unknown> {
2
+ context: TContext;
3
+ constructor(context: TContext);
4
+ }
5
+ //# sourceMappingURL=run-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-context.d.ts","sourceRoot":"","sources":["../src/run-context.ts"],"names":[],"mappings":"AAAA,qBAAa,UAAU,CAAC,QAAQ,GAAG,OAAO;IACxC,OAAO,EAAE,QAAQ,CAAC;gBAEN,OAAO,EAAE,QAAQ;CAG9B"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RunContext = void 0;
4
+ class RunContext {
5
+ context;
6
+ constructor(context) {
7
+ this.context = context;
8
+ }
9
+ }
10
+ exports.RunContext = RunContext;
@@ -0,0 +1,21 @@
1
+ import type { RunLogger } from "./logger";
2
+ export declare class RunLogEmitter {
3
+ private logger?;
4
+ constructor(logger?: RunLogger);
5
+ private createTimestamp;
6
+ private emit;
7
+ runStarted(agent: string, maxTurns: number, historyItems: number): Promise<void>;
8
+ agentActivated(agent: string, turn: number): Promise<void>;
9
+ turnStarted(agent: string, turn: number): Promise<void>;
10
+ toolCallStarted(agent: string, turn: number, toolName: string, callId: string): Promise<void>;
11
+ toolPolicyEvaluated(agent: string, turn: number, toolName: string, callId: string, decision: "allow" | "deny", reason: string, policyVersion?: string, metadata?: Record<string, unknown>): Promise<void>;
12
+ handoffPolicyEvaluated(agent: string, turn: number, handoffName: string, callId: string, toAgent: string, decision: "allow" | "deny", reason: string, policyVersion?: string, metadata?: Record<string, unknown>): Promise<void>;
13
+ toolCallCompleted(agent: string, turn: number, toolName: string, callId: string): Promise<void>;
14
+ toolCallFailed(agent: string, turn: number, toolName: string, callId: string, error: unknown): Promise<void>;
15
+ outputGuardrailStarted(agent: string, turn: number, guardrailName: string): Promise<void>;
16
+ outputGuardrailPassed(agent: string, turn: number, guardrailName: string): Promise<void>;
17
+ outputGuardrailTriggered(agent: string, turn: number, guardrailName: string, reason?: string): Promise<void>;
18
+ runCompleted(agent: string, turn: number, outputLength: number): Promise<void>;
19
+ runFailed(agent: string, turn: number | undefined, error: unknown): Promise<void>;
20
+ }
21
+ //# sourceMappingURL=run-log-emitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-log-emitter.d.ts","sourceRoot":"","sources":["../src/run-log-emitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,SAAS,EAAE,MAAM,UAAU,CAAC;AAmBvD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,CAAY;gBAEf,MAAM,CAAC,EAAE,SAAS;IAI9B,OAAO,CAAC,eAAe;YAIT,IAAI;IAYZ,UAAU,CACd,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC;IAWV,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU1D,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUvD,eAAe,CACnB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC;IAYV,mBAAmB,CACvB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,OAAO,GAAG,MAAM,EAC1B,MAAM,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,MAAM,EACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC;IAgBV,sBAAsB,CAC1B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,OAAO,GAAG,MAAM,EAC1B,MAAM,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,MAAM,EACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC;IAiBV,iBAAiB,CACrB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC;IAYV,cAAc,CAClB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,IAAI,CAAC;IAeV,sBAAsB,CAC1B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC;IAWV,qBAAqB,CACzB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC;IAWV,wBAAwB,CAC5B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IAYV,YAAY,CAChB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC;IAWV,SAAS,CACb,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,IAAI,CAAC;CAYjB"}
@@ -0,0 +1,184 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RunLogEmitter = void 0;
4
+ function toErrorDetails(error) {
5
+ if (error instanceof Error) {
6
+ return {
7
+ errorName: error.name,
8
+ errorMessage: error.message,
9
+ };
10
+ }
11
+ return {
12
+ errorName: "Error",
13
+ errorMessage: String(error),
14
+ };
15
+ }
16
+ class RunLogEmitter {
17
+ logger;
18
+ constructor(logger) {
19
+ this.logger = logger;
20
+ }
21
+ createTimestamp() {
22
+ return new Date().toISOString();
23
+ }
24
+ async emit(event) {
25
+ if (!this.logger) {
26
+ return;
27
+ }
28
+ try {
29
+ await this.logger.log(event);
30
+ }
31
+ catch {
32
+ // Logging must never break runtime behavior.
33
+ }
34
+ }
35
+ async runStarted(agent, maxTurns, historyItems) {
36
+ await this.emit({
37
+ timestamp: this.createTimestamp(),
38
+ level: "info",
39
+ type: "run_started",
40
+ agent,
41
+ maxTurns,
42
+ historyItems,
43
+ });
44
+ }
45
+ async agentActivated(agent, turn) {
46
+ await this.emit({
47
+ timestamp: this.createTimestamp(),
48
+ level: "info",
49
+ type: "agent_activated",
50
+ agent,
51
+ turn,
52
+ });
53
+ }
54
+ async turnStarted(agent, turn) {
55
+ await this.emit({
56
+ timestamp: this.createTimestamp(),
57
+ level: "debug",
58
+ type: "turn_started",
59
+ agent,
60
+ turn,
61
+ });
62
+ }
63
+ async toolCallStarted(agent, turn, toolName, callId) {
64
+ await this.emit({
65
+ timestamp: this.createTimestamp(),
66
+ level: "info",
67
+ type: "tool_call_started",
68
+ agent,
69
+ turn,
70
+ toolName,
71
+ callId,
72
+ });
73
+ }
74
+ async toolPolicyEvaluated(agent, turn, toolName, callId, decision, reason, policyVersion, metadata) {
75
+ await this.emit({
76
+ timestamp: this.createTimestamp(),
77
+ level: decision === "deny" ? "warn" : "info",
78
+ type: "tool_policy_evaluated",
79
+ agent,
80
+ turn,
81
+ toolName,
82
+ callId,
83
+ decision,
84
+ reason,
85
+ policyVersion,
86
+ metadata,
87
+ });
88
+ }
89
+ async handoffPolicyEvaluated(agent, turn, handoffName, callId, toAgent, decision, reason, policyVersion, metadata) {
90
+ await this.emit({
91
+ timestamp: this.createTimestamp(),
92
+ level: decision === "deny" ? "warn" : "info",
93
+ type: "handoff_policy_evaluated",
94
+ agent,
95
+ turn,
96
+ handoffName,
97
+ callId,
98
+ toAgent,
99
+ decision,
100
+ reason,
101
+ policyVersion,
102
+ metadata,
103
+ });
104
+ }
105
+ async toolCallCompleted(agent, turn, toolName, callId) {
106
+ await this.emit({
107
+ timestamp: this.createTimestamp(),
108
+ level: "info",
109
+ type: "tool_call_completed",
110
+ agent,
111
+ turn,
112
+ toolName,
113
+ callId,
114
+ });
115
+ }
116
+ async toolCallFailed(agent, turn, toolName, callId, error) {
117
+ const details = toErrorDetails(error);
118
+ await this.emit({
119
+ timestamp: this.createTimestamp(),
120
+ level: "error",
121
+ type: "tool_call_failed",
122
+ agent,
123
+ turn,
124
+ toolName,
125
+ callId,
126
+ errorName: details.errorName,
127
+ errorMessage: details.errorMessage,
128
+ });
129
+ }
130
+ async outputGuardrailStarted(agent, turn, guardrailName) {
131
+ await this.emit({
132
+ timestamp: this.createTimestamp(),
133
+ level: "debug",
134
+ type: "output_guardrail_started",
135
+ agent,
136
+ turn,
137
+ guardrailName,
138
+ });
139
+ }
140
+ async outputGuardrailPassed(agent, turn, guardrailName) {
141
+ await this.emit({
142
+ timestamp: this.createTimestamp(),
143
+ level: "info",
144
+ type: "output_guardrail_passed",
145
+ agent,
146
+ turn,
147
+ guardrailName,
148
+ });
149
+ }
150
+ async outputGuardrailTriggered(agent, turn, guardrailName, reason) {
151
+ await this.emit({
152
+ timestamp: this.createTimestamp(),
153
+ level: "warn",
154
+ type: "output_guardrail_triggered",
155
+ agent,
156
+ turn,
157
+ guardrailName,
158
+ reason,
159
+ });
160
+ }
161
+ async runCompleted(agent, turn, outputLength) {
162
+ await this.emit({
163
+ timestamp: this.createTimestamp(),
164
+ level: "info",
165
+ type: "run_completed",
166
+ agent,
167
+ turn,
168
+ outputLength,
169
+ });
170
+ }
171
+ async runFailed(agent, turn, error) {
172
+ const details = toErrorDetails(error);
173
+ await this.emit({
174
+ timestamp: this.createTimestamp(),
175
+ level: "error",
176
+ type: "run_failed",
177
+ agent,
178
+ turn,
179
+ errorName: details.errorName,
180
+ errorMessage: details.errorMessage,
181
+ });
182
+ }
183
+ }
184
+ exports.RunLogEmitter = RunLogEmitter;
@@ -0,0 +1,61 @@
1
+ import type { AgentInputItem } from "./types";
2
+ export type RunRecordStatus = "completed" | "failed";
3
+ export interface PolicyResourceSnapshot {
4
+ kind: "tool" | "handoff";
5
+ name: string;
6
+ action?: string;
7
+ resourceId?: string;
8
+ }
9
+ export interface PolicyDecisionRecord {
10
+ timestamp: string;
11
+ turn: number;
12
+ callId: string;
13
+ decision: "allow" | "deny";
14
+ reason: string;
15
+ policyVersion?: string;
16
+ resource: PolicyResourceSnapshot;
17
+ metadata?: Record<string, unknown>;
18
+ }
19
+ export interface GuardrailDecisionRecord {
20
+ timestamp: string;
21
+ turn: number;
22
+ guardrailName: string;
23
+ decision: "pass" | "triggered";
24
+ reason?: string;
25
+ metadata?: Record<string, unknown>;
26
+ }
27
+ export interface RunRecord<TContext = unknown> {
28
+ runId: string;
29
+ startedAt: string;
30
+ completedAt: string;
31
+ status: RunRecordStatus;
32
+ agentName: string;
33
+ providerName?: string;
34
+ model?: string;
35
+ question: string;
36
+ response: string;
37
+ contextSnapshot: TContext;
38
+ contextRedacted?: boolean;
39
+ items: AgentInputItem[];
40
+ policyDecisions: PolicyDecisionRecord[];
41
+ guardrailDecisions?: GuardrailDecisionRecord[];
42
+ errorName?: string;
43
+ errorMessage?: string;
44
+ metadata?: Record<string, unknown>;
45
+ }
46
+ export interface RunRecordContextRedactionResult<TContext = unknown> {
47
+ contextSnapshot: TContext;
48
+ contextRedacted: boolean;
49
+ }
50
+ export type RunRecordContextRedactor<TContext = unknown> = (context: TContext) => RunRecordContextRedactionResult<TContext> | Promise<RunRecordContextRedactionResult<TContext>>;
51
+ export type RunRecordWriter<TContext = unknown> = (record: RunRecord<TContext>) => Promise<void> | void;
52
+ export interface RunRecordSink<TContext = unknown> {
53
+ write: RunRecordWriter<TContext>;
54
+ }
55
+ export interface RunRecordOptions<TContext = unknown> {
56
+ runId?: string;
57
+ metadata?: Record<string, unknown>;
58
+ contextRedactor?: RunRecordContextRedactor<TContext>;
59
+ sink?: RunRecordSink<TContext> | RunRecordWriter<TContext>;
60
+ }
61
+ //# sourceMappingURL=run-record.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-record.d.ts","sourceRoot":"","sources":["../src/run-record.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });