File size: 3,253 Bytes
7805350
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
(function(MS) {
  MS.register("calculator", {
    name: "Calculator",
    description: "Precise calculations: arithmetic, trig, logarithms, unit conversions (km⇔miles, C⇔F, kg⇔lbs, etc.)",
    tools: [{
      type: "function",
      function: {
        name: "calculate",
        description: "Evaluate a math expression. Supports +, -, *, /, ^, sin, cos, tan, sqrt, log, ln, abs, pi, and unit conversions like '100 km to miles', '32 C to F', '5 kg to lbs'.",
        parameters: {
          type: "object",
          properties: { expression: { type: "string", description: "Math expression to evaluate" } },
          required: ["expression"]
        }
      }
    }],
    handleToolCall: async function(tn, args) {
      if (tn !== "calculate") return null;
      try {
        var e = args.expression.trim();

        // Unit conversions
        var uc = {
          "km to miles": function(v) { return v * 0.621371; },
          "miles to km": function(v) { return v / 0.621371; },
          "c to f": function(v) { return v * 9/5 + 32; },
          "f to c": function(v) { return (v - 32) * 5/9; },
          "kg to lbs": function(v) { return v * 2.20462; },
          "lbs to kg": function(v) { return v / 2.20462; },
          "meters to feet": function(v) { return v * 3.28084; },
          "feet to meters": function(v) { return v / 3.28084; },
          "inches to cm": function(v) { return v * 2.54; },
          "cm to inches": function(v) { return v / 2.54; },
          "liters to gallons": function(v) { return v * 0.264172; },
          "gallons to liters": function(v) { return v / 0.264172; }
        };

        for (var key in uc) {
          var idx = e.toLowerCase().indexOf(" " + key);
          if (idx === -1) idx = e.toLowerCase().indexOf(key);
          if (idx > -1) {
            var numStr = e.substring(0, idx).trim();
            var num = parseFloat(numStr);
            if (!isNaN(num)) {
              var result = uc[key](num);
              var rounded = Math.round(result * 10000) / 10000;
              return e + " = " + rounded + " (" + key + ")";
            }
          }
        }

        // Math evaluation
        var p = e.replace(/\^/g, "**")
                 .replace(/\bpi\b/gi, "(" + Math.PI + ")")
                 .replace(/\be\b(?!\w)/g, "(" + Math.E + ")")
                 .replace(/\bsin\(/g, "Math.sin(")
                 .replace(/\bcos\(/g, "Math.cos(")
                 .replace(/\btan\(/g, "Math.tan(")
                 .replace(/\basin\(/g, "Math.asin(")
                 .replace(/\bacos\(/g, "Math.acos(")
                 .replace(/\batan\(/g, "Math.atan(")
                 .replace(/\bsqrt\(/g, "Math.sqrt(")
                 .replace(/\blog\(/g, "Math.log10(")
                 .replace(/\bln\(/g, "Math.log(")
                 .replace(/\babs\(/g, "Math.abs(")
                 .replace(/\bround\(/g, "Math.round(")
                 .replace(/\bfloor\(/g, "Math.floor(")
                 .replace(/\bceil\(/g, "Math.ceil(");
        var result = Function('"use strict"; return (' + p + ')')();
        var rounded = Math.round(result * 1000000) / 1000000;
        return e + " = " + rounded;
      } catch (ex) { return "Error: " + ex.message; }
    }
  });
})(ModuleSystem);