import type { PacingRule } from './governor/rate-state-backend'; export interface BuiltinPacingPolicy { readonly provider: string; readonly rules: readonly PacingRule[]; } /** * Shared arbitrary-HTTP egress lane. * * Deepline exposes a first-class `generic_http_request` integration tool, and * play authors also have the more ergonomic `ctx.fetch(...)` primitive. Those * are two user-facing spellings of the same risk: customer-controlled outbound * HTTP to arbitrary public endpoints. * * Do not create a separate `ctx.fetch` provider bucket. Both surfaces must pace * through the existing `generic_http` provider identity so a play cannot bypass * generic HTTP limits by switching syntax. */ export const GENERIC_HTTP_REQUEST_TOOL_ID = 'generic_http_request'; export const GENERIC_HTTP_PROVIDER = 'generic_http'; export const GENERIC_HTTP_PROVIDER_SHARED_RULE_ID = 'generic_http:provider_shared'; export const GENERIC_HTTP_PROVIDER_SHARED_REQUESTS_PER_SECOND = 25; export const CTX_FETCH_EGRESS_TOOL_ID = GENERIC_HTTP_REQUEST_TOOL_ID; export const CTX_FETCH_EGRESS_PROVIDER = GENERIC_HTTP_PROVIDER; export const CTX_FETCH_EGRESS_PACING_RULE = { ruleId: GENERIC_HTTP_PROVIDER_SHARED_RULE_ID, requestsPerWindow: GENERIC_HTTP_PROVIDER_SHARED_REQUESTS_PER_SECOND, windowMs: 1000, maxConcurrency: null, } satisfies PacingRule; export const CTX_FETCH_EGRESS_PACING = { provider: CTX_FETCH_EGRESS_PROVIDER, rules: [CTX_FETCH_EGRESS_PACING_RULE], } satisfies BuiltinPacingPolicy; export function resolveBuiltinPacing( toolId: string, ): { provider: string; rules: PacingRule[] } | null { if (toolId !== CTX_FETCH_EGRESS_TOOL_ID) return null; return { provider: CTX_FETCH_EGRESS_PACING.provider, rules: [...CTX_FETCH_EGRESS_PACING.rules], }; }