{
  "id": "ical-generator",
  "name": "iCal-Event-Generator",
  "version": "1.0.0",
  "type": "agent-tool",
  "author": "Astoris",
  "premium": false,
  "description": "Erzeugt einen iCalendar-Termin (.ics) aus Titel, Start- und Endzeit zum Import in Kalender.",
  "inputHint": "{ \"titel\": \"Meeting\", \"start\": \"2026-07-01T10:00:00Z\", \"ende\": \"2026-07-01T11:00:00Z\", \"ort\": \"Berlin\" }",
  "code": "async function run(input) {\n  var titel = String((input && input.titel) || '').trim();\n  var start = String((input && input.start) || '').trim();\n  var ende = String((input && input.ende) || '').trim();\n  var ort = String((input && input.ort) || '').trim();\n  var beschreibung = String((input && input.beschreibung) || '').trim();\n  if (!titel) return { fehler: 'Titel fehlt.' };\n  if (!start) return { fehler: 'Startzeit fehlt.' };\n  function fmt(d) {\n    if (isNaN(d.getTime())) return null;\n    function p(n) { return String(n).padStart(2, '0'); }\n    return d.getUTCFullYear() + p(d.getUTCMonth() + 1) + p(d.getUTCDate()) + 'T' + p(d.getUTCHours()) + p(d.getUTCMinutes()) + p(d.getUTCSeconds()) + 'Z';\n  }\n  function esc(s) { return String(s || '').replace(/\\\\/g, '\\\\\\\\').replace(/;/g, '\\\\;').replace(/,/g, '\\\\,').replace(/\\n/g, '\\\\n'); }\n  var ds = new Date(start);\n  var dtStart = fmt(ds);\n  if (!dtStart) return { fehler: 'Startzeit ungueltig (ISO-Format erwartet).' };\n  var de = ende ? new Date(ende) : new Date(ds.getTime() + 3600000);\n  var dtEnd = fmt(de);\n  if (!dtEnd) return { fehler: 'Endzeit ungueltig.' };\n  var dtStamp = fmt(new Date());\n  var rnd = '';\n  var bytes = new Uint8Array(16);\n  crypto.getRandomValues(bytes);\n  for (var i = 0; i < bytes.length; i++) rnd += bytes[i].toString(16).padStart(2, '0');\n  var uid = rnd + '@astoris';\n  var lines = [\n    'BEGIN:VCALENDAR',\n    'VERSION:2.0',\n    'PRODID:-//Astoris//iCal Generator//DE',\n    'CALSCALE:GREGORIAN',\n    'BEGIN:VEVENT',\n    'UID:' + uid,\n    'DTSTAMP:' + dtStamp,\n    'DTSTART:' + dtStart,\n    'DTEND:' + dtEnd,\n    'SUMMARY:' + esc(titel)\n  ];\n  if (ort) lines.push('LOCATION:' + esc(ort));\n  if (beschreibung) lines.push('DESCRIPTION:' + esc(beschreibung));\n  lines.push('END:VEVENT');\n  lines.push('END:VCALENDAR');\n  var ics = lines.join('\\r\\n');\n  var base = titel.replace(/[^a-zA-Z0-9]+/g, '_').replace(/^_+|_+$/g, '').toLowerCase() || 'termin';\n  return { ics: ics, dateiname: base + '.ics' };\n}"
}
