diff --git a/auth.h b/auth.h
index ace0580..436e9f1 100644
--- a/auth.h
+++ b/auth.h
@@ -13,14 +13,23 @@
 #include <stdio.h>
 
 enum AUTH_TYPE {
+    AUTH_TYPE_NONE,
     AUTH_TYPE_API_KEY,
     AUTH_TYPE_FREE
 };
 
-int auth_type = AUTH_TYPE_FREE;
+int auth_type = AUTH_TYPE_NONE;
+
+void auth_free(){
+    auth_type = AUTH_TYPE_FREE;
+}
 
 void auth_init() {
+    
     char *api_key = NULL;
+    if(auth_type != AUTH_TYPE_FREE) {
+    
+
     api_key = getenv("R_KEY");
     if (api_key) {
         auth_type = AUTH_TYPE_API_KEY;
@@ -30,13 +39,16 @@ void auth_init() {
     if (api_key) {
         auth_type = AUTH_TYPE_API_KEY;
         return;
-    } 
+    }
+    }
     auth_type = AUTH_TYPE_FREE;
     return;
 }
 
 const char *resolve_api_key() {
     static char *api_key = NULL;
+    if(auth_type != AUTH_TYPE_FREE) {
+    
     api_key = getenv("R_KEY");
     if (api_key) {
         auth_type = AUTH_TYPE_API_KEY;
@@ -47,6 +59,8 @@ const char *resolve_api_key() {
         auth_type = AUTH_TYPE_API_KEY;
         return api_key;
     }
+    }
+    auth_type = AUTH_TYPE_FREE;
     api_key = "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";
     return api_key;
 }
diff --git a/main.c b/main.c
index e932412..646d36f 100644
--- a/main.c
+++ b/main.c
@@ -32,6 +32,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <signal.h>
 
 
 #include "openai.h"
@@ -44,7 +45,8 @@
 #include <unistd.h>
 #include "utils.h"
 
-
+volatile sig_atomic_t sigint_count = 0;
+time_t first_sigint_time = 0;
 bool SYNTAX_HIGHLIGHT_ENABLED = true;
 bool API_MODE = false;
 void help();
@@ -84,8 +86,11 @@ char *get_prompt_from_args(int c, char **argv) {
                 //plugin_run(file_content);
                 i++;
             } 
+        }else if (!strcmp(argv[i],"--free")){
+            auth_free();
+            continue;
         }
-
+        
         else if(!strcmp(argv[i],"--context")){
             if(i+1 <= c){
                 char * context_file_path = argv[i+1];
@@ -202,6 +207,10 @@ void repl() {
             printf("%s\n",message_json());  
             continue;
         } 
+        if (!strncmp(line, "model", 5)) {
+            printf("%s\n",get_prompt_model());
+            continue;
+        }
         if (!strncmp(line, "exit", 4)) {
             exit(0);
         }
@@ -304,7 +313,26 @@ void init() {
     fprintf(stderr, "\r                          \r");
 }
 
+void handle_sigint(int sig) {
+    time_t current_time = time(NULL);
+
+    if (sigint_count == 0) {
+        first_sigint_time = current_time;
+        sigint_count++;
+    } else {
+        if (difftime(current_time, first_sigint_time) <= 1) {
+            exit(0);
+        } else {
+            sigint_count = 1;
+            first_sigint_time = current_time;
+        }
+    }
+} 
+
+
 int main(int argc, char *argv[]) {
+    signal(SIGINT, handle_sigint);
+
     init();
     if (try_prompt(argc, argv))
         return 0;
diff --git a/tools.h b/tools.h
index e7994d5..92cb783 100644
--- a/tools.h
+++ b/tools.h
@@ -25,6 +25,8 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include "indexer.h"
+
 struct json_object* tool_description_http_get();
 struct json_object* tool_description_linux_terminal();
 struct json_object* tool_description_directory_glob();
@@ -32,6 +34,7 @@ struct json_object* tool_description_read_file();
 struct json_object* tool_description_write_file();
 struct json_object* tool_description_directory_rglob();
 struct json_object* tool_description_linux_terminal_interactive();
+struct json_object* tool_description_index_source_directory();
 
 struct json_object* tools_descriptions() {
     struct json_object* root = json_object_new_array();
@@ -42,6 +45,7 @@ struct json_object* tools_descriptions() {
     json_object_array_add(root, tool_description_write_file());
     json_object_array_add(root, tool_description_directory_rglob());
     json_object_array_add(root, tool_description_linux_terminal_interactive());
+    json_object_array_add(root,tool_description_index_source_directory());
     return root;
 }
 
@@ -93,6 +97,40 @@ char* tool_function_linux_terminal_interactive(char* command) {
     return result;
 }
 
+struct json_object* tool_description_index_source_directory() {
+    struct json_object* root = json_object_new_object();
+    json_object_object_add(root, "type", json_object_new_string("function"));
+
+    struct json_object* function = json_object_new_object();
+    json_object_object_add(function, "name", json_object_new_string("index_source_directory"));
+    json_object_object_add(function, "description", json_object_new_string("Returns a JSON array containing every source file with it's contents from given directory. Execute with '.' for current directory."));
+
+    struct json_object* parameters = json_object_new_object();
+    json_object_object_add(parameters, "type", json_object_new_string("object"));
+
+    struct json_object* properties = json_object_new_object();
+    struct json_object* path = json_object_new_object();
+    json_object_object_add(path, "type", json_object_new_string("string"));
+    json_object_object_add(path, "description", json_object_new_string("Path to index and retreive files from."));
+    json_object_object_add(properties, "path", path);
+
+    json_object_object_add(parameters, "properties", properties);
+
+    struct json_object* required = json_object_new_array();
+    json_object_array_add(required, json_object_new_string("path"));
+    json_object_object_add(parameters, "required", required);
+
+    json_object_object_add(parameters, "additionalProperties", json_object_new_boolean(0));
+
+    json_object_object_add(function, "parameters", parameters);
+    json_object_object_add(function, "strict", json_object_new_boolean(1));
+
+    json_object_object_add(root, "function", function);
+
+    return root;
+
+}
+
 struct json_object* tool_description_linux_terminal_interactive() {
     struct json_object* root = json_object_new_object();
     json_object_object_add(root, "type", json_object_new_string("function"));
@@ -233,6 +271,11 @@ struct json_object* tool_description_write_file() {
     return root;
 }
 
+char* tool_function_index_source_directory(char * path){
+    fprintf(stderr, "Tool index_source_directory: %s\n", path);
+    return index_directory(path);
+}
+
 char* tool_function_read_file(char* path) {
     
     char * expanded_path = expand_home_directory(path);
@@ -665,6 +708,18 @@ struct json_object* tools_execute(struct json_object* tools_array) {
                         free(write_result);
                     }
                 }
+            } else if (!strcmp(function_name, "index_source_directory")) {
+                struct json_object* arguments_obj;
+                if (json_object_object_get_ex(function_obj, "arguments", &arguments_obj)) {
+                    struct json_object* arguments = json_tokener_parse(json_object_get_string(arguments_obj));
+                    struct json_object* path_obj;
+                    if (json_object_object_get_ex(arguments, "path", &path_obj)) {
+                        char* path = (char*)json_object_get_string(path_obj);
+                        char* listing_result = tool_function_index_source_directory(path);
+                        json_object_object_add(tool_result, "content", json_object_new_string(listing_result));
+                        free(listing_result);
+                    }
+                }
             } else if (!strcmp(function_name, "directory_rglob")) {
                 struct json_object* arguments_obj;
                 if (json_object_object_get_ex(function_obj, "arguments", &arguments_obj)) {