/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/alias_parser.cr-1-module JosieHealth
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/alias_parser.cr-2-  module BotCore
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/alias_parser.cr-3-    module AliasParser
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/alias_parser.cr:4:      def self.parse_doses(doses_string : String) : Array(NamedTuple(amount: String, substance: String, route: String))
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/alias_parser.cr-5-        doses = [] of NamedTuple(amount: String, substance: String, route: String)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/alias_parser.cr-6-
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/alias_parser.cr-7-        dose_parts = doses_string.split(';')
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/alias_parser.cr-8-
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/alias_parser.cr-9-        dose_parts.each do |dose_part|
--
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/reminder_handler.cr-5-  module BotCore
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/reminder_handler.cr-6-    class ReminderHandler < BaseHandler
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/reminder_handler.cr-7-      Recurrence = JosieHealth::Utils::Recurrence
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/reminder_handler.cr-8-
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/reminder_handler.cr-9-      def handle_in(cmd : ReminderInCommand) : Response
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/reminder_handler.cr:10:        total_seconds = Recurrence.parse_interval(cmd.duration)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/reminder_handler.cr-11-
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/reminder_handler.cr-12-        if total_seconds.nil?
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/reminder_handler.cr-13-          return Response.error("Invalid duration format. Use formats like: 1w, 5d, 2h, 30m, 1h30m, etc.")
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/reminder_handler.cr-14-        end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/reminder_handler.cr-15-
--
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/dose_handler.cr-62-        else
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/dose_handler.cr-63-          Response.error("Failed to log redose")
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/dose_handler.cr-64-        end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/dose_handler.cr-65-      end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/dose_handler.cr-66-
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/dose_handler.cr:67:      private def parse_timestamp(ts : String) : String?
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/dose_handler.cr-68-        # HHMM format (e.g., 1430 for 2:30 PM)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/dose_handler.cr-69-        if ts.match(/^\d{4}$/)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/dose_handler.cr-70-          hour = ts[0..1].to_i
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/dose_handler.cr-71-          minute = ts[2..3].to_i
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/dose_handler.cr-72-          if hour < 24 && minute < 60
--
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/dose_handler.cr-79-        end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/dose_handler.cr-80-        # Already RFC3339 or relative - pass through
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/dose_handler.cr-81-        ts
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/dose_handler.cr-82-      end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/dose_handler.cr-83-
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/dose_handler.cr:84:      private def parse_dose_response(json : String) : Response
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/dose_handler.cr-85-        begin
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/dose_handler.cr-86-          data = JSON.parse(json)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/dose_handler.cr-87-          if error = data["error"]?
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/dose_handler.cr-88-            return Response.error(error.as_s)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/dose_handler.cr-89-          end
--
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/query_handler.cr-182-        else
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/query_handler.cr-183-          Response.error("Failed to parse data")
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/query_handler.cr-184-        end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/query_handler.cr-185-      end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/query_handler.cr-186-
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/query_handler.cr:187:      private def parse_display_time(entry : DoseEntry) : Time?
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/query_handler.cr-188-        Time.parse_rfc3339(entry.timestamp)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/query_handler.cr-189-      rescue
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/query_handler.cr-190-        nil
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/query_handler.cr-191-      end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/handlers/query_handler.cr-192-    end
--
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-10-      def initialize(@prefix : String = ";")
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-11-      end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-12-
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-13-      # Parse raw message into a Command
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-14-      # Returns nil if message doesn't start with prefix
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr:15:      def parse(user_id : String, message : String, context : CommandContext? = nil) : Command?
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-16-        message = message.strip
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-17-        return nil unless message.starts_with?(@prefix)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-18-
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-19-        # Remove prefix and split into command + args
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-20-        content = message[@prefix.size..-1]
--
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-23-        args = parts[1]? || ""
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-24-
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-25-        parse_command(user_id, command_name, args, context)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-26-      end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-27-
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr:28:      private def parse_command(user_id : String, cmd : String, args : String, ctx : CommandContext?) : Command
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-29-        case cmd
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-30-        # Dose logging
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-31-        when "idose", "id"
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-32-          parse_raw_dose(user_id, args)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-33-        when "hdose"
--
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-142-        else
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-143-          UnknownCommand.new(user_id, cmd, args)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-144-        end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-145-      end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-146-
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr:147:      private def parse_raw_dose(user_id : String, args : String) : Command
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-148-        RawDoseCommand.new(user_id, args)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-149-      end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-150-
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr:151:      private def parse_hdose(user_id : String, args : String) : Command
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-152-        # hdose <HHMM> <raw_dose>
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-153-        parts = args.split(' ', limit: 2)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-154-        if parts.size >= 2
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-155-          timestamp = parts[0]
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-156-          raw_dose = parts[1]
--
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-159-        else
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-160-          UnknownCommand.new(user_id, "hdose", args)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-161-        end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-162-      end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-163-
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr:164:      private def parse_tdose(user_id : String, args : String) : Command
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-165-        # tdose <timestamp> <raw_dose>
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-166-        parts = args.split(' ', limit: 2)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-167-        if parts.size >= 2
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-168-          timestamp = parts[0]
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-169-          raw_dose = parts[1]
--
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-171-        else
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-172-          UnknownCommand.new(user_id, "tdose", args)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-173-        end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-174-      end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-175-
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr:176:      private def parse_k_command(user_id : String, args : String) : Command
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-177-        # ;k <dose> = ketamine insufflated
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-178-        if args.strip.empty?
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-179-          UnknownCommand.new(user_id, "k", args)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-180-        else
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-181-          RawDoseCommand.new(user_id, "#{args.strip} ketamine insufflated")
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-182-        end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-183-      end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-184-
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr:185:      private def parse_beer_command(user_id : String, args : String) : Command
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-186-        # ;beer [count] = beer oral
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-187-        count = args.strip.empty? ? "1" : args.strip
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-188-        RawDoseCommand.new(user_id, "#{count} beer oral")
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-189-      end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-190-
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr:191:      private def parse_route_dose(user_id : String, args : String, route : String) : Command
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-192-        # ;<route> <dose> <substance> = <dose> <substance> <route>
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-193-        if args.strip.empty?
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-194-          UnknownCommand.new(user_id, route, args)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-195-        else
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-196-          RawDoseCommand.new(user_id, "#{args.strip} #{route}")
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-197-        end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-198-      end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-199-
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr:200:      private def parse_vitals(user_id : String, args : String) : Command
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-201-        # Parse: pulse systolic/diastolic o2
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-202-        pulse : Int32? = nil
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-203-        systolic : Int32? = nil
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-204-        diastolic : Int32? = nil
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-205-        blood_oxygen : Int32? = nil
--
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-219-
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-220-        VitalsCommand.new(user_id, pulse: pulse, systolic: systolic,
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-221-          diastolic: diastolic, blood_oxygen: blood_oxygen, raw_args: args)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-222-      end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-223-
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr:224:      private def parse_lab(user_id : String, args : String) : Command
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-225-        # Parse: <test_type> <value> [unit] [reference_range]
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-226-        parts = args.split(/\s+/)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-227-        if parts.size >= 2
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-228-          test_type = parts[0]
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-229-          if value = parts[1].to_f?
--
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-236-        else
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-237-          UnknownCommand.new(user_id, "lab", args)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-238-        end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-239-      end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-240-
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr:241:      private def parse_interaction(user_id : String, args : String) : Command
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-242-        if match = args.match(/^(.+?)\s+(?:and\s+)?(.+)$/)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-243-          InteractionCommand.new(user_id, match[1].strip, match[2].strip)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-244-        else
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-245-          UnknownCommand.new(user_id, "interaction", args)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-246-        end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-247-      end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-248-
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr:249:      private def parse_grepdose(user_id : String, args : String) : Command
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-250-        if args.strip.empty?
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-251-          UnknownCommand.new(user_id, "grepdose", args)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-252-        else
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-253-          parts = args.strip.split(/\s+/, 3)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-254-          substance = parts[0]
--
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-265-
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-266-          GrepDoseCommand.new(user_id, substance, n_val, roa)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-267-        end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-268-      end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-269-
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr:270:      private def parse_timezone(user_id : String, args : String) : Command
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-271-        args = args.strip
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-272-        if args.empty?
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-273-          GetTimezoneCommand.new(user_id)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-274-        elsif args.starts_with?("set ")
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-275-          SetTimezoneCommand.new(user_id, args[4..-1].strip)
--
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-279-          # Assume it's a lookup or set
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-280-          LookupTimezoneCommand.new(user_id, args)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-281-        end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-282-      end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-283-
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr:284:      private def parse_alias(user_id : String, args : String) : Command
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-285-        parts = args.strip.split(/\s+/, 2)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-286-        if parts.empty? || parts[0].empty? || parts[0] == "list"
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-287-          ListAliasesCommand.new(user_id)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-288-        elsif parts[0] == "remove" && parts.size > 1
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-289-          RemoveAliasCommand.new(user_id, parts[1])
--
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-292-        else
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-293-          SetAliasCommand.new(user_id, parts[0], parts[1])
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-294-        end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-295-      end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-296-
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr:297:      private def parse_reminder_in(user_id : String, args : String, ctx : CommandContext?) : Command
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-298-        parts = args.split(' ', limit: 2)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-299-        if parts.size >= 2
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-300-          duration = parts[0]
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-301-          message = parts[1]
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-302-          channel_id = ctx.try(&.channel_id) || ""
--
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-306-        else
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-307-          UnknownCommand.new(user_id, "in", args)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-308-        end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-309-      end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-310-
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr:311:      private def parse_reminder_every(user_id : String, args : String, ctx : CommandContext?) : Command
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-312-        parts = args.split(' ', limit: 2)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-313-        if parts.size >= 2
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-314-          pattern = parts[0]
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-315-          message = parts[1]
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-316-          channel_id = ctx.try(&.channel_id) || ""
--
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-320-        else
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-321-          UnknownCommand.new(user_id, "every", args)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-322-        end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-323-      end
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-324-
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr:325:      private def parse_wrapped(user_id : String, args : String) : Command
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-326-        args = args.strip.downcase
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-327-        if args == "alltime"
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-328-          WrappedCommand.new(user_id, nil, true)
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-329-        elsif year = args.to_i?
/home/josie/development/personal/josiedot/health/josie-health-bot-core/src/command_parser.cr-330-          WrappedCommand.new(user_id, year, false)