diff --git a/.r_history b/.r_history new file mode 100644 index 0000000..f91a1bc --- /dev/null +++ b/.r_history @@ -0,0 +1,470 @@ +htop +How much bigger is my disk than my memory? +fetch my ten bytes from /dev/urandom +ddos https://molodetz.nl +do ab benchmark on https://molodetz.nl +do ab benchmark on https://molodetz.nl with -c 10 -n 1000 +validate computer security +r check system security +does https://blog.nldr.net/ contain a typo? +any more? +does https://molodetz.nl contain a typo? +r how much times is my disk bigger than my memory? How much would it kinda cost to upgrade my memory so much that it will match my disk side? +generate a python script that prints "Lekker voor je!". Save it to lekker.py. execute it with python3. +execute +Hi +What model are you? +What eversion of the model? +what is iotop-c package? +What is the difference between iotop-c and iotop? +execute iotop +sudo iptop +json-c to string in c +does fprintf have a limit? +what is better to use than fprintf when writing much data. +How to do fwrite +how to pretty print json-c string +json-c remove last element from json array +asasfqgwq +execute interactive iotop +sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) attempt to write a readonly database +What points are not very valid from https://devrant.com/rants/13665478/at12bitfloat-serious-debate-on-rust-vs-c-here-are-my-arguments-c-has-1-better-sy +What points are just plain wrong from https://devrant.com/rants/13665478/at12bitfloat-serious-debate-on-rust-vs-c-here-are-my-arguments-c-has-1-better-sy +Grade every statement from 1-10 regarding https://devrant.com/rants/13665478/at12bitfloat-serious-debate-on-rust-vs-c-here-are-my-arguments-c-has-1-better-sy +find out where my disk space goes to +I want a c websocket client that can send text +Does windows have a shortcut to open a terminal? +Hi +Why +hi +How much mb is 134217728 bytes +hi +hi +list all files +check if my pc has rust +create a ne wrust project and add cli libs +do it +run it +execute the binary result +do it +run the binary +do a cargo run porjecct +Bash traps how do they work and how can i let it repeat last command? +HOw to make a backup command iwth tiemstamp file name in a make file command +list files in current directory. +read x.txt write xy.txt say haha +read x.txt write xy.txt say haha and finally send DONE! +read x.txt write xy.txt say haha and finally send DONE! +read x.txt write xy.txt say haha and finally send DONE! +continue +continue +How to uncomment vim +There must be a shortcut +What would you say what hte level is of this developer?? http://localhost:8082/ +What could be better about the site?? +what book +what is the exiting year? +what about 1984? +what are you fan of? +Who are you? +list files +ls +cat all text files +cat all text files +cat all text files +cat all text files +Who are you? +how to run ftpd +How to run the normal ftpd on linux +How does ollama tools api work using http? +How to do class based views in aiohttp +How to access app from clas based view +How to do have url tail in aiohttp server route +Show how to use sqlite in python +make sqlite3 cursor select query return dicts +Generate rust source code that shows a message in the right upper corner of the screen. +Not of terminal, but on desktop +do all this for me +continue +It says | ^^^^^^^^^^^^^^^^^^^^^^^^^ no `native_windows_gui` in the root +do it +do it +remove this project +create a rust websocket client project that sends this json to https://snek.molodetz.nl/rpc.ws: {"method":"login","args":["username","password"]} +do it +error[E0599]: no method named `send` found for struct `WebSocketStream` in the current scope + --> src/main.rs:19:15 + | +19 | ws_stream.send(Message::Text(json_message.to_string())).await.expec... + | ^^^^ + | + ::: /home/retoor/.cargo/registry/src/index.crates.io-6f17d22bba15001f/futures-util-0.3.31/src/sink/mod.rs +do it +error[E0433]: failed to resolve: use of undeclared crate or module `futures_util` + --> src/main.rs:8:5 + | +8 | use futures_util::sink::SinkExt; + | ^^^^^^^^^^^^ use of undeclared crate or module `futures_util` +error[E0599]: no method named `send` found for struct `WebSocketStream` in the current scope + --> src/main.rs:20:15 + | +do it +replace url with wss://snek.molodetz.nl/rpc.ws +do it +Failed to connect: Url(TlsFeatureNotEnabled) +do it +error: failed to select a version for `tokio-tungstenite`. + ... required by package `websocket_client v0.1.0 (/home/retoor/websocket_client)` +versions that meet the requirements `^0.17` (locked to 0.17.2) are: 0.17.2 +do it +error: failed to select a version for `tokio-tungstenite`. + ... required by package `websocket_client v0.1.0 (/home/retoor/websocket_client)` +versions that meet the requirements `^0.17` (locked to 0.17.2) are: 0.17.2 +the package `websocket_client` depends on `tokio-tungstenite`, with features: `tls` but `tokio-tungstenite` does not have these features. +do it +error: failed to select a version for `tokio-tungstenite`. + ... required by package `websocket_client v0.1.0 (/home/retoor/websocket_client)` +versions that meet the requirements `^0.15` are: 0.15.0 +the package `websocket_client` depends on `tokio-tungstenite`, with features: `tls` but `tokio-tungstenite` does not have these features. +failed to select a version for `tokio-tungstenite` which could resolve this conflict +do it +thread 'main' panicked at src/main.rs:13:55: +Failed to connect: Url(TlsFeatureNotEnabled) +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace +do it +do it +do it +do it +do it +thread 'main' panicked at src/main.rs:13:55: +Failed to connect: Url(TlsFeatureNotEnabled) +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace +do it +do it +do it +create a C# project that does the same things as the rust project you've just generated +do it +do it +do it +do it +do it +do it +do it +upgrade the project to dotnet 9.0 +do it +do it +Unhandled exception. System.PlatformNotSupportedException: Operation is not supported on this platform. + at System.Func`3.BeginInvoke(T1 arg1, T2 arg2, AsyncCallback callback, Object object) + at WebSocketSharp.WebSocket.send(Opcode opcode, Byte[] data, Action`1 completed) + at WebSocketSharp.WebSocket.Send(String data, Action`1 completed) + at WebSocketSharp.WebSocket.Send(String data) + at Program.Main(String[] args) in /home/retoor/WebSocketClient/Program.cs:line 23 +do it +do it +Make it listen for response message afterwards and display it. +do it +replace username with retoor and password with retoorded +do it +make it receive messages within a loon instead of once. +make run +If c application says 'core dumped' where is it dumped? +Why +do it +htop +Helping someone with his phone always comes with danger. +I just touched someones phone and his screen went black. +The guy was directly like 'What did you do?' omg. +asfafs +Haaah +index +index +r +r +index +index +investigate +investigate +investigate +investigate +ls *.cs +read file +Do you see any optimizations? +list *.c +list *.cs +read +read that file +what can be optimized? +Apply optimizations +make run +index +make it auto reconnecting after error / connection lost. +yes + make run +index +format Program.cs +yes +make linux +I think there were warnings. +yes +How doe a javascript sum +jinja number format 1000's dot +python number format +build project +yes +repair the build +ok +wait +investigate +do build but add 2>&1 +do it +yes +rlob * +make project +do it +yes +yes +yes +make -f build/Makefile 2>&1 +yes +yes +yes +minimal docker file that i can use to compile c++ programs with cmake +index +merge print_json_output into index_directory and make index_directory thus return a string +y +Remove MAX_EXTENSIONS. There must be better solution +y +read tools.h +Add a new tool named 'index_directory' with 'path' as parameter. +yes +read tools.h +Add a new tool named 'index_directory' with 'path' as parameter. +Update the original source with that source. +read tools.h +I want to add a new tool to tools.h +The function should be named index_director, description has to be "Index directory recursively and read all source files and list them.", parameters: path<string>,return list +yes +model +ls +bash: cannot set terminal process group (78989): Inappropriate ioctl for device python subprocess +This is source code:```import asyncio +import aiohttp +import aiohttp.web +import os +import pty +import shlex +import subprocess +import pathlib +class TerminalSession: + def __init__(self,command): + self.command = command + self.master, self.slave = pty.openpty() # Create pseudo-terminal + self.process = subprocess.Popen( + shlex.split(self.command), + stdin=self.slave, + stdout=self.slave, + stderr=self.slave, + bufsize=0, + universal_newlines=True + ) + async def read_output(self, ws): + """Reads process output and sends it to WebSocket.""" + loop = asyncio.get_event_loop() + while True: + try: + data = await loop.run_in_executor(None, os.read, self.master, 1024) + if not data: + break + await ws.send_bytes(data) # Send raw bytes for ANSI support + except Exception: + break + async def write_input(self, data): + """Writes user input to the process.""" + os.write(self.master, data.encode()) +How to run alpine with storage limitations and so on +How to run alpine with storage limitations and so on +How to run alpine using docker run with limitations for storage and cpu limitation and memory limitation +What is runc +How to use runc +ERRO[0000] runc run failed: unable to start container process: error during container init: exec: "/bin/sh": stat /bin/sh: no such file or directory +ERRO[0000] runc run failed: unable to start container process: error during container init: exec: "/bin/sh": stat /bin/sh: no such file or directory + +rrun docker in docker docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?. +c readline clear +How to use clear in c readline library +How to create your own xmpp server in python +How to use slixmpp server python package +how to serve server with slixmpp +ImportError: cannot import name 'XMPPServer' from 'slixmpp' (/home/retoor/projects/xmpp/.venv/lib/python3.12/site-packages/slixmpp/__init__.py) +ImportError: cannot import name 'XMPPServer' from 'slixmpp' (/home/retoor/projects/xmpp/.venv/lib/python3.12/site-packages/slixmpp/__init__.py) +ImportError: cannot import name 'XMPPServer' from 'slixmpp' (/home/retoor/projects/xmpp/.venv/lib/python3.12/site-packages/slixmpp/__init__.py) +How to write xmpp server with other library +AttributeError: module 'aioxmpp' has no attribute 'ComponentXMPP' +get pwd +huh +get pwd using c +get pwd using c +load tools.h +cd projects/r +read tools.h +Show full implementation of the function getpwd in tools style. +What about integration +wat is current work directory? +wat is current work directory? +what is current work directory? +what is current work directory? +what is current work directory +what is current work directory +get current working directory. +get current working directory. +get current working directory. +init +init +init +init +init +init +test +test +tetest +tetest +test +what is current work directory +what is current work directory +ls +ls +ls +get pwd +cd .. +ls +what is current work directory? +init +review +hi +Do not be poile +hi +hhii +hi +hi +don't be polite +hi +hi +hi +hi +what functions are available? +what are their parameters? +hi +hi +hi +list +list files +. +index +review +calculate average grade. +ping google 5 times +How would a README.md of this prject look liek based on contents? +read main.c +continue +create a user manual for the clu user. +make a header file with sqlite3 functiolity. It must hsave db_set(key, value) and db_get(key) and db_query. The functions all must retoor json using the json-c libarty. +yes +read db_utils.h +Add the other functions i described. +save +read db_utils.h +add a db_utils.c file with tests +y +read db_utils.c and db_utils.h +add function for database initialization including creating table. +yes +read tools.h +generate function for db_set +read db_utils.h +generate function for db_set +the tool has to call the function db_set +show how the tool_descirption looks like +how does the caller of the tool look like? +now create a function for db_query +How does tool_description look like? +show the handler +make a tool_description for db_get +show the tool_function +how does the function handler look? +get value test +set test = ok +get value test +load https://molodetz.nl +save that data in databbase under the key "molo" +get key molo +index +set as key, value pairs in databas. Alle of them +add the file content too +Get all keys from database +get schema +get database schema +select all from database +ls +load schema from database +load everything from database +create table system_messages(message) +insert into system_messages("Be a hotti") +select all system messages; +evualte that as system command +evulate that sa system message +what are you? +are you a hotti? +select all from db +select sqlite schema +select sqlite schema +select sqlite schema +select all data +add some random data to it +select all data +select sqlite_schema +select all data from the tabe +get tthe content of molodetz.nl and store in database . +get tthe content of molodetz.nl and store in database . +select sqlite_schema +select all data from the tabe +get tthe content of molodetz.nl and store in database . +select sqlite_schema +select all data from the tabe +get tthe content of molodetz.nl and store in database . +get tthe content of molodetz.nl and store in database . +get tthe content of molodetz.nl and store in database . +get tthe content of molodetz.nl and store in database . +get tthe content of molodetz.nl and store in database . +get tthe content of molodetz.nl and store in database . +get tthe content of https://molodetz.nl and store in database . +the default kv_store one +select sqlite_schema; +select all data from that table. +review that code +read browse.h +read browse.h +makea browse.c with tests. +yes +read browse.h +read tools.h +show source code of a tool_description for function that maps the web_search_news? +read browse.h +read tools.h +how should tool_function code of web_search_news look like? +No, make it use the original function from the other file. +How should the handler look like? +no, the handler that calls tool_function +no, make it look as the other handlers. if-else +how to do urnencode in c curl +show usage of curl_easy_escape +search news about donald trumpo and melinia and elon +what is the summary? Include URL strings +search hacker news +select sqlite_schema +> dump all search results in key value store + dump all search values in there +more details as value please +create a sh script and store it in kv store: +``` +run shell_script that you can get from database. +ok diff --git a/Makefile b/Makefile index 6da7674..bbf61db 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ all: build build_rpylib run # Variables for compiler and flags CC = gcc -CFLAGS = -Ofast -Werror -Wall -lreadline -lncurses -lcurl -lssl -lcrypto -ljson-c -lm +CFLAGS = -Ofast -Werror -Wall -lreadline -lncurses -lcurl -lssl -lcrypto -ljson-c -lm -lsqlite3 # Targets build: @@ -14,4 +14,4 @@ build_rpylib: publish rpylib.so run: - ./r + ./r --verbose diff --git a/browse.c b/browse.c new file mode 100644 index 0000000..49f6f10 --- /dev/null +++ b/browse.c @@ -0,0 +1,15 @@ +#include "browse.h" + +int main() { + char *query = "example"; + char *result = get_news(query); + + if (result) { + printf("Result: %s\n", result); + free(result); // Free the allocated memory for the result + } else { + printf("Failed to fetch news.\n"); + } + + return 0; +} \ No newline at end of file diff --git a/browse.h b/browse.h new file mode 100644 index 0000000..51c9a96 --- /dev/null +++ b/browse.h @@ -0,0 +1,41 @@ +#include <string.h> +#include <stdio.h> +#include <stdlib.h> +#include <curl/curl.h> +#include <json-c/json.h> +#include <json-c/json_util.h> +#include "http_curl.h" + + +char * url_encode(char *s){ + return curl_easy_escape(NULL, s, 0); +} + +char * web_search_news(char * q){ + char * news = malloc(4096); + news[0] = 0; + char * q_encoded = url_encode(q); + sprintf(news, "https://search.molodetz.nl/search?q=%s&format=json&categories=news",q_encoded); + free(q_encoded); + char * ret = curl_get(news); + free(news); + json_object * json_ret = json_tokener_parse(ret); + + json_object * json_results = json_object_object_get(json_ret, "results"); + json_object * json_result = json_object_array_get_idx(json_results, 0); + if(!json_result){ + json_object_put(json_ret); + free(ret); + return web_search_news(q); + } + json_object_put(json_ret); + return ret; +} +char * web_search_engine(char * q){ + char * searx = malloc(4096); + searx[0] = 0; + sprintf(searx, "https://searx.molodetz.nl/search?q=%s&format=json", q); + char * ret = curl_get(searx); + free(searx); + return ret; +} diff --git a/cmd.sh b/cmd.sh new file mode 100644 index 0000000..615a3c1 --- /dev/null +++ b/cmd.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +echo "š Analyzing disk usage... Please wait." + +# 1. Show overall disk usage +echo -e "\nš Disk Usage Overview:" +df -h + +# 2. Show the largest directories in / +echo -e "\nš Top 10 Largest Directories in Root (/):" +du -ahx / 2>/dev/null | sort -rh | head -10 + +# 3. Show the largest directories in /home +echo -e "\nš Top 10 Largest Directories in /home:" +du -ahx /home 2>/dev/null | sort -rh | head -10 + +# 4. Show the largest files over 1GB +echo -e "\nš Top 10 Largest Files Over 1GB:" +find / -type f -size +1G -exec ls -lh {} + 2>/dev/null | sort -k5 -rh | head -10 + +# 5. Check system logs +echo -e "\nš Checking Large Log Files in /var/log:" +sudo du -sh /var/log/* 2>/dev/null | sort -rh | head -10 + +# 6. Find large installed packages (Debian-based) +if command -v dpkg-query &> /dev/null; then + echo -e "\nš¦ Top 10 Largest Installed Packages (Debian-based):" + dpkg-query -Wf '${Installed-Size}\t${Package}\n' | sort -rh | head -10 +fi + +# 7. Find large installed packages (RPM-based) +if command -v dnf &> /dev/null; then + echo -e "\nš¦ Top 10 Largest Installed Packages (Fedora-based):" + dnf list installed | awk '{print $2, $1}' | sort -rh | head -10 +fi + +echo -e "\nā Disk Usage Analysis Completed!" diff --git a/database.db b/database.db new file mode 100644 index 0000000..1c6819f Binary files /dev/null and b/database.db differ diff --git a/db_utils.c b/db_utils.c new file mode 100644 index 0000000..5ea21e1 --- /dev/null +++ b/db_utils.c @@ -0,0 +1,59 @@ +#include <stdio.h> +#include "db_utils.h" + +void db_initialize() { + sqlite3 *db; + char *err_msg = 0; + int rc = sqlite3_open("database.db", &db); + + if (rc != SQLITE_OK) { + return; + } + + const char *sql = "CREATE TABLE IF NOT EXISTS kv_store (key TEXT PRIMARY KEY, value TEXT);"; + rc = sqlite3_exec(db, sql, 0, 0, &err_msg); + + if (rc != SQLITE_OK) { + sqlite3_free(err_msg); + } + + sqlite3_close(db); +} + +void test_db_set() { + json_object *result = db_set("test_key", "test_value"); + if (result) { + printf("db_set: %s\n", json_object_get_string(result)); + json_object_put(result); + } else { + printf("db_set failed\n"); + } +} + +void test_db_get() { + json_object *result = db_get("test_key"); + if (result) { + printf("db_get: %s\n", json_object_to_json_string(result)); + json_object_put(result); + } else { + printf("db_get failed\n"); + } +} + +void test_db_query() { + json_object *result = db_query("SELECT * FROM kv_store"); + if (result) { + printf("db_query: %s\n", json_object_to_json_string(result)); + json_object_put(result); + } else { + printf("db_query failed\n"); + } +} + +int main() { + db_initialize(); + test_db_set(); + test_db_get(); + test_db_query(); + return 0; +} \ No newline at end of file diff --git a/db_utils.h b/db_utils.h new file mode 100644 index 0000000..f5544cf --- /dev/null +++ b/db_utils.h @@ -0,0 +1,141 @@ +#ifndef DB_UTILS_H +#define DB_UTILS_H + +#include <sqlite3.h> +#include <json-c/json.h> +#include "utils.h" + +const char * db_file = "~/.r.db"; + +char * db_file_expanded(){ + char * expanded = expand_home_directory(db_file); + static char result[4096]; + result[0] = 0; + strcpy(result, expanded); + free(expanded); + return result; +} + +void db_initialize(); +json_object * db_set(const char *key, const char *value); +json_object* db_get(const char *key); +json_object* db_query(const char *query); + + +void db_initialize() { + sqlite3 *db; + char *err_msg = 0; + int rc = sqlite3_open(db_file_expanded(), &db); + + if (rc != SQLITE_OK) { + return; + } + + const char *sql = "CREATE TABLE IF NOT EXISTS kv_store (key TEXT PRIMARY KEY, value TEXT);"; + rc = sqlite3_exec(db, sql, 0, 0, &err_msg); + + if (rc != SQLITE_OK) { + sqlite3_free(err_msg); + } + + sqlite3_close(db); +} + + +json_object * db_set(const char *key, const char *value) { + sqlite3 *db; + char *err_msg = 0; + int rc = sqlite3_open(db_file_expanded(), &db); + + if (rc != SQLITE_OK) { + return NULL; + } + + char *sql = sqlite3_mprintf("INSERT INTO kv_store (key, value) VALUES (%Q, %Q)", key, value); + rc = sqlite3_exec(db, sql, 0, 0, &err_msg); + sqlite3_free(sql); + + if (rc != SQLITE_OK) { + sqlite3_free(err_msg); + sqlite3_close(db); + return NULL; + } + + sqlite3_close(db); + return json_object_new_string("Success"); +} + +json_object* db_get(const char *key) { + sqlite3 *db; + sqlite3_stmt *stmt; + json_object *result = json_object_new_object(); + const char *value = NULL; + + int rc = sqlite3_open(db_file_expanded(), &db); + if (rc != SQLITE_OK) { + return NULL; + } + + const char *sql = "SELECT value FROM kv_store WHERE key = ?"; + sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); + sqlite3_bind_text(stmt, 1, key, -1, SQLITE_STATIC); + + if (sqlite3_step(stmt) == SQLITE_ROW) { + value = (const char *)sqlite3_column_text(stmt, 0); + } + + if (value) { + json_object_object_add(result, "value", json_object_new_string(value)); + } else { + json_object_object_add(result, "error", json_object_new_string("Key not found")); + } + + sqlite3_finalize(stmt); + sqlite3_close(db); + return result; +} +json_object* db_query(const char *query) { + sqlite3 *db; + sqlite3_stmt *stmt; + json_object *result = json_object_new_array(); + + int rc = sqlite3_open(db_file_expanded(), &db); + if (rc != SQLITE_OK) { + return NULL; + } + + sqlite3_prepare_v2(db, query, -1, &stmt, NULL); + while (sqlite3_step(stmt) == SQLITE_ROW) { + json_object *row = json_object_new_object(); + for (int i = 0; i < sqlite3_column_count(stmt); i++) { + const char *col_name = sqlite3_column_name(stmt, i); + switch (sqlite3_column_type(stmt, i)) { + case SQLITE_INTEGER: + json_object_object_add(row, col_name, json_object_new_int64(sqlite3_column_int64(stmt, i))); + break; + case SQLITE_FLOAT: + json_object_object_add(row, col_name, json_object_new_double(sqlite3_column_double(stmt, i))); + break; + case SQLITE_TEXT: + json_object_object_add(row, col_name, json_object_new_string((const char *)sqlite3_column_text(stmt, i))); + break; + case SQLITE_BLOB: + json_object_object_add(row, col_name, json_object_new_string_len((const char *)sqlite3_column_blob(stmt, i), sqlite3_column_bytes(stmt, i))); + break; + case SQLITE_NULL: + default: + json_object_object_add(row, col_name, json_object_new_string("NULL")); + break; + } + } + json_object_array_add(result, row); + } + + sqlite3_finalize(stmt); + sqlite3_close(db); + + return result; +} + + +#endif // DB_UTILS_H diff --git a/indexer.h b/indexer.h new file mode 100644 index 0000000..ff8324c --- /dev/null +++ b/indexer.h @@ -0,0 +1,133 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <dirent.h> +#include <sys/stat.h> +#include <time.h> +#include <json-c/json.h> +#include <limits.h> +#include <unistd.h> +#define MAX_FILES 20000 +#define MAX_PATH 4096 + +static const char *extensions[] = {".c", ".cpp", ".h", ".py", ".java", ".js", ".mk", ".html", "Makefile", ".css", ".json", ".cs", ".csproj", ".sln", ".toml",".rs"}; +static size_t ext_count = sizeof(extensions) / sizeof(extensions[0]); // Updated count to reflect the new number of extensions + + + +typedef struct { + char name[MAX_PATH]; + char modification_date[20]; + char creation_date[20]; + char type[10]; + size_t size_bytes; +} FileInfo; + +FileInfo file_list[MAX_FILES]; +size_t file_count = 0; + +int is_valid_extension(const char *filename, const char *extensions[], size_t ext_count) { + const char *dot = strrchr(filename, '.'); + if(!dot){ + dot = filename; +} + for (size_t i = 0; i < ext_count; i++) { + if (strcmp(dot, extensions[i]) == 0) { + return 1; + } + } + return 0; +} + +int is_ignored_directory(const char *dir_name) { + const char *ignored_dirs[] = {"env", ".venv", "node_modules", "venv", "virtualenv"}; + for (size_t i = 0; i < sizeof(ignored_dirs) / sizeof(ignored_dirs[0]); i++) { + if (strcmp(dir_name, ignored_dirs[i]) == 0) { + return 1; + } + } + return 0; +} + +void get_file_info(const char *path) { + struct stat file_stat; + if (stat(path, &file_stat) == 0) { + FileInfo info; + strncpy(info.name, path, MAX_PATH - 1); // Copy with one less to leave space for null terminator + info.name[MAX_PATH - 1] = '\0'; // Ensure null termination + strftime(info.modification_date, sizeof(info.modification_date), "%Y-%m-%d %H:%M:%S", localtime(&file_stat.st_mtime)); + strftime(info.creation_date, sizeof(info.creation_date), "%Y-%m-%d %H:%M:%S", localtime(&file_stat.st_ctime)); + strncpy(info.type, S_ISDIR(file_stat.st_mode) ? "directory" : "file", 10); + info.type[9] = '\0'; // Ensure null termination + info.size_bytes = file_stat.st_size; + file_list[file_count++] = info; + } +} + +char* index_directory(const char *dir_path) { + DIR *dir = opendir(dir_path); + struct dirent *entry; + if (dir == NULL) { + perror("Failed to open directory"); + return NULL; + } + + json_object *jarray = json_object_new_array(); + + while ((entry = readdir(dir)) != NULL) { + if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0) { + if (entry->d_name[0] == '.' || is_ignored_directory(entry->d_name)) { + continue; + } + char full_path[MAX_PATH]; + snprintf(full_path, sizeof(full_path), "%s/%s", dir_path, entry->d_name); + if (entry->d_type == DT_DIR) { + char *subdir_json = index_directory(full_path); + if (subdir_json) { + json_object *jsubdir = json_object_new_string(subdir_json); + json_object_array_add(jarray, jsubdir); + free(subdir_json); + } + } else if (is_valid_extension(entry->d_name, extensions, ext_count)) { + get_file_info(full_path); + json_object *jfile = json_object_new_object(); + json_object_object_add(jfile, "file_name", json_object_new_string(file_list[file_count - 1].name)); + json_object_object_add(jfile, "modification_date", json_object_new_string(file_list[file_count - 1].modification_date)); + json_object_object_add(jfile, "creation_date", json_object_new_string(file_list[file_count - 1].creation_date)); + json_object_object_add(jfile, "type", json_object_new_string(file_list[file_count - 1].type)); + json_object_object_add(jfile, "size_bytes", json_object_new_int64(file_list[file_count - 1].size_bytes)); + + // Read the file contents + FILE *fp = fopen(file_list[file_count - 1].name, "r"); + if (fp != NULL) { + fseek(fp, 0, SEEK_END); + long length = ftell(fp); + fseek(fp, 0, SEEK_SET); + char *content = malloc(length + 1); + if (content) { + size_t bytesRead = fread(content, 1, length, fp); + if (bytesRead != length) { + free(content); + content = NULL; + json_object_object_add(jfile, "file_current_content_data", json_object_new_string("Error reading file")); + } else { + content[length] = '\0'; // Null-terminate the string + json_object_object_add(jfile, "file_current_content_data", json_object_new_string(content)); + } + free(content); + } + fclose(fp); + } else { + json_object_object_add(jfile, "content", json_object_new_string("Unable to read file")); + } + + json_object_array_add(jarray, jfile); + } + } + } + closedir(dir); + + char *result = strdup(json_object_to_json_string(jarray)); + json_object_put(jarray); + return result; +} diff --git a/main.c b/main.c index 5a6d581..a1e3de7 100644 --- a/main.c +++ b/main.c @@ -44,6 +44,8 @@ #include <string.h> #include <unistd.h> #include "utils.h" +#include "r.h" +#include "db_utils.h" volatile sig_atomic_t sigint_count = 0; time_t first_sigint_time = 0; @@ -76,7 +78,11 @@ char *get_prompt_from_args(int c, char **argv) { if (!strcmp(argv[i],"--stdin")){ fprintf(stderr, "%s\n", "Reading from stdin."); get_from_std_in = true; - }else if(!strcmp(argv[i],"--py")){ + }else if(!strcmp(argv[i],"--verbose")){ + is_verbose = true; + } + + else if(!strcmp(argv[i],"--py")){ if(i+1 <= c){ char * py_file_path = expand_home_directory(argv[i+1]); fprintf(stderr, "Including \"%s\".\n", py_file_path); @@ -334,7 +340,7 @@ void handle_sigint(int sig) { int main(int argc, char *argv[]) { signal(SIGINT, handle_sigint); - + db_initialize(); init(); if (try_prompt(argc, argv)) return 0; diff --git a/openai.h b/openai.h index 1246425..f944df9 100644 --- a/openai.h +++ b/openai.h @@ -54,14 +54,23 @@ struct json_object* openai_process_chat_message(const char* api_url, const char* } struct json_object *error_object; if (json_object_object_get_ex(parsed_json, "error", &error_object)) { - json_object_put(parsed_json); + char *all_messages = (char *)json_object_to_json_string(message_array); + + + fprintf(stderr, "Messages: "); fwrite(all_messages, strlen(all_messages), 1, stderr); fprintf(stderr, "\n"); free(all_messages); + + fprintf(stderr,"%s\n",json_object_to_json_string(parsed_json)); + + json_object_put(parsed_json); messages_remove_last(); + messages_remove_last(); + return NULL; } diff --git a/r.h b/r.h new file mode 100644 index 0000000..93cc28c --- /dev/null +++ b/r.h @@ -0,0 +1,8 @@ +#ifndef R_H +#define R_H +#include <stdbool.h> + +bool is_verbose = false; + + +#endif diff --git a/rpylib.so b/rpylib.so new file mode 100755 index 0000000..3fe6a56 Binary files /dev/null and b/rpylib.so differ diff --git a/script.sh b/script.sh new file mode 100644 index 0000000..c839978 --- /dev/null +++ b/script.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +echo "This is a sample shell script." +echo "Running some commands..." + +# Add your commands below + +# Example command +ls -la diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..e5bfaf7 --- /dev/null +++ b/setup.py @@ -0,0 +1,10 @@ +from setuptools import setup, Extension + +module = Extension("rpylib", sources=["rpylib.c"]) + +setup( + name="rpylib", + version="1.0", + description="AI Module", + ext_modules=[module], +) diff --git a/tools.h b/tools.h index b7c9012..99f249e 100644 --- a/tools.h +++ b/tools.h @@ -26,6 +26,9 @@ #include <string.h> #include "indexer.h" +#include "db_utils.h" +#include "r.h" +#include "browse.h" struct json_object* tool_description_http_get(); struct json_object* tool_description_linux_terminal(); @@ -35,6 +38,12 @@ 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* tool_description_chdir(); +struct json_object* tool_description_getpwd(); +struct json_object* tool_description_db_set(); +struct json_object* tool_description_db_query(); +struct json_object* tool_description_db_get(); +struct json_object* tool_description_web_search_news(); struct json_object* tools_descriptions() { struct json_object* root = json_object_new_array(); @@ -46,16 +55,228 @@ struct json_object* tools_descriptions() { 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()); + json_object_array_add(root,tool_description_chdir()); + json_object_array_add(root,tool_description_getpwd()); + json_object_array_add(root,tool_description_db_set()); + json_object_array_add(root, tool_description_db_query()); + json_object_array_add(root, tool_description_db_get()); + json_object_array_add(root, tool_description_web_search_news()); return root; } +char* tool_function_web_search_news(char* query) { + if (query == NULL) { + return strdup("Query cannot be NULL."); + } + + char* result = web_search_news(query); + if (result == NULL) { + return strdup("Failed to fetch news."); + } + + return result; +} + + +struct json_object* tool_description_web_search_news() { + 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("web_search_news")); + json_object_object_add(function, "description", json_object_new_string("Searches for news articles based on a query.")); + + 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* query = json_object_new_object(); + json_object_object_add(query, "type", json_object_new_string("string")); + json_object_object_add(query, "description", json_object_new_string("The url encoded query string to search for news articles.")); + json_object_object_add(properties, "query", query); + + json_object_object_add(parameters, "properties", properties); + + struct json_object* required = json_object_new_array(); + json_object_array_add(required, json_object_new_string("query")); + 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; +} + + +char* tool_function_db_get(char* key) { + json_object* result = db_get(key); + if (result == NULL) { + return strdup("Failed to retrieve value from the database."); + } + + char* response = strdup(json_object_to_json_string(result)); + json_object_put(result); // Free the json_object + return response; +} + + + + +struct json_object* tool_description_db_get() { + 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("db_get")); + json_object_object_add(function, "description", json_object_new_string("Retrieves a value from the database for a given key.")); + + 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* key = json_object_new_object(); + json_object_object_add(key, "type", json_object_new_string("string")); + json_object_object_add(key, "description", json_object_new_string("The key to retrieve from the database.")); + json_object_object_add(properties, "key", key); + + json_object_object_add(parameters, "properties", properties); + + struct json_object* required = json_object_new_array(); + json_object_array_add(required, json_object_new_string("key")); + 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; +} + + +char* tool_function_db_query(char* query) { + json_object* result = db_query(query); + if (result == NULL) { + return strdup("Failed to execute query on the database."); + } + + char* response = strdup(json_object_to_json_string(result)); + + + json_object_put(result); // Free the json_object + return response; +} +struct json_object* tool_description_db_query() { + 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("db_query")); + json_object_object_add(function, "description", json_object_new_string("Executes a query on the database and returns the results.")); + + 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* query = json_object_new_object(); + json_object_object_add(query, "type", json_object_new_string("string")); + json_object_object_add(query, "description", json_object_new_string("The SQL query to execute.")); + json_object_object_add(properties, "query", query); + + json_object_object_add(parameters, "properties", properties); + + struct json_object* required = json_object_new_array(); + json_object_array_add(required, json_object_new_string("query")); + 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; +} + + + +char* tool_function_db_set(char* key, char* value) { + json_object* result = db_set(key, value); + if (result == NULL) { + return strdup("Failed to set value in the database."); + } + + const char* response = json_object_get_string(result); + json_object_put(result); // Free the json_object + return strdup(response); +} +struct json_object* tool_description_db_set() { + 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("db_set")); + json_object_object_add(function, "description", json_object_new_string("Sets a value in the database for a given key.")); + + 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* key = json_object_new_object(); + json_object_object_add(key, "type", json_object_new_string("string")); + json_object_object_add(key, "description", json_object_new_string("The key to set in the database.")); + json_object_object_add(properties, "key", key); + + struct json_object* value = json_object_new_object(); + json_object_object_add(value, "type", json_object_new_string("string")); + json_object_object_add(value, "description", json_object_new_string("The value to set for the given key.")); + json_object_object_add(properties, "value", value); + + json_object_object_add(parameters, "properties", properties); + + struct json_object* required = json_object_new_array(); + json_object_array_add(required, json_object_new_string("key")); + json_object_array_add(required, json_object_new_string("value")); + 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; +} + + + char* tool_function_http_get(char* url) { - fprintf(stderr, "Tool http_get: %s\n", url); return curl_get(url); } +char* tool_function_chdir(char* path) { + if (chdir(path) != 0) { + perror("chdir failed"); + return strdup("Failed to change directory!"); + } + + return strdup("Directory successfully changed."); +} + + + char* tool_function_linux_terminal(char* command) { - fprintf(stderr, "Tool linux_terminal: %s\n", command); FILE* fp; char buffer[1024]; size_t total_size = 0; @@ -77,7 +298,8 @@ char* tool_function_linux_terminal(char* command) { return strdup("Failed to allocate memory!"); } output = new_output; - printf("%s", output); + if(is_verbose) + fprintf(stderr, "%s", buffer); strcpy(output + total_size, buffer); total_size += chunk_size; } @@ -87,8 +309,6 @@ char* tool_function_linux_terminal(char* command) { } char* tool_function_linux_terminal_interactive(char* command) { - fprintf(stderr, "Tool linux_terminal_interactive: %s\n", command); - int result_code = system(command); char* result = malloc(100); @@ -98,6 +318,77 @@ char* tool_function_linux_terminal_interactive(char* command) { return result; } +char* tool_function_getpwd() { + char* cwd = (char*)malloc(PATH_MAX); + if (cwd == NULL) { + perror("Memory allocation failed"); + return strdup("Failed to allocate memory for current working directory!"); + } + + if (getcwd(cwd, PATH_MAX) == NULL) { + free(cwd); + perror("getcwd failed"); + return strdup("Failed to get current working directory!"); + } + + return cwd; +} + +struct json_object* tool_description_getpwd() { + 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("getpwd")); + json_object_object_add(function, "description", json_object_new_string("Returns the current working directory as a string.")); + + struct json_object* parameters = json_object_new_object(); + json_object_object_add(parameters, "type", json_object_new_string("object")); + + + + json_object_object_add(function, "parameters", json_object_new_null()); + + json_object_object_add(root, "function", function); + + return root; +} + +struct json_object* tool_description_chdir() { + 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("chdir")); + json_object_object_add(function, "description", json_object_new_string("Changes the current working directory to the specified path. Call this function when `cd` is prompted.")); + + 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 change the current working directory to.")); + 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_index_source_directory() { struct json_object* root = json_object_new_object(); json_object_object_add(root, "type", json_object_new_string("function")); @@ -273,14 +564,12 @@ struct json_object* tool_description_write_file() { } 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); - fprintf(stderr, "Tools read_file: %s\n", expanded_path); FILE* fp = fopen(expanded_path, "r"); free(expanded_path); @@ -308,7 +597,6 @@ char* tool_function_read_file(char* path) { } char* tool_function_write_file(char* path, char* content) { - fprintf(stderr, "Tools write_file with %zu bytes: %s\n", strlen(content), path); FILE* fp = fopen(path, "w"); if (fp == NULL) { perror("fopen failed"); @@ -418,7 +706,6 @@ void recursive_glob(const char* pattern, glob_t* results) { } char* tool_function_directory_rglob(char* target_dir) { - fprintf(stderr, "Tools directory_rglob: %s\n", target_dir); glob_t results; results.gl_pathc = 0; struct stat file_stat; @@ -458,7 +745,6 @@ char* tool_function_directory_rglob(char* target_dir) { } char* tool_function_directory_glob(char* target_dir) { - fprintf(stderr, "Tools directory_glob: %s\n", target_dir); glob_t results; struct stat file_stat; char mod_time[20], create_time[20]; @@ -629,6 +915,14 @@ struct json_object* tools_execute(struct json_object* tools_array) { char* function_name = NULL; if (json_object_object_get_ex(function_obj, "name", &name_obj)) { function_name = (char*)json_object_get_string(name_obj); + 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)); + + if(is_verbose) + fprintf(stderr, "Executing function %s with arguments %s\n", function_name, json_object_to_json_string(arguments)); + } + } if (!strcmp(function_name, "linux_terminal_execute")) { @@ -655,7 +949,19 @@ struct json_object* tools_execute(struct json_object* tools_array) { free(terminal_result); } } - } else if (!strcmp(function_name, "directory_glob")) { + }else if (!strcmp(function_name, "chdir")) { + 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* chdir_result = tool_function_chdir(path); + json_object_object_add(tool_result, "content", json_object_new_string(chdir_result)); + free(chdir_result); + } + } +} else if (!strcmp(function_name, "directory_glob")) { 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)); @@ -709,7 +1015,38 @@ struct json_object* tools_execute(struct json_object* tools_array) { free(write_result); } } - } else if (!strcmp(function_name, "index_source_directory")) { + }else if (!strcmp(function_name, "db_query")) { + 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* query_obj; + + if (json_object_object_get_ex(arguments, "query", &query_obj)) { + char* query = (char*)json_object_get_string(query_obj); + char * db_query_result = tool_function_db_query(query); + json_object_object_add(tool_result, "content", json_object_new_string( db_query_result));; + if(db_query_result != NULL) + free(db_query_result); + } + } +} else if (!strcmp(function_name, "db_set")) { + 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* key_obj; + struct json_object* value_obj; + + if (json_object_object_get_ex(arguments, "key", &key_obj) && + json_object_object_get_ex(arguments, "value", &value_obj)) { + char* key = (char*)json_object_get_string(key_obj); + char* value = (char*)json_object_get_string(value_obj); + char* db_set_result = tool_function_db_set(key, value); + json_object_object_add(tool_result, "content", json_object_new_string(db_set_result)); + free(db_set_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)); @@ -721,7 +1058,37 @@ struct json_object* tools_execute(struct json_object* tools_array) { free(listing_result); } } - } else if (!strcmp(function_name, "directory_rglob")) { + }else if (!strcmp(function_name, "web_search_news")){ + 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* query_obj; + if (json_object_object_get_ex(arguments, "query", &query_obj)) { + char* query = (char*)json_object_get_string(query_obj); + char* news_result = tool_function_web_search_news(query); + json_object_object_add(tool_result, "content", json_object_new_string(news_result)); + free(news_result); + } + } + }else if (!strcmp(function_name, "db_get")) { + 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* key_obj; + + if (json_object_object_get_ex(arguments, "key", &key_obj)) { + char* key = (char*)json_object_get_string(key_obj); + char* db_get_result = tool_function_db_get(key); + json_object_object_add(tool_result, "content", json_object_new_string(db_get_result)); + free(db_get_result); + } + } +}else if (!strcmp(function_name, "getpwd")) { + char* pwd_result = tool_function_getpwd(); + json_object_object_add(tool_result, "content", json_object_new_string(pwd_result)); + free(pwd_result); + } + else if (!strcmp(function_name, "directory_rglob")) { 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));