@cleocode/adapters 2026.5.4 → 2026.5.5
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/package.json +4 -4
- package/dist/cant-context.js +0 -711
- package/dist/cant-context.js.map +0 -1
- package/dist/providers/claude-code/adapter.js +0 -222
- package/dist/providers/claude-code/adapter.js.map +0 -1
- package/dist/providers/claude-code/context-monitor.js +0 -159
- package/dist/providers/claude-code/context-monitor.js.map +0 -1
- package/dist/providers/claude-code/hooks.js +0 -428
- package/dist/providers/claude-code/hooks.js.map +0 -1
- package/dist/providers/claude-code/index.js +0 -41
- package/dist/providers/claude-code/index.js.map +0 -1
- package/dist/providers/claude-code/install.js +0 -310
- package/dist/providers/claude-code/install.js.map +0 -1
- package/dist/providers/claude-code/paths.js +0 -41
- package/dist/providers/claude-code/paths.js.map +0 -1
- package/dist/providers/claude-code/spawn.js +0 -198
- package/dist/providers/claude-code/spawn.js.map +0 -1
- package/dist/providers/claude-code/statusline.js +0 -130
- package/dist/providers/claude-code/statusline.js.map +0 -1
- package/dist/providers/claude-code/task-sync.js +0 -119
- package/dist/providers/claude-code/task-sync.js.map +0 -1
- package/dist/providers/claude-code/transport.js +0 -29
- package/dist/providers/claude-code/transport.js.map +0 -1
- package/dist/providers/claude-sdk/adapter.js +0 -88
- package/dist/providers/claude-sdk/adapter.js.map +0 -1
- package/dist/providers/claude-sdk/index.js +0 -34
- package/dist/providers/claude-sdk/index.js.map +0 -1
- package/dist/providers/claude-sdk/install.js +0 -61
- package/dist/providers/claude-sdk/install.js.map +0 -1
- package/dist/providers/claude-sdk/mcp-registry.js +0 -66
- package/dist/providers/claude-sdk/mcp-registry.js.map +0 -1
- package/dist/providers/claude-sdk/session-store.js +0 -84
- package/dist/providers/claude-sdk/session-store.js.map +0 -1
- package/dist/providers/claude-sdk/spawn.js +0 -251
- package/dist/providers/claude-sdk/spawn.js.map +0 -1
- package/dist/providers/claude-sdk/tool-bridge.js +0 -50
- package/dist/providers/claude-sdk/tool-bridge.js.map +0 -1
- package/dist/providers/codex/adapter.js +0 -146
- package/dist/providers/codex/adapter.js.map +0 -1
- package/dist/providers/codex/hooks.js +0 -113
- package/dist/providers/codex/hooks.js.map +0 -1
- package/dist/providers/codex/index.js +0 -40
- package/dist/providers/codex/index.js.map +0 -1
- package/dist/providers/codex/install.js +0 -132
- package/dist/providers/codex/install.js.map +0 -1
- package/dist/providers/codex/spawn.js +0 -203
- package/dist/providers/codex/spawn.js.map +0 -1
- package/dist/providers/cursor/adapter.js +0 -151
- package/dist/providers/cursor/adapter.js.map +0 -1
- package/dist/providers/cursor/hooks.js +0 -208
- package/dist/providers/cursor/hooks.js.map +0 -1
- package/dist/providers/cursor/index.js +0 -36
- package/dist/providers/cursor/index.js.map +0 -1
- package/dist/providers/cursor/install.js +0 -281
- package/dist/providers/cursor/install.js.map +0 -1
- package/dist/providers/cursor/spawn.js +0 -59
- package/dist/providers/cursor/spawn.js.map +0 -1
- package/dist/providers/gemini-cli/adapter.js +0 -158
- package/dist/providers/gemini-cli/adapter.js.map +0 -1
- package/dist/providers/gemini-cli/hooks.js +0 -128
- package/dist/providers/gemini-cli/hooks.js.map +0 -1
- package/dist/providers/gemini-cli/index.js +0 -40
- package/dist/providers/gemini-cli/index.js.map +0 -1
- package/dist/providers/gemini-cli/install.js +0 -124
- package/dist/providers/gemini-cli/install.js.map +0 -1
- package/dist/providers/gemini-cli/spawn.js +0 -195
- package/dist/providers/gemini-cli/spawn.js.map +0 -1
- package/dist/providers/kimi/adapter.js +0 -145
- package/dist/providers/kimi/adapter.js.map +0 -1
- package/dist/providers/kimi/hooks.js +0 -79
- package/dist/providers/kimi/hooks.js.map +0 -1
- package/dist/providers/kimi/index.js +0 -40
- package/dist/providers/kimi/index.js.map +0 -1
- package/dist/providers/kimi/install.js +0 -124
- package/dist/providers/kimi/install.js.map +0 -1
- package/dist/providers/kimi/spawn.js +0 -225
- package/dist/providers/kimi/spawn.js.map +0 -1
- package/dist/providers/openai-sdk/adapter.js +0 -121
- package/dist/providers/openai-sdk/adapter.js.map +0 -1
- package/dist/providers/openai-sdk/guardrails.js +0 -174
- package/dist/providers/openai-sdk/guardrails.js.map +0 -1
- package/dist/providers/openai-sdk/handoff.js +0 -128
- package/dist/providers/openai-sdk/handoff.js.map +0 -1
- package/dist/providers/openai-sdk/index.js +0 -40
- package/dist/providers/openai-sdk/index.js.map +0 -1
- package/dist/providers/openai-sdk/install.js +0 -120
- package/dist/providers/openai-sdk/install.js.map +0 -1
- package/dist/providers/openai-sdk/spawn.js +0 -361
- package/dist/providers/openai-sdk/spawn.js.map +0 -1
- package/dist/providers/openai-sdk/tracing.js +0 -159
- package/dist/providers/openai-sdk/tracing.js.map +0 -1
- package/dist/providers/opencode/adapter.js +0 -166
- package/dist/providers/opencode/adapter.js.map +0 -1
- package/dist/providers/opencode/hooks.js +0 -206
- package/dist/providers/opencode/hooks.js.map +0 -1
- package/dist/providers/opencode/index.js +0 -37
- package/dist/providers/opencode/index.js.map +0 -1
- package/dist/providers/opencode/install.js +0 -242
- package/dist/providers/opencode/install.js.map +0 -1
- package/dist/providers/opencode/spawn.js +0 -257
- package/dist/providers/opencode/spawn.js.map +0 -1
- package/dist/providers/pi/adapter.js +0 -220
- package/dist/providers/pi/adapter.js.map +0 -1
- package/dist/providers/pi/hooks.js +0 -223
- package/dist/providers/pi/hooks.js.map +0 -1
- package/dist/providers/pi/index.js +0 -38
- package/dist/providers/pi/index.js.map +0 -1
- package/dist/providers/pi/install.js +0 -183
- package/dist/providers/pi/install.js.map +0 -1
- package/dist/providers/pi/spawn.js +0 -187
- package/dist/providers/pi/spawn.js.map +0 -1
- package/dist/providers/shared/conduit-trace-writer.js +0 -65
- package/dist/providers/shared/conduit-trace-writer.js.map +0 -1
- package/dist/providers/shared/hook-template-installer.js +0 -209
- package/dist/providers/shared/hook-template-installer.js.map +0 -1
- package/dist/providers/shared/paths.js +0 -77
- package/dist/providers/shared/paths.js.map +0 -1
- package/dist/providers/shared/sdk-result-mapper.js +0 -55
- package/dist/providers/shared/sdk-result-mapper.js.map +0 -1
- package/dist/providers/shared/transcript-reader.js +0 -124
- package/dist/providers/shared/transcript-reader.js.map +0 -1
- package/dist/registry.js +0 -92
- package/dist/registry.js.map +0 -1
|
@@ -1,361 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OpenAI SDK spawn provider — Vercel AI SDK edition.
|
|
3
|
-
*
|
|
4
|
-
* Implements `AdapterSpawnProvider` using the Vercel AI SDK
|
|
5
|
-
* (`ai` v6 + `@ai-sdk/openai`) instead of the legacy `@openai/agents`. CLEO
|
|
6
|
-
* retains its own orchestration (handoff topology, guardrails, tracing); the
|
|
7
|
-
* SDK is strictly the LLM bridge.
|
|
8
|
-
*
|
|
9
|
-
* Unlike the Claude Code provider (detached fire-and-forget), this provider
|
|
10
|
-
* awaits the run and returns `status: 'completed'` or `status: 'failed'` so
|
|
11
|
-
* the orchestrator receives rich output immediately.
|
|
12
|
-
*
|
|
13
|
-
* Key features:
|
|
14
|
-
* - Tier-based model selection (lead → gpt-4.1, worker → gpt-4.1-mini)
|
|
15
|
-
* - Handoff topology built from `SpawnContext.options.handoffs` (CLEO-native)
|
|
16
|
-
* - CLEO path ACL guardrails evaluated before the model call
|
|
17
|
-
* - Default-on tracing via `CleoConduitTraceProcessor`
|
|
18
|
-
* - CANT prompt enrichment (best-effort, same as Claude Code provider)
|
|
19
|
-
*
|
|
20
|
-
* @task T582 (original)
|
|
21
|
-
* @task T933 (SDK consolidation — Vercel AI SDK migration)
|
|
22
|
-
* @see ADR-052 — SDK consolidation decision
|
|
23
|
-
*/
|
|
24
|
-
import { getErrorMessage } from '@cleocode/contracts';
|
|
25
|
-
import { mapSdkRunOutcome } from '../shared/sdk-result-mapper.js';
|
|
26
|
-
import { buildDefaultGuardrails, evaluateGuardrails } from './guardrails.js';
|
|
27
|
-
import { buildAgentTopology } from './handoff.js';
|
|
28
|
-
import { CleoConduitTraceProcessor } from './tracing.js';
|
|
29
|
-
// ---------------------------------------------------------------------------
|
|
30
|
-
// Constants
|
|
31
|
-
// ---------------------------------------------------------------------------
|
|
32
|
-
const MODEL_LEAD = 'gpt-4.1';
|
|
33
|
-
const MODEL_WORKER = 'gpt-4.1-mini';
|
|
34
|
-
// ---------------------------------------------------------------------------
|
|
35
|
-
// Trace processor registry (module-scoped)
|
|
36
|
-
// ---------------------------------------------------------------------------
|
|
37
|
-
/** Registered trace processors that receive span events across the module. */
|
|
38
|
-
const registeredProcessors = [];
|
|
39
|
-
/** Module-level flag that disables span dispatch globally. */
|
|
40
|
-
let tracingGlobalDisabled = false;
|
|
41
|
-
/**
|
|
42
|
-
* Register a CLEO trace processor. Mirrors `addTraceProcessor` from the
|
|
43
|
-
* legacy `@openai/agents` surface so existing consumers continue to work.
|
|
44
|
-
*
|
|
45
|
-
* @param processor - Processor to register.
|
|
46
|
-
*/
|
|
47
|
-
export function registerTraceProcessor(processor) {
|
|
48
|
-
registeredProcessors.push(processor);
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Remove a previously registered trace processor.
|
|
52
|
-
*
|
|
53
|
-
* @param processor - Processor to remove.
|
|
54
|
-
*/
|
|
55
|
-
export function unregisterTraceProcessor(processor) {
|
|
56
|
-
const idx = registeredProcessors.indexOf(processor);
|
|
57
|
-
if (idx >= 0) {
|
|
58
|
-
registeredProcessors.splice(idx, 1);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Enable or disable global tracing. Equivalent to `setTracingDisabled` from
|
|
63
|
-
* the legacy `@openai/agents` surface.
|
|
64
|
-
*
|
|
65
|
-
* @param disabled - When true, no spans are emitted.
|
|
66
|
-
*/
|
|
67
|
-
export function setTracingDisabled(disabled) {
|
|
68
|
-
tracingGlobalDisabled = disabled;
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Dispatch a span to every registered trace processor, subject to the global
|
|
72
|
-
* `tracingGlobalDisabled` flag.
|
|
73
|
-
*
|
|
74
|
-
* @param span - Span event to dispatch.
|
|
75
|
-
*/
|
|
76
|
-
async function emitSpan(span) {
|
|
77
|
-
if (tracingGlobalDisabled)
|
|
78
|
-
return;
|
|
79
|
-
for (const processor of registeredProcessors) {
|
|
80
|
-
try {
|
|
81
|
-
await processor.onSpanEnd(span);
|
|
82
|
-
}
|
|
83
|
-
catch {
|
|
84
|
-
// Tracing failures must never break a run.
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
// ---------------------------------------------------------------------------
|
|
89
|
-
// Provider
|
|
90
|
-
// ---------------------------------------------------------------------------
|
|
91
|
-
/**
|
|
92
|
-
* Spawn provider for the Vercel AI SDK (OpenAI flavour).
|
|
93
|
-
*
|
|
94
|
-
* Spawns SDK-backed agent runs for a given `SpawnContext`. The run is awaited
|
|
95
|
-
* synchronously and the result mapped to a `SpawnResult` with
|
|
96
|
-
* `status: 'completed'` or `status: 'failed'`. In-flight runs are tracked by
|
|
97
|
-
* instance ID so `listRunning()` and `terminate()` work correctly.
|
|
98
|
-
*
|
|
99
|
-
* @remarks
|
|
100
|
-
* Handoff topology is resolved by this provider, not the SDK. When the entry
|
|
101
|
-
* agent is a lead with workers, the provider:
|
|
102
|
-
*
|
|
103
|
-
* 1. Runs the lead agent's `generateText` with the enriched prompt.
|
|
104
|
-
* 2. For each worker listed in handoffs, runs a sequential `generateText`
|
|
105
|
-
* using the worker's archetype model, passing the lead's output as the
|
|
106
|
-
* worker prompt. Results are concatenated.
|
|
107
|
-
*
|
|
108
|
-
* This preserves the visible behaviour of the legacy `@openai/agents` runner
|
|
109
|
-
* while keeping CLEO as the orchestration owner.
|
|
110
|
-
*
|
|
111
|
-
* @example
|
|
112
|
-
* ```typescript
|
|
113
|
-
* const provider = new OpenAiSdkSpawnProvider();
|
|
114
|
-
* const result = await provider.spawn({
|
|
115
|
-
* taskId: 'T582',
|
|
116
|
-
* prompt: 'Implement feature X',
|
|
117
|
-
* options: { tier: 'lead', handoffs: ['worker-read', 'worker-write'] },
|
|
118
|
-
* });
|
|
119
|
-
* console.log(result.status); // 'completed'
|
|
120
|
-
* ```
|
|
121
|
-
*/
|
|
122
|
-
export class OpenAiSdkSpawnProvider {
|
|
123
|
-
/** Currently running instance IDs (completed runs are removed). */
|
|
124
|
-
runningInstances = new Set();
|
|
125
|
-
/**
|
|
126
|
-
* Check whether the OpenAI SDK can spawn in the current environment.
|
|
127
|
-
*
|
|
128
|
-
* Requires `OPENAI_API_KEY` to be set. Does not make a network call.
|
|
129
|
-
*
|
|
130
|
-
* @returns `true` when `OPENAI_API_KEY` is present in the environment.
|
|
131
|
-
*/
|
|
132
|
-
async canSpawn() {
|
|
133
|
-
return typeof process.env.OPENAI_API_KEY === 'string' && process.env.OPENAI_API_KEY.length > 0;
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Spawn a subagent via the Vercel AI SDK.
|
|
137
|
-
*
|
|
138
|
-
* Awaits the run to completion and returns a fully-resolved `SpawnResult`.
|
|
139
|
-
*
|
|
140
|
-
* @param context - Spawn context with task ID, prompt, and options.
|
|
141
|
-
* @returns Resolved spawn result with `status: 'completed'` or `'failed'`.
|
|
142
|
-
*/
|
|
143
|
-
async spawn(context) {
|
|
144
|
-
const instanceId = `openai-sdk-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
|
|
145
|
-
const startTime = new Date().toISOString();
|
|
146
|
-
this.runningInstances.add(instanceId);
|
|
147
|
-
try {
|
|
148
|
-
const opts = this.parseOptions(context.options);
|
|
149
|
-
// Enrich prompt with CANT bundle (best-effort, same pattern as Claude Code provider).
|
|
150
|
-
let finalPrompt = context.prompt;
|
|
151
|
-
try {
|
|
152
|
-
const { buildCantEnrichedPrompt } = await import('../../cant-context.js');
|
|
153
|
-
finalPrompt = await buildCantEnrichedPrompt({
|
|
154
|
-
projectDir: context.workingDirectory ?? process.cwd(),
|
|
155
|
-
basePrompt: context.prompt,
|
|
156
|
-
agentName: opts.agentName,
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
catch {
|
|
160
|
-
// CANT enrichment unavailable — use raw prompt.
|
|
161
|
-
}
|
|
162
|
-
// Build guardrails from ACL options.
|
|
163
|
-
const guardrails = buildDefaultGuardrails(opts.allowedGlobs ?? [], opts.allowedTools ?? []);
|
|
164
|
-
// Derive model from tier when not explicitly set.
|
|
165
|
-
const model = opts.model ?? this.modelForTier(opts.tier ?? 'worker');
|
|
166
|
-
// Build agent topology (lead + workers, or standalone worker).
|
|
167
|
-
const agent = buildAgentTopology({
|
|
168
|
-
instructions: finalPrompt,
|
|
169
|
-
model,
|
|
170
|
-
tier: opts.tier ?? 'worker',
|
|
171
|
-
handoffNames: opts.handoffs ?? [],
|
|
172
|
-
guardrails,
|
|
173
|
-
});
|
|
174
|
-
// Register trace processor globally (default-on).
|
|
175
|
-
let traceProcessor;
|
|
176
|
-
const previousTracingDisabled = tracingGlobalDisabled;
|
|
177
|
-
if (!opts.tracingDisabled) {
|
|
178
|
-
traceProcessor = new CleoConduitTraceProcessor(context.taskId);
|
|
179
|
-
registerTraceProcessor(traceProcessor);
|
|
180
|
-
setTracingDisabled(false);
|
|
181
|
-
}
|
|
182
|
-
else {
|
|
183
|
-
setTracingDisabled(true);
|
|
184
|
-
}
|
|
185
|
-
try {
|
|
186
|
-
// Evaluate guardrails before any model call. A tripped guardrail
|
|
187
|
-
// aborts the run with a structured failure.
|
|
188
|
-
const guardResult = await evaluateGuardrails(agent.inputGuardrails ?? [], finalPrompt);
|
|
189
|
-
if (guardResult.tripwireTriggered) {
|
|
190
|
-
this.runningInstances.delete(instanceId);
|
|
191
|
-
return mapSdkRunOutcome(instanceId, context.taskId, 'openai-sdk', startTime, {
|
|
192
|
-
finalOutput: '',
|
|
193
|
-
succeeded: false,
|
|
194
|
-
errorMessage: `guardrail tripped: ${JSON.stringify(guardResult.outputInfo)}`,
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
// Run the lead/worker topology.
|
|
198
|
-
const runOutput = await runAgentTopology(agent, finalPrompt, emitSpan);
|
|
199
|
-
this.runningInstances.delete(instanceId);
|
|
200
|
-
return mapSdkRunOutcome(instanceId, context.taskId, 'openai-sdk', startTime, {
|
|
201
|
-
finalOutput: runOutput,
|
|
202
|
-
succeeded: true,
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
finally {
|
|
206
|
-
// Restore previous tracing state and unregister this run's processor.
|
|
207
|
-
if (traceProcessor) {
|
|
208
|
-
unregisterTraceProcessor(traceProcessor);
|
|
209
|
-
}
|
|
210
|
-
setTracingDisabled(previousTracingDisabled);
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
catch (error) {
|
|
214
|
-
this.runningInstances.delete(instanceId);
|
|
215
|
-
return mapSdkRunOutcome(instanceId, context.taskId, 'openai-sdk', startTime, {
|
|
216
|
-
finalOutput: '',
|
|
217
|
-
succeeded: false,
|
|
218
|
-
errorMessage: getErrorMessage(error),
|
|
219
|
-
});
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
/**
|
|
223
|
-
* List currently running OpenAI SDK agent instances.
|
|
224
|
-
*
|
|
225
|
-
* @returns Array of in-progress spawn results.
|
|
226
|
-
*/
|
|
227
|
-
async listRunning() {
|
|
228
|
-
return [...this.runningInstances].map((instanceId) => ({
|
|
229
|
-
instanceId,
|
|
230
|
-
taskId: 'unknown',
|
|
231
|
-
providerId: 'openai-sdk',
|
|
232
|
-
status: 'running',
|
|
233
|
-
startTime: new Date().toISOString(),
|
|
234
|
-
}));
|
|
235
|
-
}
|
|
236
|
-
/**
|
|
237
|
-
* Terminate a running spawn by instance ID.
|
|
238
|
-
*
|
|
239
|
-
* The Vercel AI SDK does not support external termination of in-flight
|
|
240
|
-
* requests; this method removes the instance from the tracking set so it
|
|
241
|
-
* will no longer appear in `listRunning()`.
|
|
242
|
-
*
|
|
243
|
-
* @param instanceId - ID of the spawn instance to terminate.
|
|
244
|
-
*/
|
|
245
|
-
async terminate(instanceId) {
|
|
246
|
-
this.runningInstances.delete(instanceId);
|
|
247
|
-
}
|
|
248
|
-
// ---------------------------------------------------------------------------
|
|
249
|
-
// Private helpers
|
|
250
|
-
// ---------------------------------------------------------------------------
|
|
251
|
-
/**
|
|
252
|
-
* Parse and validate `SpawnContext.options` into typed `OpenAiSdkSpawnOptions`.
|
|
253
|
-
*
|
|
254
|
-
* Unknown fields are silently ignored.
|
|
255
|
-
*/
|
|
256
|
-
parseOptions(raw) {
|
|
257
|
-
if (!raw)
|
|
258
|
-
return {};
|
|
259
|
-
const opts = {};
|
|
260
|
-
if (typeof raw.model === 'string')
|
|
261
|
-
opts.model = raw.model;
|
|
262
|
-
if (raw.tier === 'lead' || raw.tier === 'worker' || raw.tier === 'orchestrator') {
|
|
263
|
-
opts.tier = raw.tier;
|
|
264
|
-
}
|
|
265
|
-
if (Array.isArray(raw.handoffs) && raw.handoffs.every((h) => typeof h === 'string')) {
|
|
266
|
-
opts.handoffs = raw.handoffs;
|
|
267
|
-
}
|
|
268
|
-
if (Array.isArray(raw.allowedGlobs) && raw.allowedGlobs.every((g) => typeof g === 'string')) {
|
|
269
|
-
opts.allowedGlobs = raw.allowedGlobs;
|
|
270
|
-
}
|
|
271
|
-
if (Array.isArray(raw.allowedTools) && raw.allowedTools.every((t) => typeof t === 'string')) {
|
|
272
|
-
opts.allowedTools = raw.allowedTools;
|
|
273
|
-
}
|
|
274
|
-
if (typeof raw.tracingDisabled === 'boolean')
|
|
275
|
-
opts.tracingDisabled = raw.tracingDisabled;
|
|
276
|
-
if (typeof raw.agentName === 'string')
|
|
277
|
-
opts.agentName = raw.agentName;
|
|
278
|
-
return opts;
|
|
279
|
-
}
|
|
280
|
-
/**
|
|
281
|
-
* Derive the default model for a given tier.
|
|
282
|
-
*
|
|
283
|
-
* @param tier - Agent tier.
|
|
284
|
-
* @returns Model identifier string.
|
|
285
|
-
*/
|
|
286
|
-
modelForTier(tier) {
|
|
287
|
-
return tier === 'worker' ? MODEL_WORKER : MODEL_LEAD;
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
// ---------------------------------------------------------------------------
|
|
291
|
-
// Topology runner
|
|
292
|
-
// ---------------------------------------------------------------------------
|
|
293
|
-
/**
|
|
294
|
-
* Execute a CLEO agent topology against the Vercel AI SDK.
|
|
295
|
-
*
|
|
296
|
-
* Runs the entry agent via `generateText`. When the entry agent declares
|
|
297
|
-
* handoffs, each worker is executed sequentially with the lead's output as
|
|
298
|
-
* input and the concatenated result returned.
|
|
299
|
-
*
|
|
300
|
-
* @param agent - Entry agent descriptor.
|
|
301
|
-
* @param userPrompt - Enriched user prompt.
|
|
302
|
-
* @param emit - Span emitter invoked after every agent run.
|
|
303
|
-
* @returns Concatenated assistant output.
|
|
304
|
-
*/
|
|
305
|
-
async function runAgentTopology(agent, userPrompt, emit) {
|
|
306
|
-
const { createOpenAI } = await import('@ai-sdk/openai');
|
|
307
|
-
const { generateText } = await import('ai');
|
|
308
|
-
const apiKey = process.env.OPENAI_API_KEY;
|
|
309
|
-
if (!apiKey) {
|
|
310
|
-
throw new Error('OPENAI_API_KEY is not set — OpenAI SDK provider cannot run');
|
|
311
|
-
}
|
|
312
|
-
const openai = createOpenAI({ apiKey });
|
|
313
|
-
// Run the entry agent.
|
|
314
|
-
const startedAt = new Date().toISOString();
|
|
315
|
-
const leadResult = await generateText({
|
|
316
|
-
model: openai(agent.model),
|
|
317
|
-
system: agent.instructions,
|
|
318
|
-
prompt: userPrompt,
|
|
319
|
-
});
|
|
320
|
-
const leadText = (leadResult.text ?? '').trim();
|
|
321
|
-
const leadEnd = new Date().toISOString();
|
|
322
|
-
await emit({
|
|
323
|
-
spanId: `${agent.name}-${Date.now()}`,
|
|
324
|
-
startedAt,
|
|
325
|
-
endedAt: leadEnd,
|
|
326
|
-
spanData: { type: 'agent', name: agent.name },
|
|
327
|
-
});
|
|
328
|
-
// When there are no handoffs, return the lead output directly.
|
|
329
|
-
const workers = agent.handoffs ?? [];
|
|
330
|
-
if (workers.length === 0) {
|
|
331
|
-
return leadText;
|
|
332
|
-
}
|
|
333
|
-
// Sequential handoff execution. Each worker receives the lead output as
|
|
334
|
-
// input, and the concatenated worker outputs become the final run output.
|
|
335
|
-
const workerOutputs = [];
|
|
336
|
-
for (const worker of workers) {
|
|
337
|
-
const handoffStart = new Date().toISOString();
|
|
338
|
-
await emit({
|
|
339
|
-
spanId: `handoff-${agent.name}-${worker.name}-${Date.now()}`,
|
|
340
|
-
startedAt: handoffStart,
|
|
341
|
-
endedAt: handoffStart,
|
|
342
|
-
spanData: { type: 'handoff', from_agent: agent.name, to_agent: worker.name },
|
|
343
|
-
});
|
|
344
|
-
const workerStart = new Date().toISOString();
|
|
345
|
-
const workerResult = await generateText({
|
|
346
|
-
model: openai(worker.model),
|
|
347
|
-
system: worker.instructions,
|
|
348
|
-
prompt: leadText,
|
|
349
|
-
});
|
|
350
|
-
const workerEnd = new Date().toISOString();
|
|
351
|
-
await emit({
|
|
352
|
-
spanId: `${worker.name}-${Date.now()}`,
|
|
353
|
-
startedAt: workerStart,
|
|
354
|
-
endedAt: workerEnd,
|
|
355
|
-
spanData: { type: 'agent', name: worker.name },
|
|
356
|
-
});
|
|
357
|
-
workerOutputs.push(`[${worker.name}] ${(workerResult.text ?? '').trim()}`);
|
|
358
|
-
}
|
|
359
|
-
return [leadText, ...workerOutputs].join('\n\n');
|
|
360
|
-
}
|
|
361
|
-
//# sourceMappingURL=spawn.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../../src/providers/openai-sdk/spawn.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CLEO trace processor that writes spans to conduit.db.
|
|
3
|
-
*
|
|
4
|
-
* `CleoConduitTraceProcessor` implements a CLEO-native tracing processor
|
|
5
|
-
* interface that records spans emitted by the OpenAI SDK adapter. Post T933
|
|
6
|
-
* (ADR-052 — Vercel AI SDK consolidation) the processor no longer implements
|
|
7
|
-
* `@openai/agents` type surfaces; instead it consumes `CleoSpan` events
|
|
8
|
-
* produced by `OpenAiSdkSpawnProvider` during a run.
|
|
9
|
-
*
|
|
10
|
-
* Tracing is on by default for all OpenAI SDK spawns. Set
|
|
11
|
-
* `options.tracingDisabled = true` in `SpawnContext.options` to opt out when
|
|
12
|
-
* conduit is unavailable.
|
|
13
|
-
*
|
|
14
|
-
* @task T582 (original)
|
|
15
|
-
* @task T933 (SDK consolidation — provider-neutral rewrite)
|
|
16
|
-
*/
|
|
17
|
-
import { writeSpanBatchToConduit } from '../shared/conduit-trace-writer.js';
|
|
18
|
-
// ---------------------------------------------------------------------------
|
|
19
|
-
// Processor
|
|
20
|
-
// ---------------------------------------------------------------------------
|
|
21
|
-
/**
|
|
22
|
-
* CLEO trace processor that persists OpenAI SDK adapter spans to conduit.db.
|
|
23
|
-
*
|
|
24
|
-
* Each `onSpanEnd` call extracts span metadata and enqueues a write to conduit
|
|
25
|
-
* via the shared `conduit-trace-writer` module. Writes are fire-and-forget —
|
|
26
|
-
* failures are logged but never propagated to the caller.
|
|
27
|
-
*
|
|
28
|
-
* @remarks
|
|
29
|
-
* `onTraceEnd` performs a batch flush of any buffered spans. Individual
|
|
30
|
-
* `onSpanEnd` calls also write immediately so spans are not lost if the run
|
|
31
|
-
* is interrupted.
|
|
32
|
-
*
|
|
33
|
-
* @example
|
|
34
|
-
* ```typescript
|
|
35
|
-
* import { registerTraceProcessor } from './spawn.js';
|
|
36
|
-
* import { CleoConduitTraceProcessor } from './tracing.js';
|
|
37
|
-
*
|
|
38
|
-
* const processor = new CleoConduitTraceProcessor('T582');
|
|
39
|
-
* registerTraceProcessor(processor);
|
|
40
|
-
* ```
|
|
41
|
-
*/
|
|
42
|
-
export class CleoConduitTraceProcessor {
|
|
43
|
-
/** CLEO task ID included in every span event for correlation. */
|
|
44
|
-
taskId;
|
|
45
|
-
/** Pending span events buffered within the current trace. */
|
|
46
|
-
pendingEvents = [];
|
|
47
|
-
/**
|
|
48
|
-
* @param taskId - CLEO task ID to attach to every written span.
|
|
49
|
-
*/
|
|
50
|
-
constructor(taskId) {
|
|
51
|
-
this.taskId = taskId;
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Called when a new trace starts. Resets the pending event buffer.
|
|
55
|
-
*
|
|
56
|
-
* @param _trace - The trace that just started (unused).
|
|
57
|
-
*/
|
|
58
|
-
async onTraceStart(_trace) {
|
|
59
|
-
this.pendingEvents = [];
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Called when a trace ends. Flushes all pending span events to conduit.
|
|
63
|
-
*
|
|
64
|
-
* @param _trace - The trace that just ended (unused — spans were captured via `onSpanEnd`).
|
|
65
|
-
*/
|
|
66
|
-
async onTraceEnd(_trace) {
|
|
67
|
-
if (this.pendingEvents.length > 0) {
|
|
68
|
-
await writeSpanBatchToConduit(this.pendingEvents);
|
|
69
|
-
this.pendingEvents = [];
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Called when a new span starts. No-op — we capture on end to have full timing.
|
|
74
|
-
*
|
|
75
|
-
* @param _span - The span that just started (unused).
|
|
76
|
-
*/
|
|
77
|
-
async onSpanStart(_span) {
|
|
78
|
-
// Capture on end so startedAt / endedAt are both populated.
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Called when a span ends. Serialises and writes the span to conduit.
|
|
82
|
-
*
|
|
83
|
-
* @param span - The completed span from the adapter.
|
|
84
|
-
*/
|
|
85
|
-
async onSpanEnd(span) {
|
|
86
|
-
const event = this.extractSpanEvent(span);
|
|
87
|
-
if (event) {
|
|
88
|
-
this.pendingEvents.push(event);
|
|
89
|
-
// Also write immediately to survive partial run interruptions.
|
|
90
|
-
await writeSpanBatchToConduit([event]);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Called during graceful shutdown. Flushes any remaining pending events.
|
|
95
|
-
*
|
|
96
|
-
* @param _timeout - Shutdown timeout in milliseconds (unused).
|
|
97
|
-
*/
|
|
98
|
-
async shutdown(_timeout) {
|
|
99
|
-
if (this.pendingEvents.length > 0) {
|
|
100
|
-
await writeSpanBatchToConduit(this.pendingEvents);
|
|
101
|
-
this.pendingEvents = [];
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Force-flush all pending span events to conduit immediately.
|
|
106
|
-
*/
|
|
107
|
-
async forceFlush() {
|
|
108
|
-
if (this.pendingEvents.length > 0) {
|
|
109
|
-
await writeSpanBatchToConduit(this.pendingEvents);
|
|
110
|
-
this.pendingEvents = [];
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
// ---------------------------------------------------------------------------
|
|
114
|
-
// Private helpers
|
|
115
|
-
// ---------------------------------------------------------------------------
|
|
116
|
-
/**
|
|
117
|
-
* Extract a {@link ConduitSpanEvent} from an adapter span, or `null` if the
|
|
118
|
-
* span cannot be meaningfully serialised.
|
|
119
|
-
*
|
|
120
|
-
* @param span - The adapter span to serialise.
|
|
121
|
-
* @returns A conduit span event or `null`.
|
|
122
|
-
*/
|
|
123
|
-
extractSpanEvent(span) {
|
|
124
|
-
const spanId = span.spanId ?? `span-${Date.now()}-${Math.random().toString(36).substring(2, 7)}`;
|
|
125
|
-
// Guard against malformed/empty spans (e.g. in unit tests with minimal mocks).
|
|
126
|
-
if (!span.spanData)
|
|
127
|
-
return null;
|
|
128
|
-
const data = span.spanData;
|
|
129
|
-
const spanType = data.type;
|
|
130
|
-
// Extract agent name from span data shape based on type.
|
|
131
|
-
let agentName = 'unknown';
|
|
132
|
-
let handoffTarget;
|
|
133
|
-
if (data.type === 'agent') {
|
|
134
|
-
agentName = data.name;
|
|
135
|
-
}
|
|
136
|
-
else if (data.type === 'handoff') {
|
|
137
|
-
agentName = data.from_agent ?? 'unknown';
|
|
138
|
-
handoffTarget = data.to_agent ?? undefined;
|
|
139
|
-
}
|
|
140
|
-
else if (data.type === 'function') {
|
|
141
|
-
agentName = data.name;
|
|
142
|
-
}
|
|
143
|
-
const startTime = span.startedAt ?? new Date().toISOString();
|
|
144
|
-
const endTime = span.endedAt ?? new Date().toISOString();
|
|
145
|
-
return {
|
|
146
|
-
spanId,
|
|
147
|
-
taskId: this.taskId,
|
|
148
|
-
agentName,
|
|
149
|
-
spanType,
|
|
150
|
-
startTime,
|
|
151
|
-
endTime,
|
|
152
|
-
handoffTarget,
|
|
153
|
-
metadata: {
|
|
154
|
-
rawSpanData: data,
|
|
155
|
-
},
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
//# sourceMappingURL=tracing.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tracing.js","sourceRoot":"","sources":["../../../src/providers/openai-sdk/tracing.ts"],"names":[],"mappings":"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"}
|