{"version":3,"file":"ai-model/prompts/locate-result-coordinates.mjs","sources":["../../../../src/ai-model/prompts/locate-result-coordinates.ts"],"sourcesContent":["import type {\n  LocateResultBbox,\n  LocateResultPromptSpec,\n  NonEmptyArray,\n} from '../shared/model-locate-result';\nimport type { ResolvedLocateResultCoordinates } from '../shared/model-locate-result/types';\n\nfunction describeLocateResultCoordinates({\n  shape,\n  order,\n  normalizedBy,\n}: ResolvedLocateResultCoordinates): string {\n  const descriptor = shape === 'point' ? 'point' : '2d bounding box';\n  const coordinateDescription =\n    normalizedBy !== undefined\n      ? `normalized to 0-${normalizedBy} relative to the screenshot. Do NOT use pixel coordinates or screenshot width/height`\n      : 'in actual pixel coordinates relative to the screenshot';\n\n  if (shape === 'point') {\n    const orderDescription = order === 'yx' ? '[y, x]' : '[x, y]';\n    return `${descriptor}, should be ${orderDescription} ${coordinateDescription}.`;\n  }\n\n  const orderDescription =\n    order === 'yx' ? '[ymin, xmin, ymax, xmax]' : '[xmin, ymin, xmax, ymax]';\n  return `${descriptor}, should be ${orderDescription} ${coordinateDescription}.`;\n}\n\nexport function describeLocateResultValueSchema({\n  shape,\n}: ResolvedLocateResultCoordinates): string {\n  return shape === 'point'\n    ? '[number, number]'\n    : '[number, number, number, number]';\n}\n\nexport function locateResultExampleValue(\n  resolvedCoordinates: ResolvedLocateResultCoordinates,\n  region: LocateResultBbox,\n): number[] {\n  const [left, top, right, bottom] = region;\n  if (resolvedCoordinates.shape === 'point') {\n    const x = Math.round((left + right) / 2);\n    const y = Math.round((top + bottom) / 2);\n    return resolvedCoordinates.order === 'yx' ? [y, x] : [x, y];\n  }\n  return resolvedCoordinates.order === 'yx'\n    ? [top, left, bottom, right]\n    : region;\n}\n\n// Internal xy regions used only for prompt examples.\n// Each item is [xmin, ymin, xmax, ymax], before model-specific order mapping.\nexport const locateResultExampleRegions: LocateResultBbox[] = [\n  [100, 100, 200, 200],\n  [345, 442, 458, 483],\n  [120, 180, 380, 210],\n  [120, 240, 380, 270],\n  [50, 100, 200, 200],\n  [300, 400, 500, 500],\n  [600, 100, 800, 250],\n  [50, 600, 250, 750],\n];\n\nfunction createExampleValues(\n  resolvedCoordinates: ResolvedLocateResultCoordinates,\n): NonEmptyArray<unknown> {\n  return locateResultExampleRegions.map((region) =>\n    locateResultExampleValue(resolvedCoordinates, region),\n  ) as NonEmptyArray<unknown>;\n}\n\nfunction locateResultKey({ shape }: ResolvedLocateResultCoordinates): string {\n  return shape === 'point' ? 'point' : 'bbox';\n}\n\nfunction locateResultName(\n  { shape }: ResolvedLocateResultCoordinates,\n  { plural = false }: { plural?: boolean } = {},\n): string {\n  return shape === 'bbox'\n    ? plural\n      ? 'bounding boxes'\n      : 'bounding box'\n    : plural\n      ? 'points'\n      : 'point';\n}\n\nexport function createLocateResultPromptSpec(\n  resolvedCoordinates: ResolvedLocateResultCoordinates,\n): LocateResultPromptSpec {\n  return {\n    resultKey: locateResultKey(resolvedCoordinates),\n    resultValueSchema: describeLocateResultValueSchema(resolvedCoordinates),\n    resultValueDescription:\n      describeLocateResultCoordinates(resolvedCoordinates),\n    resultNoun: locateResultName(resolvedCoordinates),\n    resultNounPlural: locateResultName(resolvedCoordinates, { plural: true }),\n    exampleValues: createExampleValues(resolvedCoordinates),\n  };\n}\n"],"names":["describeLocateResultCoordinates","shape","order","normalizedBy","descriptor","coordinateDescription","undefined","orderDescription","describeLocateResultValueSchema","locateResultExampleValue","resolvedCoordinates","region","left","top","right","bottom","x","Math","y","locateResultExampleRegions","createExampleValues","locateResultKey","locateResultName","plural","createLocateResultPromptSpec"],"mappings":"AAOA,SAASA,gCAAgC,EACvCC,KAAK,EACLC,KAAK,EACLC,YAAY,EACoB;IAChC,MAAMC,aAAaH,AAAU,YAAVA,QAAoB,UAAU;IACjD,MAAMI,wBACJF,AAAiBG,WAAjBH,eACI,CAAC,gBAAgB,EAAEA,aAAa,oFAAoF,CAAC,GACrH;IAEN,IAAIF,AAAU,YAAVA,OAAmB;QACrB,MAAMM,mBAAmBL,AAAU,SAAVA,QAAiB,WAAW;QACrD,OAAO,GAAGE,WAAW,YAAY,EAAEG,iBAAiB,CAAC,EAAEF,sBAAsB,CAAC,CAAC;IACjF;IAEA,MAAME,mBACJL,AAAU,SAAVA,QAAiB,6BAA6B;IAChD,OAAO,GAAGE,WAAW,YAAY,EAAEG,iBAAiB,CAAC,EAAEF,sBAAsB,CAAC,CAAC;AACjF;AAEO,SAASG,gCAAgC,EAC9CP,KAAK,EAC2B;IAChC,OAAOA,AAAU,YAAVA,QACH,qBACA;AACN;AAEO,SAASQ,yBACdC,mBAAoD,EACpDC,MAAwB;IAExB,MAAM,CAACC,MAAMC,KAAKC,OAAOC,OAAO,GAAGJ;IACnC,IAAID,AAA8B,YAA9BA,oBAAoB,KAAK,EAAc;QACzC,MAAMM,IAAIC,KAAK,KAAK,CAAEL,AAAAA,CAAAA,OAAOE,KAAI,IAAK;QACtC,MAAMI,IAAID,KAAK,KAAK,CAAEJ,AAAAA,CAAAA,MAAME,MAAK,IAAK;QACtC,OAAOL,AAA8B,SAA9BA,oBAAoB,KAAK,GAAY;YAACQ;YAAGF;SAAE,GAAG;YAACA;YAAGE;SAAE;IAC7D;IACA,OAAOR,AAA8B,SAA9BA,oBAAoB,KAAK,GAC5B;QAACG;QAAKD;QAAMG;QAAQD;KAAM,GAC1BH;AACN;AAIO,MAAMQ,6BAAiD;IAC5D;QAAC;QAAK;QAAK;QAAK;KAAI;IACpB;QAAC;QAAK;QAAK;QAAK;KAAI;IACpB;QAAC;QAAK;QAAK;QAAK;KAAI;IACpB;QAAC;QAAK;QAAK;QAAK;KAAI;IACpB;QAAC;QAAI;QAAK;QAAK;KAAI;IACnB;QAAC;QAAK;QAAK;QAAK;KAAI;IACpB;QAAC;QAAK;QAAK;QAAK;KAAI;IACpB;QAAC;QAAI;QAAK;QAAK;KAAI;CACpB;AAED,SAASC,oBACPV,mBAAoD;IAEpD,OAAOS,2BAA2B,GAAG,CAAC,CAACR,SACrCF,yBAAyBC,qBAAqBC;AAElD;AAEA,SAASU,gBAAgB,EAAEpB,KAAK,EAAmC;IACjE,OAAOA,AAAU,YAAVA,QAAoB,UAAU;AACvC;AAEA,SAASqB,iBACP,EAAErB,KAAK,EAAmC,EAC1C,EAAEsB,SAAS,KAAK,EAAwB,GAAG,CAAC,CAAC;IAE7C,OAAOtB,AAAU,WAAVA,QACHsB,SACE,mBACA,iBACFA,SACE,WACA;AACR;AAEO,SAASC,6BACdd,mBAAoD;IAEpD,OAAO;QACL,WAAWW,gBAAgBX;QAC3B,mBAAmBF,gCAAgCE;QACnD,wBACEV,gCAAgCU;QAClC,YAAYY,iBAAiBZ;QAC7B,kBAAkBY,iBAAiBZ,qBAAqB;YAAE,QAAQ;QAAK;QACvE,eAAeU,oBAAoBV;IACrC;AACF"}