( workspaceId: string, service: DevToolsService )
| 239 | } |
| 240 | |
| 241 | export function createDevToolsMiddleware( |
| 242 | workspaceId: string, |
| 243 | service: DevToolsService |
| 244 | ): LanguageModelV3Middleware { |
| 245 | assert(workspaceId.trim().length > 0, "createDevToolsMiddleware requires a workspaceId"); |
| 246 | assert(service, "createDevToolsMiddleware requires a DevToolsService"); |
| 247 | |
| 248 | const runId = randomUUID(); |
| 249 | let runCreated = false; |
| 250 | let runCreationPromise: Promise<void> | null = null; |
| 251 | let stepCounter = 0; |
| 252 | |
| 253 | async function ensureRun(runMetadataId?: string): Promise<void> { |
| 254 | if (runCreated) { |
| 255 | return; |
| 256 | } |
| 257 | |
| 258 | if (runCreationPromise) { |
| 259 | await runCreationPromise; |
| 260 | return; |
| 261 | } |
| 262 | |
| 263 | runCreationPromise = (async () => { |
| 264 | try { |
| 265 | await service.createRun( |
| 266 | workspaceId, |
| 267 | { |
| 268 | id: runId, |
| 269 | workspaceId, |
| 270 | startedAt: new Date().toISOString(), |
| 271 | }, |
| 272 | runMetadataId |
| 273 | ); |
| 274 | runCreated = true; |
| 275 | } catch (error) { |
| 276 | log.warn("DevTools: failed to create run", { |
| 277 | workspaceId, |
| 278 | runId, |
| 279 | error, |
| 280 | }); |
| 281 | } |
| 282 | })(); |
| 283 | |
| 284 | try { |
| 285 | await runCreationPromise; |
| 286 | } finally { |
| 287 | runCreationPromise = null; |
| 288 | } |
| 289 | } |
| 290 | |
| 291 | function extractRunMetadataId(params: LanguageModelV3CallOptions): string | undefined { |
| 292 | const rawMetadataId = params.headers?.[DEVTOOLS_RUN_METADATA_ID_HEADER]; |
| 293 | if (typeof rawMetadataId !== "string") { |
| 294 | return undefined; |
| 295 | } |
| 296 | |
| 297 | const runMetadataId = rawMetadataId.trim(); |
| 298 | return runMetadataId.length > 0 ? runMetadataId : undefined; |
no test coverage detected