{"version":3,"file":"unit_conversion.cjs","names":[],"sources":["../../../src/batteries/tools/unit_conversion/index.ts"],"sourcesContent":["/**\n * Pre-constructed tools for converting values across common measurement units.\n *\n * @module @nhtio/adk/batteries/tools/unit_conversion\n *\n * @remarks\n * Pre-constructed bundled tools for the `unit_conversion` category. Import individually, the whole\n * category, or import every tool via `@nhtio/adk/batteries`.\n */\n\nimport { Tool } from '@nhtio/adk/common'\nimport { validator } from '@nhtio/validation'\nimport { bigScale, formatBig, DEFAULT_PRECISION } from '@nhtio/adk/lib/helpers/bignum'\n\ntype UnitDef = { category: string; factor: number; label: string }\n\nconst UNITS: Record<string, UnitDef> = {\n  // Length (base: metre)\n  m: { category: 'length', factor: 1, label: 'metres' },\n  km: { category: 'length', factor: 1000, label: 'kilometres' },\n  cm: { category: 'length', factor: 0.01, label: 'centimetres' },\n  mm: { category: 'length', factor: 0.001, label: 'millimetres' },\n  mi: { category: 'length', factor: 1609.344, label: 'miles' },\n  ft: { category: 'length', factor: 0.3048, label: 'feet' },\n  in: { category: 'length', factor: 0.0254, label: 'inches' },\n  yd: { category: 'length', factor: 0.9144, label: 'yards' },\n  nmi: { category: 'length', factor: 1852, label: 'nautical miles' },\n\n  // Mass (base: gram)\n  g: { category: 'mass', factor: 1, label: 'grams' },\n  kg: { category: 'mass', factor: 1000, label: 'kilograms' },\n  mg: { category: 'mass', factor: 0.001, label: 'milligrams' },\n  t: { category: 'mass', factor: 1_000_000, label: 'metric tons' },\n  lb: { category: 'mass', factor: 453.59237, label: 'pounds' },\n  oz: { category: 'mass', factor: 28.349523125, label: 'ounces' },\n  st: { category: 'mass', factor: 6350.29318, label: 'stone' },\n\n  // Volume (base: litre)\n  L: { category: 'volume', factor: 1, label: 'litres' },\n  mL: { category: 'volume', factor: 0.001, label: 'millilitres' },\n  m3: { category: 'volume', factor: 1000, label: 'cubic metres' },\n  cm3: { category: 'volume', factor: 0.001, label: 'cubic centimetres' },\n  gal: { category: 'volume', factor: 3.785411784, label: 'US gallons' },\n  qt: { category: 'volume', factor: 0.946352946, label: 'US quarts' },\n  pt: { category: 'volume', factor: 0.473176473, label: 'US pints' },\n  cup: { category: 'volume', factor: 0.2365882365, label: 'US cups' },\n  floz: { category: 'volume', factor: 0.029573529562, label: 'US fluid ounces' },\n  tbsp: { category: 'volume', factor: 0.014786764781, label: 'tablespoons' },\n  tsp: { category: 'volume', factor: 0.0049289215938, label: 'teaspoons' },\n\n  // Speed (base: m/s)\n  m_s: { category: 'speed', factor: 1, label: 'm/s' },\n  km_h: { category: 'speed', factor: 1 / 3.6, label: 'km/h' },\n  mph: { category: 'speed', factor: 0.44704, label: 'mph' },\n  kn: { category: 'speed', factor: 0.514444, label: 'knots' },\n  ft_s: { category: 'speed', factor: 0.3048, label: 'ft/s' },\n\n  // Area (base: m²)\n  m2: { category: 'area', factor: 1, label: 'm²' },\n  km2: { category: 'area', factor: 1_000_000, label: 'km²' },\n  cm2: { category: 'area', factor: 0.0001, label: 'cm²' },\n  mm2: { category: 'area', factor: 0.000001, label: 'mm²' },\n  ft2: { category: 'area', factor: 0.09290304, label: 'sq ft' },\n  in2: { category: 'area', factor: 0.00064516, label: 'sq in' },\n  yd2: { category: 'area', factor: 0.83612736, label: 'sq yd' },\n  acre: { category: 'area', factor: 4046.8564224, label: 'acres' },\n  ha: { category: 'area', factor: 10_000, label: 'hectares' },\n\n  // Data storage (base: bit)\n  bit: { category: 'data', factor: 1, label: 'bits' },\n  B: { category: 'data', factor: 8, label: 'bytes' },\n  KB: { category: 'data', factor: 8_000, label: 'kilobytes' },\n  MB: { category: 'data', factor: 8_000_000, label: 'megabytes' },\n  GB: { category: 'data', factor: 8_000_000_000, label: 'gigabytes' },\n  TB: { category: 'data', factor: 8_000_000_000_000, label: 'terabytes' },\n  KiB: { category: 'data', factor: 8 * 1024, label: 'kibibytes' },\n  MiB: { category: 'data', factor: 8 * 1024 ** 2, label: 'mebibytes' },\n  GiB: { category: 'data', factor: 8 * 1024 ** 3, label: 'gibibytes' },\n  TiB: { category: 'data', factor: 8 * 1024 ** 4, label: 'tebibytes' },\n\n  // Time (base: second)\n  ms: { category: 'time', factor: 0.001, label: 'milliseconds' },\n  s: { category: 'time', factor: 1, label: 'seconds' },\n  min: { category: 'time', factor: 60, label: 'minutes' },\n  h: { category: 'time', factor: 3600, label: 'hours' },\n  d: { category: 'time', factor: 86400, label: 'days' },\n  wk: { category: 'time', factor: 604800, label: 'weeks' },\n\n  // Energy (base: joule)\n  J: { category: 'energy', factor: 1, label: 'joules' },\n  kJ: { category: 'energy', factor: 1000, label: 'kilojoules' },\n  cal: { category: 'energy', factor: 4.184, label: 'calories' },\n  kcal: { category: 'energy', factor: 4184, label: 'kilocalories' },\n  Wh: { category: 'energy', factor: 3600, label: 'watt-hours' },\n  kWh: { category: 'energy', factor: 3_600_000, label: 'kilowatt-hours' },\n  BTU: { category: 'energy', factor: 1055.05585, label: 'BTU' },\n\n  // Pressure (base: pascal)\n  Pa: { category: 'pressure', factor: 1, label: 'pascals' },\n  kPa: { category: 'pressure', factor: 1000, label: 'kilopascals' },\n  MPa: { category: 'pressure', factor: 1_000_000, label: 'megapascals' },\n  bar: { category: 'pressure', factor: 100_000, label: 'bar' },\n  psi: { category: 'pressure', factor: 6894.757, label: 'psi' },\n  atm: { category: 'pressure', factor: 101325, label: 'atm' },\n  mmHg: { category: 'pressure', factor: 133.322, label: 'mmHg' },\n\n  // Angle (base: radian)\n  rad: { category: 'angle', factor: 1, label: 'radians' },\n  deg: { category: 'angle', factor: Math.PI / 180, label: 'degrees' },\n  grad: { category: 'angle', factor: Math.PI / 200, label: 'gradians' },\n}\n\nconst TEMP_UNITS = new Set(['C', 'F', 'K'])\ntype TempUnit = 'C' | 'F' | 'K'\nconst TEMP_LABELS: Record<TempUnit, string> = { C: '°C', F: '°F', K: 'K' }\n\nfunction toKelvin(value: number, unit: TempUnit): number {\n  if (unit === 'C') return value + 273.15\n  if (unit === 'F') return (value - 32) * (5 / 9) + 273.15\n  return value\n}\n\nfunction fromKelvin(kelvin: number, unit: TempUnit): number {\n  if (unit === 'C') return kelvin - 273.15\n  if (unit === 'F') return (kelvin - 273.15) * (9 / 5) + 32\n  return kelvin\n}\n\nconst ALL_UNIT_KEYS = [...Object.keys(UNITS), 'C', 'F', 'K'].join(', ')\n\n/**\n * Convert a numeric value between units of the same physical category.\n *\n * @remarks\n * Supported categories: length, mass, volume, temperature, speed, area, data, time, energy,\n * pressure, angle. Uses static conversion tables — no external data required. Temperature is\n * handled specially via a Kelvin intermediate to preserve precision across `C`/`F`/`K`.\n */\nexport const convertUnitTool = new Tool({\n  name: 'convert_unit',\n  description:\n    'Convert a numeric value between units of the same category (length, mass, volume, temperature, speed, area, data, time, energy, pressure, angle). Uses static lookup tables — no external data required.',\n  inputSchema: validator.object({\n    value: validator.number().required().description('Numeric value to convert'),\n    from: validator\n      .string()\n      .required()\n      .description(`Source unit key. Supported keys: ${ALL_UNIT_KEYS}`),\n    to: validator\n      .string()\n      .required()\n      .description('Target unit key (must be in the same category as source)'),\n    precision: validator\n      .number()\n      .default(DEFAULT_PRECISION)\n      .description(`Significant digits in the result (default: ${DEFAULT_PRECISION}).`),\n  }),\n  handler: async (args) => {\n    const { value, from, to, precision } = args as {\n      value: number\n      from: string\n      to: string\n      precision: number\n    }\n\n    if (TEMP_UNITS.has(from) || TEMP_UNITS.has(to)) {\n      if (!TEMP_UNITS.has(from))\n        return `Error: \"${from}\" is not a temperature unit. Use C, F, or K.`\n      if (!TEMP_UNITS.has(to)) return `Error: \"${to}\" is not a temperature unit. Use C, F, or K.`\n      // Temperatures are small bounded values (schema rejects |value| > 2^53), so float64 math\n      // is exact enough; only the display precision changes.\n      const kelvin = toKelvin(value, from as TempUnit)\n      // Reject physically impossible temperatures below absolute zero (0 K) rather than silently\n      // returning a nonsensical value like \"-1 K = -274.15 °C\". A tiny epsilon absorbs float noise.\n      if (kelvin < -1e-9) {\n        return `Error: ${value}${TEMP_LABELS[from as TempUnit]} is below absolute zero (0 K); not a physical temperature.`\n      }\n      const result = fromKelvin(kelvin, to as TempUnit)\n      const rounded = formatBig(result, precision)\n      return `${value}${TEMP_LABELS[from as TempUnit]} = ${rounded}${TEMP_LABELS[to as TempUnit]}`\n    }\n\n    const fromDef = UNITS[from]\n    const toDef = UNITS[to]\n    if (!fromDef) return `Error: Unknown unit \"${from}\". Supported: ${ALL_UNIT_KEYS}`\n    if (!toDef) return `Error: Unknown unit \"${to}\". Supported: ${ALL_UNIT_KEYS}`\n    if (fromDef.category !== toDef.category) {\n      return `Error: Cannot convert \"${from}\" (${fromDef.category}) to \"${to}\" (${toDef.category}) — different categories.`\n    }\n\n    // `value * fromFactor / toFactor` in BigNumber so huge ratios (e.g. TB→bit) don't overflow to\n    // Infinity, tiny ratios (e.g. in→km) don't underflow to 0, and safe integers keep full digits.\n    const result = bigScale(value, fromDef.factor, toDef.factor)\n    const rounded = formatBig(result, precision)\n    return `${value} ${fromDef.label} = ${rounded} ${toDef.label}`\n  },\n})\n"],"mappings":";;;;;;;;;;;;;;;;AAgBA,IAAM,QAAiC;CAErC,GAAG;EAAE,UAAU;EAAU,QAAQ;EAAG,OAAO;CAAS;CACpD,IAAI;EAAE,UAAU;EAAU,QAAQ;EAAM,OAAO;CAAa;CAC5D,IAAI;EAAE,UAAU;EAAU,QAAQ;EAAM,OAAO;CAAc;CAC7D,IAAI;EAAE,UAAU;EAAU,QAAQ;EAAO,OAAO;CAAc;CAC9D,IAAI;EAAE,UAAU;EAAU,QAAQ;EAAU,OAAO;CAAQ;CAC3D,IAAI;EAAE,UAAU;EAAU,QAAQ;EAAQ,OAAO;CAAO;CACxD,IAAI;EAAE,UAAU;EAAU,QAAQ;EAAQ,OAAO;CAAS;CAC1D,IAAI;EAAE,UAAU;EAAU,QAAQ;EAAQ,OAAO;CAAQ;CACzD,KAAK;EAAE,UAAU;EAAU,QAAQ;EAAM,OAAO;CAAiB;CAGjE,GAAG;EAAE,UAAU;EAAQ,QAAQ;EAAG,OAAO;CAAQ;CACjD,IAAI;EAAE,UAAU;EAAQ,QAAQ;EAAM,OAAO;CAAY;CACzD,IAAI;EAAE,UAAU;EAAQ,QAAQ;EAAO,OAAO;CAAa;CAC3D,GAAG;EAAE,UAAU;EAAQ,QAAQ;EAAW,OAAO;CAAc;CAC/D,IAAI;EAAE,UAAU;EAAQ,QAAQ;EAAW,OAAO;CAAS;CAC3D,IAAI;EAAE,UAAU;EAAQ,QAAQ;EAAc,OAAO;CAAS;CAC9D,IAAI;EAAE,UAAU;EAAQ,QAAQ;EAAY,OAAO;CAAQ;CAG3D,GAAG;EAAE,UAAU;EAAU,QAAQ;EAAG,OAAO;CAAS;CACpD,IAAI;EAAE,UAAU;EAAU,QAAQ;EAAO,OAAO;CAAc;CAC9D,IAAI;EAAE,UAAU;EAAU,QAAQ;EAAM,OAAO;CAAe;CAC9D,KAAK;EAAE,UAAU;EAAU,QAAQ;EAAO,OAAO;CAAoB;CACrE,KAAK;EAAE,UAAU;EAAU,QAAQ;EAAa,OAAO;CAAa;CACpE,IAAI;EAAE,UAAU;EAAU,QAAQ;EAAa,OAAO;CAAY;CAClE,IAAI;EAAE,UAAU;EAAU,QAAQ;EAAa,OAAO;CAAW;CACjE,KAAK;EAAE,UAAU;EAAU,QAAQ;EAAc,OAAO;CAAU;CAClE,MAAM;EAAE,UAAU;EAAU,QAAQ;EAAgB,OAAO;CAAkB;CAC7E,MAAM;EAAE,UAAU;EAAU,QAAQ;EAAgB,OAAO;CAAc;CACzE,KAAK;EAAE,UAAU;EAAU,QAAQ;EAAiB,OAAO;CAAY;CAGvE,KAAK;EAAE,UAAU;EAAS,QAAQ;EAAG,OAAO;CAAM;CAClD,MAAM;EAAE,UAAU;EAAS,QAAQ,IAAI;EAAK,OAAO;CAAO;CAC1D,KAAK;EAAE,UAAU;EAAS,QAAQ;EAAS,OAAO;CAAM;CACxD,IAAI;EAAE,UAAU;EAAS,QAAQ;EAAU,OAAO;CAAQ;CAC1D,MAAM;EAAE,UAAU;EAAS,QAAQ;EAAQ,OAAO;CAAO;CAGzD,IAAI;EAAE,UAAU;EAAQ,QAAQ;EAAG,OAAO;CAAK;CAC/C,KAAK;EAAE,UAAU;EAAQ,QAAQ;EAAW,OAAO;CAAM;CACzD,KAAK;EAAE,UAAU;EAAQ,QAAQ;EAAQ,OAAO;CAAM;CACtD,KAAK;EAAE,UAAU;EAAQ,QAAQ;EAAU,OAAO;CAAM;CACxD,KAAK;EAAE,UAAU;EAAQ,QAAQ;EAAY,OAAO;CAAQ;CAC5D,KAAK;EAAE,UAAU;EAAQ,QAAQ;EAAY,OAAO;CAAQ;CAC5D,KAAK;EAAE,UAAU;EAAQ,QAAQ;EAAY,OAAO;CAAQ;CAC5D,MAAM;EAAE,UAAU;EAAQ,QAAQ;EAAc,OAAO;CAAQ;CAC/D,IAAI;EAAE,UAAU;EAAQ,QAAQ;EAAQ,OAAO;CAAW;CAG1D,KAAK;EAAE,UAAU;EAAQ,QAAQ;EAAG,OAAO;CAAO;CAClD,GAAG;EAAE,UAAU;EAAQ,QAAQ;EAAG,OAAO;CAAQ;CACjD,IAAI;EAAE,UAAU;EAAQ,QAAQ;EAAO,OAAO;CAAY;CAC1D,IAAI;EAAE,UAAU;EAAQ,QAAQ;EAAW,OAAO;CAAY;CAC9D,IAAI;EAAE,UAAU;EAAQ,QAAQ;EAAe,OAAO;CAAY;CAClE,IAAI;EAAE,UAAU;EAAQ,QAAQ;EAAmB,OAAO;CAAY;CACtE,KAAK;EAAE,UAAU;EAAQ,QAAQ,IAAI;EAAM,OAAO;CAAY;CAC9D,KAAK;EAAE,UAAU;EAAQ,QAAQ,IAAI,QAAQ;EAAG,OAAO;CAAY;CACnE,KAAK;EAAE,UAAU;EAAQ,QAAQ,IAAI,QAAQ;EAAG,OAAO;CAAY;CACnE,KAAK;EAAE,UAAU;EAAQ,QAAQ,IAAI,QAAQ;EAAG,OAAO;CAAY;CAGnE,IAAI;EAAE,UAAU;EAAQ,QAAQ;EAAO,OAAO;CAAe;CAC7D,GAAG;EAAE,UAAU;EAAQ,QAAQ;EAAG,OAAO;CAAU;CACnD,KAAK;EAAE,UAAU;EAAQ,QAAQ;EAAI,OAAO;CAAU;CACtD,GAAG;EAAE,UAAU;EAAQ,QAAQ;EAAM,OAAO;CAAQ;CACpD,GAAG;EAAE,UAAU;EAAQ,QAAQ;EAAO,OAAO;CAAO;CACpD,IAAI;EAAE,UAAU;EAAQ,QAAQ;EAAQ,OAAO;CAAQ;CAGvD,GAAG;EAAE,UAAU;EAAU,QAAQ;EAAG,OAAO;CAAS;CACpD,IAAI;EAAE,UAAU;EAAU,QAAQ;EAAM,OAAO;CAAa;CAC5D,KAAK;EAAE,UAAU;EAAU,QAAQ;EAAO,OAAO;CAAW;CAC5D,MAAM;EAAE,UAAU;EAAU,QAAQ;EAAM,OAAO;CAAe;CAChE,IAAI;EAAE,UAAU;EAAU,QAAQ;EAAM,OAAO;CAAa;CAC5D,KAAK;EAAE,UAAU;EAAU,QAAQ;EAAW,OAAO;CAAiB;CACtE,KAAK;EAAE,UAAU;EAAU,QAAQ;EAAY,OAAO;CAAM;CAG5D,IAAI;EAAE,UAAU;EAAY,QAAQ;EAAG,OAAO;CAAU;CACxD,KAAK;EAAE,UAAU;EAAY,QAAQ;EAAM,OAAO;CAAc;CAChE,KAAK;EAAE,UAAU;EAAY,QAAQ;EAAW,OAAO;CAAc;CACrE,KAAK;EAAE,UAAU;EAAY,QAAQ;EAAS,OAAO;CAAM;CAC3D,KAAK;EAAE,UAAU;EAAY,QAAQ;EAAU,OAAO;CAAM;CAC5D,KAAK;EAAE,UAAU;EAAY,QAAQ;EAAQ,OAAO;CAAM;CAC1D,MAAM;EAAE,UAAU;EAAY,QAAQ;EAAS,OAAO;CAAO;CAG7D,KAAK;EAAE,UAAU;EAAS,QAAQ;EAAG,OAAO;CAAU;CACtD,KAAK;EAAE,UAAU;EAAS,QAAQ,KAAK,KAAK;EAAK,OAAO;CAAU;CAClE,MAAM;EAAE,UAAU;EAAS,QAAQ,KAAK,KAAK;EAAK,OAAO;CAAW;AACtE;AAEA,IAAM,aAAa,IAAI,IAAI;CAAC;CAAK;CAAK;AAAG,CAAC;AAE1C,IAAM,cAAwC;CAAE,GAAG;CAAM,GAAG;CAAM,GAAG;AAAI;AAEzE,SAAS,SAAS,OAAe,MAAwB;CACvD,IAAI,SAAS,KAAK,OAAO,QAAQ;CACjC,IAAI,SAAS,KAAK,QAAQ,QAAQ,OAAO,IAAI,KAAK;CAClD,OAAO;AACT;AAEA,SAAS,WAAW,QAAgB,MAAwB;CAC1D,IAAI,SAAS,KAAK,OAAO,SAAS;CAClC,IAAI,SAAS,KAAK,QAAQ,SAAS,WAAW,IAAI,KAAK;CACvD,OAAO;AACT;AAEA,IAAM,gBAAgB;CAAC,GAAG,OAAO,KAAK,KAAK;CAAG;CAAK;CAAK;AAAG,EAAE,KAAK,IAAI;;;;;;;;;AAUtE,IAAa,kBAAkB,IAAI,yBAAA,KAAK;CACtC,MAAM;CACN,aACE;CACF,aAAa,kBAAA,UAAU,OAAO;EAC5B,OAAO,kBAAA,UAAU,OAAO,EAAE,SAAS,EAAE,YAAY,0BAA0B;EAC3E,MAAM,kBAAA,UACH,OAAO,EACP,SAAS,EACT,YAAY,oCAAoC,eAAe;EAClE,IAAI,kBAAA,UACD,OAAO,EACP,SAAS,EACT,YAAY,0DAA0D;EACzE,WAAW,kBAAA,UACR,OAAO,EACP,QAAA,CAAyB,EACzB,YAAY,gDAAmE;CACpF,CAAC;CACD,SAAS,OAAO,SAAS;EACvB,MAAM,EAAE,OAAO,MAAM,IAAI,cAAc;EAOvC,IAAI,WAAW,IAAI,IAAI,KAAK,WAAW,IAAI,EAAE,GAAG;GAC9C,IAAI,CAAC,WAAW,IAAI,IAAI,GACtB,OAAO,WAAW,KAAK;GACzB,IAAI,CAAC,WAAW,IAAI,EAAE,GAAG,OAAO,WAAW,GAAG;GAG9C,MAAM,SAAS,SAAS,OAAO,IAAgB;GAG/C,IAAI,SAAS,OACX,OAAO,UAAU,QAAQ,YAAY,MAAkB;GAGzD,MAAM,UAAU,2BAAA,UADD,WAAW,QAAQ,EACR,GAAQ,SAAS;GAC3C,OAAO,GAAG,QAAQ,YAAY,MAAkB,KAAK,UAAU,YAAY;EAC7E;EAEA,MAAM,UAAU,MAAM;EACtB,MAAM,QAAQ,MAAM;EACpB,IAAI,CAAC,SAAS,OAAO,wBAAwB,KAAK,gBAAgB;EAClE,IAAI,CAAC,OAAO,OAAO,wBAAwB,GAAG,gBAAgB;EAC9D,IAAI,QAAQ,aAAa,MAAM,UAC7B,OAAO,0BAA0B,KAAK,KAAK,QAAQ,SAAS,QAAQ,GAAG,KAAK,MAAM,SAAS;EAM7F,MAAM,UAAU,2BAAA,UADD,2BAAA,SAAS,OAAO,QAAQ,QAAQ,MAAM,MAC3B,GAAQ,SAAS;EAC3C,OAAO,GAAG,MAAM,GAAG,QAAQ,MAAM,KAAK,QAAQ,GAAG,MAAM;CACzD;AACF,CAAC"}