@@ -49,6 +49,8 @@ import type { SpecPreviewSummary } from "../sdk/preview";
4949import { type Authentication } from "../sdk/types" ;
5050import { resolveServerUrl } from "../sdk/openapi-utils" ;
5151import { detectedAuthenticationTemplates } from "../sdk/derive-auth" ;
52+ import { parseSpecOverridesText } from "../sdk/spec-overrides" ;
53+ import { SpecOverridesEditor } from "./SpecOverridesEditor" ;
5254
5355const normalizePresetUrl = ( url : string ) : string => {
5456 const trimmed = url . trim ( ) ;
@@ -154,6 +156,7 @@ export default function AddOpenApiIntegration(props: {
154156 const openApiPresets = openApiPlugin ?. presets ;
155157 const initialPreset = openApiPresets ?. find ( ( preset ) => preset . id === props . initialPreset ) ?? null ;
156158 const [ specUrl , setSpecUrl ] = useState ( props . initialUrl ?? "" ) ;
159+ const [ specOverridesText , setSpecOverridesText ] = useState ( "" ) ;
157160 const [ analyzing , setAnalyzing ] = useState ( false ) ;
158161 const [ analyzeError , setAnalyzeError ] = useState < string | null > ( null ) ;
159162
@@ -233,6 +236,10 @@ export default function AddOpenApiIntegration(props: {
233236 : resolvedIntegrationId ) ;
234237 const resolvedDescription =
235238 descriptionDraft ?? ( preview ? Option . getOrElse ( preview . description , ( ) => "" ) : "" ) ;
239+ const parsedSpecOverrides = useMemo (
240+ ( ) => parseSpecOverridesText ( specOverridesText ) ,
241+ [ specOverridesText ] ,
242+ ) ;
236243
237244 // Register EVERY spec-detected auth method, not just a single selected one.
238245 // Keyed off `preview` (stable per analysis) so the memo doesn't re-run on the
@@ -333,6 +340,7 @@ export default function AddOpenApiIntegration(props: {
333340 // args filled (an empty draft, `hcOperation === ""`, imposes no constraint).
334341 const canAdd =
335342 preview !== null &&
343+ parsedSpecOverrides . ok &&
336344 ! slugAlreadyExists &&
337345 ( ! previewHasNoServers || resolvedBaseUrl . length > 0 ) &&
338346 ! ( hcOperation . length > 0 && hcMissingRequired ) ;
@@ -343,8 +351,19 @@ export default function AddOpenApiIntegration(props: {
343351 setAnalyzing ( true ) ;
344352 setAnalyzeError ( null ) ;
345353 setAddError ( null ) ;
354+ if ( ! parsedSpecOverrides . ok ) {
355+ setAnalyzeError ( parsedSpecOverrides . message ) ;
356+ setAnalyzing ( false ) ;
357+ return ;
358+ }
346359 const exit = await doPreview ( {
347- payload : { spec : specUrl , specFormat : initialPreset ?. specFormat } ,
360+ payload : {
361+ spec : specUrl ,
362+ specFormat : initialPreset ?. specFormat ,
363+ ...( parsedSpecOverrides . value . length > 0
364+ ? { specOverrides : parsedSpecOverrides . value }
365+ : { } ) ,
366+ } ,
348367 } ) ;
349368 if ( Exit . isFailure ( exit ) ) {
350369 setAnalyzeError ( errorMessageFromExit ( exit , "Failed to parse spec" ) ) ;
@@ -375,6 +394,9 @@ export default function AddOpenApiIntegration(props: {
375394 specFormat : initialPreset ?. specFormat ,
376395 family : initialPreset ?. family ,
377396 healthCheck : initialPreset ?. healthCheck ,
397+ ...( parsedSpecOverrides . ok && parsedSpecOverrides . value . length > 0
398+ ? { specOverrides : parsedSpecOverrides . value }
399+ : { } ) ,
378400 // Always send the edited method list (even empty) when the user has
379401 // inspected a preview: an explicit [] means "no auth methods", while
380402 // OMITTING the field tells the server to derive defaults from the
@@ -399,6 +421,7 @@ export default function AddOpenApiIntegration(props: {
399421 resolvedDescription ,
400422 resolvedBaseUrl ,
401423 editedAuthenticationTemplate ,
424+ parsedSpecOverrides ,
402425 initialPreset ?. family ,
403426 initialPreset ?. healthCheck ,
404427 initialPreset ?. specFormat ,
@@ -539,6 +562,17 @@ export default function AddOpenApiIntegration(props: {
539562 />
540563 ) : null }
541564
565+ < SpecOverridesEditor
566+ value = { specOverridesText }
567+ onChange = { ( value ) => {
568+ setSpecOverridesText ( value ) ;
569+ setAnalyzeError ( null ) ;
570+ setPreview ( null ) ;
571+ setBaseUrl ( "" ) ;
572+ } }
573+ disabled = { analyzing || adding }
574+ />
575+
542576 { preview && (
543577 < AuthMethodListEditor
544578 list = { authMethodList }
0 commit comments