{"version":3,"file":"ai-model/shared/model-locate-result/factory.mjs","sources":["../../../../../src/ai-model/shared/model-locate-result/factory.ts"],"sourcesContent":["import { createLocateResultPromptSpec } from '../../prompts/locate-result-coordinates';\nimport { finalizePixelBbox, finalizeSectionLocatePixelBboxGroup } from './bbox';\nimport { parseNumericLocateResult } from './parse';\nimport { mapLocateResultToPixelBboxByCoordinates } from './pixel-bbox-mapper';\nimport type {\n  LocateResultAdapter,\n  LocateResultAdapterDefinition,\n  LocateResultContext,\n  LocateResultCoordinates,\n  LocateResultValue,\n  PixelBbox,\n  ResolvedLocateResultCoordinates,\n  SectionLocatePixelBboxGroup,\n  StandardLocateResultAdapterDefinition,\n} from './types';\n\ntype RawLocateValuePurpose = 'primary' | 'references';\n\nconst rawLocateValueFields = {\n  primary: {\n    bbox: ['bbox', 'bbox_2d'],\n    point: ['point'],\n  },\n  references: {\n    bbox: ['references_bbox', 'references_bbox_2d'],\n    point: ['references_point'],\n  },\n} as const;\n\nexport function resolveLocateResultCoordinates(\n  coordinates: LocateResultCoordinates,\n): ResolvedLocateResultCoordinates {\n  const order = coordinates.order ?? 'xy';\n  if (coordinates.normalizedBy !== undefined && coordinates.normalizedBy <= 0) {\n    throw new Error(\n      `locate result coordinates normalizedBy must be positive: ${coordinates.normalizedBy}`,\n    );\n  }\n  return {\n    shape: coordinates.shape,\n    order,\n    normalizedBy: coordinates.normalizedBy,\n  };\n}\n\nfunction extractFirstObjectField(\n  input: unknown,\n  fields: readonly string[],\n): unknown | undefined {\n  if (!input || typeof input !== 'object') {\n    return undefined;\n  }\n\n  const record = input as Record<string, unknown>;\n  const matchedField = fields.find((field) => record[field] !== undefined);\n  return matchedField ? record[matchedField] : undefined;\n}\n\nfunction normalizeReferenceResults(input: unknown): unknown[] {\n  if (input === undefined || input === null) {\n    return [];\n  }\n  return Array.isArray(input) ? input : [input];\n}\n\nfunction assertValidParsedLocateResult(result: LocateResultValue): void {\n  if (!result || typeof result !== 'object') {\n    throw new Error(\n      `invalid parsed locate result: expected object, got ${JSON.stringify(\n        result,\n      )}`,\n    );\n  }\n\n  const expectedLength =\n    result.type === 'bbox' ? 4 : result.type === 'point' ? 2 : 0;\n  if (!expectedLength) {\n    throw new Error(\n      `invalid parsed locate result: unsupported type ${JSON.stringify(\n        (result as { type?: unknown }).type,\n      )}`,\n    );\n  }\n\n  const coordinates = result.coordinates;\n  if (\n    !Array.isArray(coordinates) ||\n    coordinates.length !== expectedLength ||\n    !coordinates.every(\n      (value) => typeof value === 'number' && Number.isFinite(value),\n    )\n  ) {\n    throw new Error(\n      `invalid parsed locate result: ${result.type} coordinates must be ${expectedLength} finite numbers, got ${JSON.stringify(\n        coordinates,\n      )}`,\n    );\n  }\n}\n\nfunction pickRawLocateValue(\n  input: unknown,\n  resolvedCoordinates: ResolvedLocateResultCoordinates,\n  purpose: RawLocateValuePurpose,\n): unknown | undefined {\n  const fields = rawLocateValueFields[purpose][resolvedCoordinates.shape];\n  return extractFirstObjectField(input, fields);\n}\n\nfunction extractPrimaryRawLocateValue(\n  input: unknown,\n  resolvedCoordinates: ResolvedLocateResultCoordinates,\n): unknown {\n  const pickedRawResult = pickRawLocateValue(\n    input,\n    resolvedCoordinates,\n    'primary',\n  );\n  if (\n    pickedRawResult === undefined &&\n    input !== null &&\n    typeof input === 'object' &&\n    !Array.isArray(input)\n  ) {\n    throw new Error(\n      'locate response does not contain a recognizable locate result field',\n    );\n  }\n\n  return pickedRawResult === undefined ? input : pickedRawResult;\n}\n\nfunction extractReferenceRawLocateValues(\n  input: unknown,\n  resolvedCoordinates: ResolvedLocateResultCoordinates,\n): unknown[] {\n  return normalizeReferenceResults(\n    pickRawLocateValue(input, resolvedCoordinates, 'references'),\n  );\n}\n\nfunction createStandardLocateResultAdapterImplementation(\n  config: StandardLocateResultAdapterDefinition,\n): LocateResultAdapter {\n  const resolvedCoordinates = resolveLocateResultCoordinates(\n    config.coordinates,\n  );\n  const parseRawLocateValue =\n    config.parseRawLocateValue ??\n    ((input) => parseNumericLocateResult(resolvedCoordinates, input));\n  const mapLocateResultToPixelBbox =\n    config.mapLocateResultToPixelBbox ??\n    ((result, ctx) =>\n      mapLocateResultToPixelBboxByCoordinates(\n        result,\n        ctx,\n        resolvedCoordinates,\n      ));\n\n  const mapRawLocateValueToPixelBbox = (\n    rawResult: unknown,\n    ctx: LocateResultContext,\n  ) => {\n    const parsedResult = parseRawLocateValue(rawResult);\n    assertValidParsedLocateResult(parsedResult);\n    return mapLocateResultToPixelBbox(parsedResult, ctx);\n  };\n  // Keep error semantics out of the adapter: callers may preserve, ignore, or\n  // fail fast on `error` / `errors`, while this layer only extracts coordinates.\n  const adaptRawLocateInputToPixelBbox = (\n    input: unknown,\n    ctx: LocateResultContext,\n  ): PixelBbox =>\n    mapRawLocateValueToPixelBbox(\n      extractPrimaryRawLocateValue(input, resolvedCoordinates),\n      ctx,\n    );\n  const adaptElementLocateResultToPixelBbox = (\n    input: unknown,\n    ctx: LocateResultContext,\n  ): PixelBbox => adaptRawLocateInputToPixelBbox(input, ctx);\n  const adaptPlanningParamToPixelBbox = (\n    input: unknown,\n    ctx: LocateResultContext,\n  ): PixelBbox => adaptRawLocateInputToPixelBbox(input, ctx);\n  const adaptSectionLocateResultToPixelBboxGroup = (\n    input: unknown,\n    ctx: LocateResultContext,\n  ): SectionLocatePixelBboxGroup => {\n    const target = adaptRawLocateInputToPixelBbox(input, ctx);\n    const references = extractReferenceRawLocateValues(\n      input,\n      resolvedCoordinates,\n    ).map((raw) => mapRawLocateValueToPixelBbox(raw, ctx));\n    return {\n      target,\n      ...(references.length > 0 ? { references } : {}),\n    };\n  };\n  return {\n    promptSpec: createLocateResultPromptSpec(resolvedCoordinates),\n    adaptElementLocateResultToPixelBbox,\n    adaptSectionLocateResultToPixelBboxGroup,\n    adaptPlanningParamToPixelBbox,\n  };\n}\n\nexport function createLocateResultAdapter(\n  config: LocateResultAdapterDefinition,\n): LocateResultAdapter {\n  const adapter: LocateResultAdapter =\n    config.kind === 'custom'\n      ? config\n      : createStandardLocateResultAdapterImplementation(config);\n\n  return {\n    promptSpec: adapter.promptSpec,\n    adaptElementLocateResultToPixelBbox: (\n      input: unknown,\n      ctx: LocateResultContext,\n    ) =>\n      finalizePixelBbox(\n        adapter.adaptElementLocateResultToPixelBbox(input, ctx),\n        input,\n        ctx,\n      ),\n    adaptSectionLocateResultToPixelBboxGroup: (\n      input: unknown,\n      ctx: LocateResultContext,\n    ) =>\n      finalizeSectionLocatePixelBboxGroup(\n        adapter.adaptSectionLocateResultToPixelBboxGroup(input, ctx),\n        input,\n        ctx,\n      ),\n    adaptPlanningParamToPixelBbox: (input: unknown, ctx: LocateResultContext) =>\n      finalizePixelBbox(\n        adapter.adaptPlanningParamToPixelBbox(input, ctx),\n        input,\n        ctx,\n      ),\n  };\n}\n"],"names":["rawLocateValueFields","resolveLocateResultCoordinates","coordinates","order","undefined","Error","extractFirstObjectField","input","fields","record","matchedField","field","normalizeReferenceResults","Array","assertValidParsedLocateResult","result","JSON","expectedLength","value","Number","pickRawLocateValue","resolvedCoordinates","purpose","extractPrimaryRawLocateValue","pickedRawResult","extractReferenceRawLocateValues","createStandardLocateResultAdapterImplementation","config","parseRawLocateValue","parseNumericLocateResult","mapLocateResultToPixelBbox","ctx","mapLocateResultToPixelBboxByCoordinates","mapRawLocateValueToPixelBbox","rawResult","parsedResult","adaptRawLocateInputToPixelBbox","adaptElementLocateResultToPixelBbox","adaptPlanningParamToPixelBbox","adaptSectionLocateResultToPixelBboxGroup","target","references","raw","createLocateResultPromptSpec","createLocateResultAdapter","adapter","finalizePixelBbox","finalizeSectionLocatePixelBboxGroup"],"mappings":"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"}