@openai/agents-core 0.3.7 → 0.3.8

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 (180) hide show
  1. package/dist/errors.d.ts +40 -0
  2. package/dist/errors.js +38 -1
  3. package/dist/errors.js.map +1 -1
  4. package/dist/errors.mjs +34 -0
  5. package/dist/errors.mjs.map +1 -1
  6. package/dist/index.d.ts +6 -2
  7. package/dist/index.js +13 -2
  8. package/dist/index.js.map +1 -1
  9. package/dist/index.mjs +3 -1
  10. package/dist/index.mjs.map +1 -1
  11. package/dist/metadata.js +2 -2
  12. package/dist/metadata.mjs +2 -2
  13. package/dist/result.d.ts +17 -0
  14. package/dist/result.js +71 -24
  15. package/dist/result.js.map +1 -1
  16. package/dist/result.mjs +69 -22
  17. package/dist/result.mjs.map +1 -1
  18. package/dist/run.d.ts +14 -47
  19. package/dist/run.js +421 -994
  20. package/dist/run.js.map +1 -1
  21. package/dist/run.mjs +405 -978
  22. package/dist/run.mjs.map +1 -1
  23. package/dist/runState.d.ts +1286 -172
  24. package/dist/runState.js +146 -16
  25. package/dist/runState.js.map +1 -1
  26. package/dist/runState.mjs +142 -12
  27. package/dist/runState.mjs.map +1 -1
  28. package/dist/runner/constants.d.ts +1 -0
  29. package/dist/runner/constants.js +6 -0
  30. package/dist/runner/constants.js.map +1 -0
  31. package/dist/runner/constants.mjs +3 -0
  32. package/dist/runner/constants.mjs.map +1 -0
  33. package/dist/runner/conversation.d.ts +85 -0
  34. package/dist/runner/conversation.js +275 -0
  35. package/dist/runner/conversation.js.map +1 -0
  36. package/dist/runner/conversation.mjs +269 -0
  37. package/dist/runner/conversation.mjs.map +1 -0
  38. package/dist/runner/guardrails.d.ts +23 -0
  39. package/dist/runner/guardrails.js +174 -0
  40. package/dist/runner/guardrails.js.map +1 -0
  41. package/dist/runner/guardrails.mjs +166 -0
  42. package/dist/runner/guardrails.mjs.map +1 -0
  43. package/dist/runner/items.d.ts +18 -0
  44. package/dist/runner/items.js +89 -0
  45. package/dist/runner/items.js.map +1 -0
  46. package/dist/runner/items.mjs +79 -0
  47. package/dist/runner/items.mjs.map +1 -0
  48. package/dist/runner/mcpApprovals.d.ts +25 -0
  49. package/dist/runner/mcpApprovals.js +66 -0
  50. package/dist/runner/mcpApprovals.js.map +1 -0
  51. package/dist/runner/mcpApprovals.mjs +63 -0
  52. package/dist/runner/mcpApprovals.mjs.map +1 -0
  53. package/dist/runner/modelOutputs.d.ts +10 -0
  54. package/dist/runner/modelOutputs.js +206 -0
  55. package/dist/runner/modelOutputs.js.map +1 -0
  56. package/dist/runner/modelOutputs.mjs +203 -0
  57. package/dist/runner/modelOutputs.mjs.map +1 -0
  58. package/dist/runner/modelPreparation.d.ts +8 -0
  59. package/dist/runner/modelPreparation.js +41 -0
  60. package/dist/runner/modelPreparation.js.map +1 -0
  61. package/dist/runner/modelPreparation.mjs +38 -0
  62. package/dist/runner/modelPreparation.mjs.map +1 -0
  63. package/dist/runner/modelSettings.d.ts +20 -0
  64. package/dist/runner/modelSettings.js +97 -0
  65. package/dist/runner/modelSettings.js.map +1 -0
  66. package/dist/runner/modelSettings.mjs +92 -0
  67. package/dist/runner/modelSettings.mjs.map +1 -0
  68. package/dist/runner/runLoop.d.ts +32 -0
  69. package/dist/runner/runLoop.js +62 -0
  70. package/dist/runner/runLoop.js.map +1 -0
  71. package/dist/runner/runLoop.mjs +57 -0
  72. package/dist/runner/runLoop.mjs.map +1 -0
  73. package/dist/runner/sessionPersistence.d.ts +26 -0
  74. package/dist/runner/sessionPersistence.js +441 -0
  75. package/dist/runner/sessionPersistence.js.map +1 -0
  76. package/dist/runner/sessionPersistence.mjs +431 -0
  77. package/dist/runner/sessionPersistence.mjs.map +1 -0
  78. package/dist/runner/steps.d.ts +48 -0
  79. package/dist/runner/steps.js +40 -0
  80. package/dist/runner/steps.js.map +1 -0
  81. package/dist/runner/steps.mjs +36 -0
  82. package/dist/runner/steps.mjs.map +1 -0
  83. package/dist/runner/streaming.d.ts +9 -0
  84. package/dist/runner/streaming.js +74 -0
  85. package/dist/runner/streaming.js.map +1 -0
  86. package/dist/runner/streaming.mjs +65 -0
  87. package/dist/runner/streaming.mjs.map +1 -0
  88. package/dist/runner/toolExecution.d.ts +15 -0
  89. package/dist/runner/toolExecution.js +997 -0
  90. package/dist/runner/toolExecution.js.map +1 -0
  91. package/dist/runner/toolExecution.mjs +984 -0
  92. package/dist/runner/toolExecution.mjs.map +1 -0
  93. package/dist/runner/toolUseTracker.d.ts +9 -0
  94. package/dist/runner/toolUseTracker.js +34 -0
  95. package/dist/runner/toolUseTracker.js.map +1 -0
  96. package/dist/runner/toolUseTracker.mjs +30 -0
  97. package/dist/runner/toolUseTracker.mjs.map +1 -0
  98. package/dist/runner/tracing.d.ts +23 -0
  99. package/dist/runner/tracing.js +45 -0
  100. package/dist/runner/tracing.js.map +1 -0
  101. package/dist/runner/tracing.mjs +41 -0
  102. package/dist/runner/tracing.mjs.map +1 -0
  103. package/dist/runner/turnPreparation.d.ts +30 -0
  104. package/dist/runner/turnPreparation.js +80 -0
  105. package/dist/runner/turnPreparation.js.map +1 -0
  106. package/dist/runner/turnPreparation.mjs +74 -0
  107. package/dist/runner/turnPreparation.mjs.map +1 -0
  108. package/dist/runner/turnResolution.d.ts +3 -0
  109. package/dist/runner/turnResolution.js +531 -0
  110. package/dist/runner/turnResolution.js.map +1 -0
  111. package/dist/runner/turnResolution.mjs +526 -0
  112. package/dist/runner/turnResolution.mjs.map +1 -0
  113. package/dist/runner/types.d.ts +66 -0
  114. package/dist/runner/types.js +3 -0
  115. package/dist/runner/types.js.map +1 -0
  116. package/dist/runner/types.mjs +2 -0
  117. package/dist/runner/types.mjs.map +1 -0
  118. package/dist/shims/mcp-server/node.js +51 -6
  119. package/dist/shims/mcp-server/node.js.map +1 -1
  120. package/dist/shims/mcp-server/node.mjs +51 -6
  121. package/dist/shims/mcp-server/node.mjs.map +1 -1
  122. package/dist/tool.d.ts +28 -2
  123. package/dist/tool.js +7 -1
  124. package/dist/tool.js.map +1 -1
  125. package/dist/tool.mjs +8 -2
  126. package/dist/tool.mjs.map +1 -1
  127. package/dist/toolGuardrail.d.ts +101 -0
  128. package/dist/toolGuardrail.js +58 -0
  129. package/dist/toolGuardrail.js.map +1 -0
  130. package/dist/toolGuardrail.mjs +51 -0
  131. package/dist/toolGuardrail.mjs.map +1 -0
  132. package/dist/tracing/config.d.ts +3 -0
  133. package/dist/tracing/config.js +3 -0
  134. package/dist/tracing/config.js.map +1 -0
  135. package/dist/tracing/config.mjs +2 -0
  136. package/dist/tracing/config.mjs.map +1 -0
  137. package/dist/tracing/context.d.ts +2 -0
  138. package/dist/tracing/context.js +95 -24
  139. package/dist/tracing/context.js.map +1 -1
  140. package/dist/tracing/context.mjs +95 -24
  141. package/dist/tracing/context.mjs.map +1 -1
  142. package/dist/tracing/createSpans.d.ts +11 -11
  143. package/dist/tracing/index.d.ts +2 -0
  144. package/dist/tracing/index.js.map +1 -1
  145. package/dist/tracing/index.mjs.map +1 -1
  146. package/dist/tracing/provider.js +54 -4
  147. package/dist/tracing/provider.js.map +1 -1
  148. package/dist/tracing/provider.mjs +54 -4
  149. package/dist/tracing/provider.mjs.map +1 -1
  150. package/dist/tracing/spans.d.ts +2 -0
  151. package/dist/tracing/spans.js +6 -0
  152. package/dist/tracing/spans.js.map +1 -1
  153. package/dist/tracing/spans.mjs +6 -0
  154. package/dist/tracing/spans.mjs.map +1 -1
  155. package/dist/tracing/traces.d.ts +11 -1
  156. package/dist/tracing/traces.js +15 -2
  157. package/dist/tracing/traces.js.map +1 -1
  158. package/dist/tracing/traces.mjs +15 -2
  159. package/dist/tracing/traces.mjs.map +1 -1
  160. package/dist/types/protocol.d.ts +11 -0
  161. package/dist/types/protocol.js +1 -0
  162. package/dist/types/protocol.js.map +1 -1
  163. package/dist/types/protocol.mjs +1 -0
  164. package/dist/types/protocol.mjs.map +1 -1
  165. package/dist/utils/binary.d.ts +6 -0
  166. package/dist/utils/binary.js +53 -0
  167. package/dist/utils/binary.js.map +1 -0
  168. package/dist/utils/binary.mjs +49 -0
  169. package/dist/utils/binary.mjs.map +1 -0
  170. package/dist/utils/toolGuardrails.d.ts +24 -0
  171. package/dist/utils/toolGuardrails.js +58 -0
  172. package/dist/utils/toolGuardrails.js.map +1 -0
  173. package/dist/utils/toolGuardrails.mjs +54 -0
  174. package/dist/utils/toolGuardrails.mjs.map +1 -0
  175. package/package.json +4 -3
  176. package/dist/runImplementation.d.ts +0 -161
  177. package/dist/runImplementation.js +0 -2054
  178. package/dist/runImplementation.js.map +0 -1
  179. package/dist/runImplementation.mjs +0 -2028
  180. package/dist/runImplementation.mjs.map +0 -1
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createGuardrailTracker = void 0;
4
+ exports.buildInputGuardrailDefinitions = buildInputGuardrailDefinitions;
5
+ exports.splitInputGuardrails = splitInputGuardrails;
6
+ exports.runInputGuardrails = runInputGuardrails;
7
+ exports.runOutputGuardrails = runOutputGuardrails;
8
+ const errors_1 = require("../errors.js");
9
+ const guardrail_1 = require("../guardrail.js");
10
+ const items_1 = require("./items.js");
11
+ const tracing_1 = require("../tracing/index.js");
12
+ const createGuardrailTracker = () => {
13
+ let pending = false;
14
+ let failed = false;
15
+ let error = undefined;
16
+ let promise;
17
+ const setError = (err) => {
18
+ failed = true;
19
+ error = err;
20
+ pending = false;
21
+ };
22
+ const setPromise = (incoming) => {
23
+ if (!incoming) {
24
+ return;
25
+ }
26
+ pending = true;
27
+ promise = incoming
28
+ .then((results) => results)
29
+ .catch((err) => {
30
+ setError(err);
31
+ // Swallow to keep downstream flow consistent; failure is signaled via `failed`.
32
+ return [];
33
+ })
34
+ .finally(() => {
35
+ pending = false;
36
+ });
37
+ };
38
+ const throwIfError = () => {
39
+ if (error) {
40
+ throw error;
41
+ }
42
+ };
43
+ const awaitCompletion = async (options) => {
44
+ if (promise) {
45
+ await promise;
46
+ }
47
+ if (error && !options?.suppressErrors) {
48
+ throw error;
49
+ }
50
+ };
51
+ return {
52
+ get pending() {
53
+ return pending;
54
+ },
55
+ get failed() {
56
+ return failed;
57
+ },
58
+ get error() {
59
+ return error;
60
+ },
61
+ markPending: () => {
62
+ pending = true;
63
+ },
64
+ setPromise,
65
+ setError,
66
+ throwIfError,
67
+ awaitCompletion,
68
+ };
69
+ };
70
+ exports.createGuardrailTracker = createGuardrailTracker;
71
+ async function runGuardrailsWithTripwire(options) {
72
+ const { state, guardrails, guardrailArgs, resultsTarget, onTripwire, isTripwireError, onError, } = options;
73
+ try {
74
+ const results = await Promise.all(guardrails.map(async (guardrail) => {
75
+ return (0, tracing_1.withGuardrailSpan)(async (span) => {
76
+ const result = await guardrail.run(guardrailArgs);
77
+ span.spanData.triggered = result.output.tripwireTriggered;
78
+ return result;
79
+ }, { data: { name: guardrail.name } }, state._currentAgentSpan);
80
+ }));
81
+ resultsTarget.push(...results);
82
+ for (const result of results) {
83
+ if (result.output.tripwireTriggered) {
84
+ if (state._currentAgentSpan) {
85
+ state._currentAgentSpan.setError({
86
+ message: 'Guardrail tripwire triggered',
87
+ data: { guardrail: result.guardrail.name },
88
+ });
89
+ }
90
+ onTripwire(result);
91
+ }
92
+ }
93
+ return results;
94
+ }
95
+ catch (error) {
96
+ if (isTripwireError(error)) {
97
+ throw error;
98
+ }
99
+ onError(error);
100
+ return [];
101
+ }
102
+ }
103
+ function buildInputGuardrailDefinitions(state, runnerGuardrails) {
104
+ return runnerGuardrails.concat(state._currentAgent.inputGuardrails.map(guardrail_1.defineInputGuardrail));
105
+ }
106
+ function splitInputGuardrails(guardrails) {
107
+ const blocking = [];
108
+ const parallel = [];
109
+ for (const guardrail of guardrails) {
110
+ if (guardrail.runInParallel === false) {
111
+ blocking.push(guardrail);
112
+ }
113
+ else {
114
+ parallel.push(guardrail);
115
+ }
116
+ }
117
+ return { blocking, parallel };
118
+ }
119
+ async function runInputGuardrails(state, guardrails) {
120
+ if (guardrails.length === 0) {
121
+ return [];
122
+ }
123
+ const guardrailArgs = {
124
+ agent: state._currentAgent,
125
+ input: state._originalInput,
126
+ context: state._context,
127
+ };
128
+ return await runGuardrailsWithTripwire({
129
+ state,
130
+ guardrails,
131
+ guardrailArgs,
132
+ resultsTarget: state._inputGuardrailResults,
133
+ onTripwire: (result) => {
134
+ throw new errors_1.InputGuardrailTripwireTriggered(`Input guardrail triggered: ${JSON.stringify(result.output.outputInfo)}`, result, state);
135
+ },
136
+ isTripwireError: (error) => error instanceof errors_1.InputGuardrailTripwireTriggered,
137
+ onError: (error) => {
138
+ // roll back the current turn to enable reruns
139
+ state._currentTurn--;
140
+ throw new errors_1.GuardrailExecutionError(`Input guardrail failed to complete: ${error}`, error, state);
141
+ },
142
+ });
143
+ }
144
+ async function runOutputGuardrails(state, runnerOutputGuardrails, output) {
145
+ const guardrails = runnerOutputGuardrails.concat(state._currentAgent.outputGuardrails.map(guardrail_1.defineOutputGuardrail));
146
+ if (guardrails.length === 0) {
147
+ return;
148
+ }
149
+ const agentOutput = state._currentAgent.processFinalOutput(output);
150
+ const runOutput = (0, items_1.getTurnInput)([], state._generatedItems);
151
+ const guardrailArgs = {
152
+ agent: state._currentAgent,
153
+ agentOutput,
154
+ context: state._context,
155
+ details: {
156
+ modelResponse: state._lastTurnResponse,
157
+ output: runOutput,
158
+ },
159
+ };
160
+ await runGuardrailsWithTripwire({
161
+ state,
162
+ guardrails,
163
+ guardrailArgs,
164
+ resultsTarget: state._outputGuardrailResults,
165
+ onTripwire: (result) => {
166
+ throw new errors_1.OutputGuardrailTripwireTriggered(`Output guardrail triggered: ${JSON.stringify(result.output.outputInfo)}`, result, state);
167
+ },
168
+ isTripwireError: (error) => error instanceof errors_1.OutputGuardrailTripwireTriggered,
169
+ onError: (error) => {
170
+ throw new errors_1.GuardrailExecutionError(`Output guardrail failed to complete: ${error}`, error, state);
171
+ },
172
+ });
173
+ }
174
+ //# sourceMappingURL=guardrails.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guardrails.js","sourceRoot":"","sources":["../../src/runner/guardrails.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,166 @@
1
+ import { GuardrailExecutionError, InputGuardrailTripwireTriggered, OutputGuardrailTripwireTriggered, } from "../errors.mjs";
2
+ import { defineInputGuardrail, defineOutputGuardrail, } from "../guardrail.mjs";
3
+ import { getTurnInput } from "./items.mjs";
4
+ import { withGuardrailSpan } from "../tracing/index.mjs";
5
+ export const createGuardrailTracker = () => {
6
+ let pending = false;
7
+ let failed = false;
8
+ let error = undefined;
9
+ let promise;
10
+ const setError = (err) => {
11
+ failed = true;
12
+ error = err;
13
+ pending = false;
14
+ };
15
+ const setPromise = (incoming) => {
16
+ if (!incoming) {
17
+ return;
18
+ }
19
+ pending = true;
20
+ promise = incoming
21
+ .then((results) => results)
22
+ .catch((err) => {
23
+ setError(err);
24
+ // Swallow to keep downstream flow consistent; failure is signaled via `failed`.
25
+ return [];
26
+ })
27
+ .finally(() => {
28
+ pending = false;
29
+ });
30
+ };
31
+ const throwIfError = () => {
32
+ if (error) {
33
+ throw error;
34
+ }
35
+ };
36
+ const awaitCompletion = async (options) => {
37
+ if (promise) {
38
+ await promise;
39
+ }
40
+ if (error && !options?.suppressErrors) {
41
+ throw error;
42
+ }
43
+ };
44
+ return {
45
+ get pending() {
46
+ return pending;
47
+ },
48
+ get failed() {
49
+ return failed;
50
+ },
51
+ get error() {
52
+ return error;
53
+ },
54
+ markPending: () => {
55
+ pending = true;
56
+ },
57
+ setPromise,
58
+ setError,
59
+ throwIfError,
60
+ awaitCompletion,
61
+ };
62
+ };
63
+ async function runGuardrailsWithTripwire(options) {
64
+ const { state, guardrails, guardrailArgs, resultsTarget, onTripwire, isTripwireError, onError, } = options;
65
+ try {
66
+ const results = await Promise.all(guardrails.map(async (guardrail) => {
67
+ return withGuardrailSpan(async (span) => {
68
+ const result = await guardrail.run(guardrailArgs);
69
+ span.spanData.triggered = result.output.tripwireTriggered;
70
+ return result;
71
+ }, { data: { name: guardrail.name } }, state._currentAgentSpan);
72
+ }));
73
+ resultsTarget.push(...results);
74
+ for (const result of results) {
75
+ if (result.output.tripwireTriggered) {
76
+ if (state._currentAgentSpan) {
77
+ state._currentAgentSpan.setError({
78
+ message: 'Guardrail tripwire triggered',
79
+ data: { guardrail: result.guardrail.name },
80
+ });
81
+ }
82
+ onTripwire(result);
83
+ }
84
+ }
85
+ return results;
86
+ }
87
+ catch (error) {
88
+ if (isTripwireError(error)) {
89
+ throw error;
90
+ }
91
+ onError(error);
92
+ return [];
93
+ }
94
+ }
95
+ export function buildInputGuardrailDefinitions(state, runnerGuardrails) {
96
+ return runnerGuardrails.concat(state._currentAgent.inputGuardrails.map(defineInputGuardrail));
97
+ }
98
+ export function splitInputGuardrails(guardrails) {
99
+ const blocking = [];
100
+ const parallel = [];
101
+ for (const guardrail of guardrails) {
102
+ if (guardrail.runInParallel === false) {
103
+ blocking.push(guardrail);
104
+ }
105
+ else {
106
+ parallel.push(guardrail);
107
+ }
108
+ }
109
+ return { blocking, parallel };
110
+ }
111
+ export async function runInputGuardrails(state, guardrails) {
112
+ if (guardrails.length === 0) {
113
+ return [];
114
+ }
115
+ const guardrailArgs = {
116
+ agent: state._currentAgent,
117
+ input: state._originalInput,
118
+ context: state._context,
119
+ };
120
+ return await runGuardrailsWithTripwire({
121
+ state,
122
+ guardrails,
123
+ guardrailArgs,
124
+ resultsTarget: state._inputGuardrailResults,
125
+ onTripwire: (result) => {
126
+ throw new InputGuardrailTripwireTriggered(`Input guardrail triggered: ${JSON.stringify(result.output.outputInfo)}`, result, state);
127
+ },
128
+ isTripwireError: (error) => error instanceof InputGuardrailTripwireTriggered,
129
+ onError: (error) => {
130
+ // roll back the current turn to enable reruns
131
+ state._currentTurn--;
132
+ throw new GuardrailExecutionError(`Input guardrail failed to complete: ${error}`, error, state);
133
+ },
134
+ });
135
+ }
136
+ export async function runOutputGuardrails(state, runnerOutputGuardrails, output) {
137
+ const guardrails = runnerOutputGuardrails.concat(state._currentAgent.outputGuardrails.map(defineOutputGuardrail));
138
+ if (guardrails.length === 0) {
139
+ return;
140
+ }
141
+ const agentOutput = state._currentAgent.processFinalOutput(output);
142
+ const runOutput = getTurnInput([], state._generatedItems);
143
+ const guardrailArgs = {
144
+ agent: state._currentAgent,
145
+ agentOutput,
146
+ context: state._context,
147
+ details: {
148
+ modelResponse: state._lastTurnResponse,
149
+ output: runOutput,
150
+ },
151
+ };
152
+ await runGuardrailsWithTripwire({
153
+ state,
154
+ guardrails,
155
+ guardrailArgs,
156
+ resultsTarget: state._outputGuardrailResults,
157
+ onTripwire: (result) => {
158
+ throw new OutputGuardrailTripwireTriggered(`Output guardrail triggered: ${JSON.stringify(result.output.outputInfo)}`, result, state);
159
+ },
160
+ isTripwireError: (error) => error instanceof OutputGuardrailTripwireTriggered,
161
+ onError: (error) => {
162
+ throw new GuardrailExecutionError(`Output guardrail failed to complete: ${error}`, error, state);
163
+ },
164
+ });
165
+ }
166
+ //# sourceMappingURL=guardrails.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guardrails.mjs","sourceRoot":"","sources":["../../src/runner/guardrails.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { RunItem } from '../items';
2
+ import { AgentInputItem } from '../types';
3
+ export type AgentInputItemPool = Map<string, AgentInputItem[]>;
4
+ export declare function toAgentInputList(originalInput: string | AgentInputItem[]): AgentInputItem[];
5
+ export declare function getAgentInputItemKey(item: AgentInputItem): string;
6
+ export declare function buildAgentInputPool(items: AgentInputItem[]): AgentInputItemPool;
7
+ export declare function takeAgentInputFromPool(pool: AgentInputItemPool, key: string): AgentInputItem | undefined;
8
+ export declare function removeAgentInputFromPool(pool: AgentInputItemPool, item: AgentInputItem): boolean;
9
+ export declare function agentInputSerializationReplacer(_key: string, value: unknown): unknown;
10
+ export declare function extractOutputItemsFromRunItems(items: RunItem[]): AgentInputItem[];
11
+ /**
12
+ * Constructs the model input array for the current turn by combining the original turn input with
13
+ * any new run items (excluding tool approval placeholders). This helps ensure that repeated calls
14
+ * to the Responses API only send newly generated content.
15
+ *
16
+ * See: https://platform.openai.com/docs/guides/conversation-state?api-mode=responses.
17
+ */
18
+ export declare function getTurnInput(originalInput: string | AgentInputItem[], generatedItems: RunItem[]): AgentInputItem[];
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toAgentInputList = toAgentInputList;
4
+ exports.getAgentInputItemKey = getAgentInputItemKey;
5
+ exports.buildAgentInputPool = buildAgentInputPool;
6
+ exports.takeAgentInputFromPool = takeAgentInputFromPool;
7
+ exports.removeAgentInputFromPool = removeAgentInputFromPool;
8
+ exports.agentInputSerializationReplacer = agentInputSerializationReplacer;
9
+ exports.extractOutputItemsFromRunItems = extractOutputItemsFromRunItems;
10
+ exports.getTurnInput = getTurnInput;
11
+ const binary_1 = require("../utils/binary.js");
12
+ // Normalizes user-provided input into the structure the model expects. Strings become user messages,
13
+ // arrays are kept as-is so downstream loops can treat both scenarios uniformly.
14
+ function toAgentInputList(originalInput) {
15
+ if (typeof originalInput === 'string') {
16
+ return [{ type: 'message', role: 'user', content: originalInput }];
17
+ }
18
+ return [...originalInput];
19
+ }
20
+ function getAgentInputItemKey(item) {
21
+ return JSON.stringify(item, agentInputSerializationReplacer);
22
+ }
23
+ function buildAgentInputPool(items) {
24
+ const pool = new Map();
25
+ for (const item of items) {
26
+ const key = getAgentInputItemKey(item);
27
+ const existing = pool.get(key);
28
+ if (existing) {
29
+ existing.push(item);
30
+ }
31
+ else {
32
+ pool.set(key, [item]);
33
+ }
34
+ }
35
+ return pool;
36
+ }
37
+ function takeAgentInputFromPool(pool, key) {
38
+ const candidates = pool.get(key);
39
+ if (!candidates || candidates.length === 0) {
40
+ return undefined;
41
+ }
42
+ const [first] = candidates;
43
+ candidates.shift();
44
+ if (candidates.length === 0) {
45
+ pool.delete(key);
46
+ }
47
+ return first;
48
+ }
49
+ function removeAgentInputFromPool(pool, item) {
50
+ const key = getAgentInputItemKey(item);
51
+ const candidates = pool.get(key);
52
+ if (!candidates || candidates.length === 0) {
53
+ return false;
54
+ }
55
+ const index = candidates.findIndex((candidate) => candidate === item);
56
+ if (index === -1) {
57
+ return false;
58
+ }
59
+ candidates.splice(index, 1);
60
+ if (candidates.length === 0) {
61
+ pool.delete(key);
62
+ }
63
+ return true;
64
+ }
65
+ function agentInputSerializationReplacer(_key, value) {
66
+ const serialized = (0, binary_1.serializeBinary)(value);
67
+ if (serialized) {
68
+ return serialized;
69
+ }
70
+ return value;
71
+ }
72
+ // Extracts model-ready output items from run items, excluding approval placeholders.
73
+ function extractOutputItemsFromRunItems(items) {
74
+ return items
75
+ .filter((item) => item.type !== 'tool_approval_item')
76
+ .map((item) => item.rawItem);
77
+ }
78
+ /**
79
+ * Constructs the model input array for the current turn by combining the original turn input with
80
+ * any new run items (excluding tool approval placeholders). This helps ensure that repeated calls
81
+ * to the Responses API only send newly generated content.
82
+ *
83
+ * See: https://platform.openai.com/docs/guides/conversation-state?api-mode=responses.
84
+ */
85
+ function getTurnInput(originalInput, generatedItems) {
86
+ const outputItems = extractOutputItemsFromRunItems(generatedItems);
87
+ return [...toAgentInputList(originalInput), ...outputItems];
88
+ }
89
+ //# sourceMappingURL=items.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"items.js","sourceRoot":"","sources":["../../src/runner/items.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ import { serializeBinary } from "../utils/binary.mjs";
2
+ // Normalizes user-provided input into the structure the model expects. Strings become user messages,
3
+ // arrays are kept as-is so downstream loops can treat both scenarios uniformly.
4
+ export function toAgentInputList(originalInput) {
5
+ if (typeof originalInput === 'string') {
6
+ return [{ type: 'message', role: 'user', content: originalInput }];
7
+ }
8
+ return [...originalInput];
9
+ }
10
+ export function getAgentInputItemKey(item) {
11
+ return JSON.stringify(item, agentInputSerializationReplacer);
12
+ }
13
+ export function buildAgentInputPool(items) {
14
+ const pool = new Map();
15
+ for (const item of items) {
16
+ const key = getAgentInputItemKey(item);
17
+ const existing = pool.get(key);
18
+ if (existing) {
19
+ existing.push(item);
20
+ }
21
+ else {
22
+ pool.set(key, [item]);
23
+ }
24
+ }
25
+ return pool;
26
+ }
27
+ export function takeAgentInputFromPool(pool, key) {
28
+ const candidates = pool.get(key);
29
+ if (!candidates || candidates.length === 0) {
30
+ return undefined;
31
+ }
32
+ const [first] = candidates;
33
+ candidates.shift();
34
+ if (candidates.length === 0) {
35
+ pool.delete(key);
36
+ }
37
+ return first;
38
+ }
39
+ export function removeAgentInputFromPool(pool, item) {
40
+ const key = getAgentInputItemKey(item);
41
+ const candidates = pool.get(key);
42
+ if (!candidates || candidates.length === 0) {
43
+ return false;
44
+ }
45
+ const index = candidates.findIndex((candidate) => candidate === item);
46
+ if (index === -1) {
47
+ return false;
48
+ }
49
+ candidates.splice(index, 1);
50
+ if (candidates.length === 0) {
51
+ pool.delete(key);
52
+ }
53
+ return true;
54
+ }
55
+ export function agentInputSerializationReplacer(_key, value) {
56
+ const serialized = serializeBinary(value);
57
+ if (serialized) {
58
+ return serialized;
59
+ }
60
+ return value;
61
+ }
62
+ // Extracts model-ready output items from run items, excluding approval placeholders.
63
+ export function extractOutputItemsFromRunItems(items) {
64
+ return items
65
+ .filter((item) => item.type !== 'tool_approval_item')
66
+ .map((item) => item.rawItem);
67
+ }
68
+ /**
69
+ * Constructs the model input array for the current turn by combining the original turn input with
70
+ * any new run items (excluding tool approval placeholders). This helps ensure that repeated calls
71
+ * to the Responses API only send newly generated content.
72
+ *
73
+ * See: https://platform.openai.com/docs/guides/conversation-state?api-mode=responses.
74
+ */
75
+ export function getTurnInput(originalInput, generatedItems) {
76
+ const outputItems = extractOutputItemsFromRunItems(generatedItems);
77
+ return [...toAgentInputList(originalInput), ...outputItems];
78
+ }
79
+ //# sourceMappingURL=items.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"items.mjs","sourceRoot":"","sources":["../../src/runner/items.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { Agent } from '../agent';
2
+ import { RunItem, RunToolApprovalItem } from '../items';
3
+ import { RunState } from '../runState';
4
+ import { FunctionToolResult } from '../tool';
5
+ import * as protocol from '../types/protocol';
6
+ import type { ToolRunMCPApprovalRequest } from './types';
7
+ type ResolveApproval = (rawItem: protocol.HostedToolCallItem) => boolean | undefined;
8
+ type HandleHostedMcpApprovalsParams<TContext> = {
9
+ requests: ToolRunMCPApprovalRequest[];
10
+ agent: Agent<TContext, any>;
11
+ state: RunState<TContext, Agent<TContext, any>>;
12
+ functionResults: FunctionToolResult<TContext>[];
13
+ appendIfNew: (item: RunItem) => void;
14
+ resolveApproval?: ResolveApproval;
15
+ };
16
+ export type HandleHostedMcpApprovalsResult = {
17
+ pendingApprovals: Set<RunToolApprovalItem>;
18
+ pendingApprovalIds: Set<string>;
19
+ };
20
+ /**
21
+ * Normalizes hosted MCP approval flows so streaming and non-streaming loops share identical
22
+ * behavior. Handles synchronous approvals, previously decided approvals, and pending approvals.
23
+ */
24
+ export declare function handleHostedMcpApprovals<TContext>({ requests, agent, state, functionResults, appendIfNew, resolveApproval, }: HandleHostedMcpApprovalsParams<TContext>): Promise<HandleHostedMcpApprovalsResult>;
25
+ export {};
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleHostedMcpApprovals = handleHostedMcpApprovals;
4
+ const items_1 = require("../items.js");
5
+ /**
6
+ * Normalizes hosted MCP approval flows so streaming and non-streaming loops share identical
7
+ * behavior. Handles synchronous approvals, previously decided approvals, and pending approvals.
8
+ */
9
+ async function handleHostedMcpApprovals({ requests, agent, state, functionResults, appendIfNew, resolveApproval, }) {
10
+ const pendingApprovals = new Set();
11
+ const pendingApprovalIds = new Set();
12
+ for (const approvalRequest of requests) {
13
+ const rawItem = approvalRequest.requestItem.rawItem;
14
+ if (rawItem.type !== 'hosted_tool_call') {
15
+ continue;
16
+ }
17
+ const providerData = rawItem.providerData;
18
+ if (!providerData) {
19
+ continue;
20
+ }
21
+ const toolData = approvalRequest.mcpTool.providerData;
22
+ const approvalRequestId = rawItem.id ?? providerData.id;
23
+ if (toolData?.on_approval) {
24
+ const approvalResult = await toolData.on_approval(state._context, approvalRequest.requestItem);
25
+ const approvalResponseData = {
26
+ approve: approvalResult.approve,
27
+ approval_request_id: approvalRequestId ?? providerData.id,
28
+ reason: approvalResult.reason,
29
+ };
30
+ appendIfNew(new items_1.RunToolCallItem({
31
+ type: 'hosted_tool_call',
32
+ name: 'mcp_approval_response',
33
+ providerData: approvalResponseData,
34
+ }, agent));
35
+ continue;
36
+ }
37
+ const approvalDecision = typeof resolveApproval === 'function'
38
+ ? resolveApproval(rawItem)
39
+ : undefined;
40
+ if (typeof approvalDecision !== 'undefined' && approvalRequestId) {
41
+ const approvalResponseData = {
42
+ approve: approvalDecision,
43
+ approval_request_id: approvalRequestId,
44
+ reason: undefined,
45
+ };
46
+ appendIfNew(new items_1.RunToolCallItem({
47
+ type: 'hosted_tool_call',
48
+ name: 'mcp_approval_response',
49
+ providerData: approvalResponseData,
50
+ }, agent));
51
+ continue;
52
+ }
53
+ functionResults.push({
54
+ type: 'hosted_mcp_tool_approval',
55
+ tool: approvalRequest.mcpTool,
56
+ runItem: approvalRequest.requestItem,
57
+ });
58
+ appendIfNew(approvalRequest.requestItem);
59
+ pendingApprovals.add(approvalRequest.requestItem);
60
+ if (approvalRequestId) {
61
+ pendingApprovalIds.add(approvalRequestId);
62
+ }
63
+ }
64
+ return { pendingApprovals, pendingApprovalIds };
65
+ }
66
+ //# sourceMappingURL=mcpApprovals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpApprovals.js","sourceRoot":"","sources":["../../src/runner/mcpApprovals.ts"],"names":[],"mappings":";;AA8BA,4DAyFC;AAtHD,uCAAyE;AAyBzE;;;GAGG;AACI,KAAK,UAAU,wBAAwB,CAAW,EACvD,QAAQ,EACR,KAAK,EACL,KAAK,EACL,eAAe,EACf,WAAW,EACX,eAAe,GAC0B;IACzC,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAuB,CAAC;IACxD,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAC;IAE7C,KAAK,MAAM,eAAe,IAAI,QAAQ,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,eAAe,CAAC,WAAW,CAAC,OAAO,CAAC;QACpD,IAAI,OAAO,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;YACxC,SAAS;QACX,CAAC;QAED,MAAM,YAAY,GAAG,OAAO,CAAC,YAEhB,CAAC;QACd,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,YAE5B,CAAC;QACd,MAAM,iBAAiB,GAAG,OAAO,CAAC,EAAE,IAAI,YAAY,CAAC,EAAE,CAAC;QAExD,IAAI,QAAQ,EAAE,WAAW,EAAE,CAAC;YAC1B,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,WAAW,CAC/C,KAAK,CAAC,QAAQ,EACd,eAAe,CAAC,WAAW,CAC5B,CAAC;YACF,MAAM,oBAAoB,GAA2C;gBACnE,OAAO,EAAE,cAAc,CAAC,OAAO;gBAC/B,mBAAmB,EAAE,iBAAiB,IAAI,YAAY,CAAC,EAAE;gBACzD,MAAM,EAAE,cAAc,CAAC,MAAM;aAC9B,CAAC;YACF,WAAW,CACT,IAAI,uBAAe,CACjB;gBACE,IAAI,EAAE,kBAAkB;gBACxB,IAAI,EAAE,uBAAuB;gBAC7B,YAAY,EAAE,oBAAoB;aACnC,EACD,KAA+B,CAChC,CACF,CAAC;YACF,SAAS;QACX,CAAC;QAED,MAAM,gBAAgB,GACpB,OAAO,eAAe,KAAK,UAAU;YACnC,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC;YAC1B,CAAC,CAAC,SAAS,CAAC;QAChB,IAAI,OAAO,gBAAgB,KAAK,WAAW,IAAI,iBAAiB,EAAE,CAAC;YACjE,MAAM,oBAAoB,GAA2C;gBACnE,OAAO,EAAE,gBAAgB;gBACzB,mBAAmB,EAAE,iBAAiB;gBACtC,MAAM,EAAE,SAAS;aAClB,CAAC;YACF,WAAW,CACT,IAAI,uBAAe,CACjB;gBACE,IAAI,EAAE,kBAAkB;gBACxB,IAAI,EAAE,uBAAuB;gBAC7B,YAAY,EAAE,oBAAoB;aACnC,EACD,KAA+B,CAChC,CACF,CAAC;YACF,SAAS;QACX,CAAC;QAED,eAAe,CAAC,IAAI,CAAC;YACnB,IAAI,EAAE,0BAA0B;YAChC,IAAI,EAAE,eAAe,CAAC,OAAO;YAC7B,OAAO,EAAE,eAAe,CAAC,WAAW;SACrC,CAAC,CAAC;QACH,WAAW,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QAEzC,gBAAgB,CAAC,GAAG,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QAClD,IAAI,iBAAiB,EAAE,CAAC;YACtB,kBAAkB,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,CAAC;AAClD,CAAC"}