@openai/agents-core 0.3.6 → 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.
- package/dist/errors.d.ts +40 -0
- package/dist/errors.js +38 -1
- package/dist/errors.js.map +1 -1
- package/dist/errors.mjs +34 -0
- package/dist/errors.mjs.map +1 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.js +13 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3 -1
- package/dist/index.mjs.map +1 -1
- package/dist/metadata.js +2 -2
- package/dist/metadata.mjs +2 -2
- package/dist/result.d.ts +17 -0
- package/dist/result.js +71 -24
- package/dist/result.js.map +1 -1
- package/dist/result.mjs +69 -22
- package/dist/result.mjs.map +1 -1
- package/dist/run.d.ts +14 -47
- package/dist/run.js +421 -994
- package/dist/run.js.map +1 -1
- package/dist/run.mjs +405 -978
- package/dist/run.mjs.map +1 -1
- package/dist/runState.d.ts +1286 -172
- package/dist/runState.js +146 -16
- package/dist/runState.js.map +1 -1
- package/dist/runState.mjs +142 -12
- package/dist/runState.mjs.map +1 -1
- package/dist/runner/constants.d.ts +1 -0
- package/dist/runner/constants.js +6 -0
- package/dist/runner/constants.js.map +1 -0
- package/dist/runner/constants.mjs +3 -0
- package/dist/runner/constants.mjs.map +1 -0
- package/dist/runner/conversation.d.ts +85 -0
- package/dist/runner/conversation.js +275 -0
- package/dist/runner/conversation.js.map +1 -0
- package/dist/runner/conversation.mjs +269 -0
- package/dist/runner/conversation.mjs.map +1 -0
- package/dist/runner/guardrails.d.ts +23 -0
- package/dist/runner/guardrails.js +174 -0
- package/dist/runner/guardrails.js.map +1 -0
- package/dist/runner/guardrails.mjs +166 -0
- package/dist/runner/guardrails.mjs.map +1 -0
- package/dist/runner/items.d.ts +18 -0
- package/dist/runner/items.js +89 -0
- package/dist/runner/items.js.map +1 -0
- package/dist/runner/items.mjs +79 -0
- package/dist/runner/items.mjs.map +1 -0
- package/dist/runner/mcpApprovals.d.ts +25 -0
- package/dist/runner/mcpApprovals.js +66 -0
- package/dist/runner/mcpApprovals.js.map +1 -0
- package/dist/runner/mcpApprovals.mjs +63 -0
- package/dist/runner/mcpApprovals.mjs.map +1 -0
- package/dist/runner/modelOutputs.d.ts +10 -0
- package/dist/runner/modelOutputs.js +206 -0
- package/dist/runner/modelOutputs.js.map +1 -0
- package/dist/runner/modelOutputs.mjs +203 -0
- package/dist/runner/modelOutputs.mjs.map +1 -0
- package/dist/runner/modelPreparation.d.ts +8 -0
- package/dist/runner/modelPreparation.js +41 -0
- package/dist/runner/modelPreparation.js.map +1 -0
- package/dist/runner/modelPreparation.mjs +38 -0
- package/dist/runner/modelPreparation.mjs.map +1 -0
- package/dist/runner/modelSettings.d.ts +20 -0
- package/dist/runner/modelSettings.js +97 -0
- package/dist/runner/modelSettings.js.map +1 -0
- package/dist/runner/modelSettings.mjs +92 -0
- package/dist/runner/modelSettings.mjs.map +1 -0
- package/dist/runner/runLoop.d.ts +32 -0
- package/dist/runner/runLoop.js +62 -0
- package/dist/runner/runLoop.js.map +1 -0
- package/dist/runner/runLoop.mjs +57 -0
- package/dist/runner/runLoop.mjs.map +1 -0
- package/dist/runner/sessionPersistence.d.ts +26 -0
- package/dist/runner/sessionPersistence.js +441 -0
- package/dist/runner/sessionPersistence.js.map +1 -0
- package/dist/runner/sessionPersistence.mjs +431 -0
- package/dist/runner/sessionPersistence.mjs.map +1 -0
- package/dist/runner/steps.d.ts +48 -0
- package/dist/runner/steps.js +40 -0
- package/dist/runner/steps.js.map +1 -0
- package/dist/runner/steps.mjs +36 -0
- package/dist/runner/steps.mjs.map +1 -0
- package/dist/runner/streaming.d.ts +9 -0
- package/dist/runner/streaming.js +74 -0
- package/dist/runner/streaming.js.map +1 -0
- package/dist/runner/streaming.mjs +65 -0
- package/dist/runner/streaming.mjs.map +1 -0
- package/dist/runner/toolExecution.d.ts +15 -0
- package/dist/runner/toolExecution.js +997 -0
- package/dist/runner/toolExecution.js.map +1 -0
- package/dist/runner/toolExecution.mjs +984 -0
- package/dist/runner/toolExecution.mjs.map +1 -0
- package/dist/runner/toolUseTracker.d.ts +9 -0
- package/dist/runner/toolUseTracker.js +34 -0
- package/dist/runner/toolUseTracker.js.map +1 -0
- package/dist/runner/toolUseTracker.mjs +30 -0
- package/dist/runner/toolUseTracker.mjs.map +1 -0
- package/dist/runner/tracing.d.ts +23 -0
- package/dist/runner/tracing.js +45 -0
- package/dist/runner/tracing.js.map +1 -0
- package/dist/runner/tracing.mjs +41 -0
- package/dist/runner/tracing.mjs.map +1 -0
- package/dist/runner/turnPreparation.d.ts +30 -0
- package/dist/runner/turnPreparation.js +80 -0
- package/dist/runner/turnPreparation.js.map +1 -0
- package/dist/runner/turnPreparation.mjs +74 -0
- package/dist/runner/turnPreparation.mjs.map +1 -0
- package/dist/runner/turnResolution.d.ts +3 -0
- package/dist/runner/turnResolution.js +531 -0
- package/dist/runner/turnResolution.js.map +1 -0
- package/dist/runner/turnResolution.mjs +526 -0
- package/dist/runner/turnResolution.mjs.map +1 -0
- package/dist/runner/types.d.ts +66 -0
- package/dist/runner/types.js +3 -0
- package/dist/runner/types.js.map +1 -0
- package/dist/runner/types.mjs +2 -0
- package/dist/runner/types.mjs.map +1 -0
- package/dist/shims/mcp-server/node.js +76 -30
- package/dist/shims/mcp-server/node.js.map +1 -1
- package/dist/shims/mcp-server/node.mjs +76 -30
- package/dist/shims/mcp-server/node.mjs.map +1 -1
- package/dist/tool.d.ts +28 -2
- package/dist/tool.js +7 -1
- package/dist/tool.js.map +1 -1
- package/dist/tool.mjs +8 -2
- package/dist/tool.mjs.map +1 -1
- package/dist/toolGuardrail.d.ts +101 -0
- package/dist/toolGuardrail.js +58 -0
- package/dist/toolGuardrail.js.map +1 -0
- package/dist/toolGuardrail.mjs +51 -0
- package/dist/toolGuardrail.mjs.map +1 -0
- package/dist/tracing/config.d.ts +3 -0
- package/dist/tracing/config.js +3 -0
- package/dist/tracing/config.js.map +1 -0
- package/dist/tracing/config.mjs +2 -0
- package/dist/tracing/config.mjs.map +1 -0
- package/dist/tracing/context.d.ts +2 -0
- package/dist/tracing/context.js +95 -24
- package/dist/tracing/context.js.map +1 -1
- package/dist/tracing/context.mjs +95 -24
- package/dist/tracing/context.mjs.map +1 -1
- package/dist/tracing/createSpans.d.ts +11 -11
- package/dist/tracing/index.d.ts +2 -0
- package/dist/tracing/index.js.map +1 -1
- package/dist/tracing/index.mjs.map +1 -1
- package/dist/tracing/provider.js +54 -4
- package/dist/tracing/provider.js.map +1 -1
- package/dist/tracing/provider.mjs +54 -4
- package/dist/tracing/provider.mjs.map +1 -1
- package/dist/tracing/spans.d.ts +2 -0
- package/dist/tracing/spans.js +6 -0
- package/dist/tracing/spans.js.map +1 -1
- package/dist/tracing/spans.mjs +6 -0
- package/dist/tracing/spans.mjs.map +1 -1
- package/dist/tracing/traces.d.ts +11 -1
- package/dist/tracing/traces.js +15 -2
- package/dist/tracing/traces.js.map +1 -1
- package/dist/tracing/traces.mjs +15 -2
- package/dist/tracing/traces.mjs.map +1 -1
- package/dist/types/protocol.d.ts +11 -0
- package/dist/types/protocol.js +1 -0
- package/dist/types/protocol.js.map +1 -1
- package/dist/types/protocol.mjs +1 -0
- package/dist/types/protocol.mjs.map +1 -1
- package/dist/utils/binary.d.ts +6 -0
- package/dist/utils/binary.js +53 -0
- package/dist/utils/binary.js.map +1 -0
- package/dist/utils/binary.mjs +49 -0
- package/dist/utils/binary.mjs.map +1 -0
- package/dist/utils/toolGuardrails.d.ts +24 -0
- package/dist/utils/toolGuardrails.js +58 -0
- package/dist/utils/toolGuardrails.js.map +1 -0
- package/dist/utils/toolGuardrails.mjs +54 -0
- package/dist/utils/toolGuardrails.mjs.map +1 -0
- package/package.json +4 -3
- package/dist/runImplementation.d.ts +0 -161
- package/dist/runImplementation.js +0 -2054
- package/dist/runImplementation.js.map +0 -1
- package/dist/runImplementation.mjs +0 -2028
- 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"}
|