// Strumenti di programmazione: Neuronal legge, scrive ed esegue codice dentro la cartella di lavoro.
// Il modello li chiama nel formato che conosce: {"name": ..., "arguments": {...}}.
#pragma once
#include
#include
typedef struct {
char name[48];
char *args; // oggetto JSON degli argomenti (malloc)
bool bad; // JSON illeggibile: si risponde con l'errore
} ToolCall;
// dir: cartella di lavoro (creata se manca). Tutti i percorsi degli strumenti sono relativi a questa.
void tools_init(const char *dir);
void tools_log_path(const char *path); // dove registrare le chiamate (nella cartella dello stato)
const char *tools_workspace(void); // percorso assoluto
// Istruzioni e firme degli strumenti da aggiungere al prompt di sistema.
const char *tools_prompt(void);
// Chiamate presenti nel testo (fino a max). Ritorna quante; ogni args va liberato con tools_free.
int tools_parse(const char *text, ToolCall *out, int max);
void tools_free(ToolCall *c, int n);
// Esegue una chiamata. Ritorna il risultato per il modello (malloc); ok = riuscita.
char *tools_run(const ToolCall *c, bool *ok);
// Istruzioni per strumenti di programmazione (code) più altri definiti dal chiamante. Da liberare.
char *tools_prompt_build(bool code, const char *intro, const char *funcs);
// File binario della cartella di lavoro, per intero (malloc). NULL con err se manca o supera max byte.
unsigned char *tools_read_binary(const char *rel, size_t max, size_t *len, const char **err, char *clean, size_t clean_cap);
// Scrive un file (anche binario) nella cartella di lavoro. false con err se il percorso non vale o la scrittura fallisce.
bool tools_write_binary(const char *rel, const void *data, size_t n, const char **err);
// Internet: tools_web_init va chiamata all'avvio (cerca mind/web_tool.py e Python a partire dalla cartella corrente).
void tools_web_init(void);
bool tools_web_available(void);
// op "cerca" (arg = domanda, extra = numero di risultati) o "leggi" (arg = indirizzo, extra = caratteri). Da liberare.
char *tools_web(const char *op, const char *arg, int extra, bool *ok);