* Convert a legacy `(args, TrainingContext)` handler into the framework's * `(params, HandlerContext) => Promise ` signature. * * - Enforces `VERSION_UNSUPPORTED` for `adcp_major_version !== 3` (legacy * dispatch behavior, not yet in the framework). * - Strips `context` from p
(toolName: string, handler: LegacyHandler)
| 227 | * task type. Matches legacy dispatch behavior in `task-handlers.ts`. |
| 228 | */ |
| 229 | function adapt(toolName: string, handler: LegacyHandler) { |
| 230 | return async (params: unknown, ctx: HandlerContext): Promise<AdaptedResponse> => { |
| 231 | const rawParams = (params as Record<string, unknown> | undefined) ?? {}; |
| 232 | const { context: callerContext, ...handlerArgs } = rawParams; |
| 233 | |
| 234 | const requestedVersion = (handlerArgs as { adcp_major_version?: unknown }).adcp_major_version; |
| 235 | if ( |
| 236 | requestedVersion !== undefined |
| 237 | && !(SUPPORTED_MAJOR_VERSIONS as readonly number[]).includes(requestedVersion as number) |
| 238 | ) { |
| 239 | return versionUnsupported(requestedVersion, callerContext); |
| 240 | } |
| 241 | |
| 242 | const trainingCtx: TrainingContext = { |
| 243 | mode: 'open', |
| 244 | principal: ctx.authInfo?.clientId ?? 'anonymous', |
| 245 | }; |
| 246 | |
| 247 | return runWithSessionContext(async () => { |
| 248 | let result: unknown; |
| 249 | try { |
| 250 | result = await Promise.resolve(handler(handlerArgs as ToolArgs, trainingCtx)); |
| 251 | } catch (err) { |
| 252 | logger.error({ err }, 'framework handler threw'); |
| 253 | return serviceUnavailable(err, callerContext); |
| 254 | } |
| 255 | try { |
| 256 | await flushDirtySessions(); |
| 257 | } catch (err) { |
| 258 | logger.error({ err }, 'framework flushDirtySessions threw'); |
| 259 | return serviceUnavailable(err, callerContext); |
| 260 | } |
| 261 | const response = toAdaptedResponse(result, callerContext); |
| 262 | if (!response.isError) { |
| 263 | const idk = (handlerArgs as { idempotency_key?: unknown }).idempotency_key; |
| 264 | maybeEmitCompletionWebhook({ |
| 265 | toolName, |
| 266 | args: handlerArgs as Record<string, unknown>, |
| 267 | response: (result ?? {}) as Record<string, unknown>, |
| 268 | requestIdempotencyKey: typeof idk === 'string' ? idk : undefined, |
| 269 | principal: scopedWebhookPrincipal(ctx, handlerArgs as Record<string, unknown>), |
| 270 | }); |
| 271 | } |
| 272 | return response; |
| 273 | }); |
| 274 | }; |
| 275 | } |
| 276 | |
| 277 | // ── Resolver hooks ─────────────────────────────────────────────── |
| 278 |
no test coverage detected