angelo-programmer 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/angelo.js +17 -0
- package/core/Angelo.py +232 -0
- package/package.json +12 -0
package/bin/angelo.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const { spawn } = require('child_process');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
|
|
6
|
+
// Aponta para onde está o seu Python, dentro da pasta 'core'
|
|
7
|
+
const pythonScript = path.join(__dirname, '..', 'core', 'Angelo.py');
|
|
8
|
+
|
|
9
|
+
// Executa o comando python chamando o script
|
|
10
|
+
const child = spawn('python', [pythonScript], {
|
|
11
|
+
stdio: 'inherit', // Isso faz o terminal do usuário interagir com o seu Python
|
|
12
|
+
shell: true
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
child.on('close', (code) => {
|
|
16
|
+
process.exit(code);
|
|
17
|
+
});
|
package/core/Angelo.py
ADDED
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import sys
|
|
3
|
+
|
|
4
|
+
# --- Verificação de Dependências ---
|
|
5
|
+
try:
|
|
6
|
+
import requests
|
|
7
|
+
# Silencia os avisos amarelos de InsecureRequestWarning
|
|
8
|
+
requests.packages.urllib3.disable_warnings()
|
|
9
|
+
except ImportError:
|
|
10
|
+
print("O Angelo não pode ser executado pois faltam as seguintes bibliotecas")
|
|
11
|
+
print("requests")
|
|
12
|
+
print("Como instalar:")
|
|
13
|
+
print("1- Abra um terminal qualquer (Terminal ou powershell)")
|
|
14
|
+
print("2- Digite \"pip install requests\"")
|
|
15
|
+
print("3- Ele vai mostrar um montes de barras e vai encher de mensagens, mais é só o procedimento")
|
|
16
|
+
print("4- Após a biblioteca ser instalada, o Angelo pode rodar certinho")
|
|
17
|
+
sys.exit()
|
|
18
|
+
|
|
19
|
+
# --- Configuração de Memória ---
|
|
20
|
+
def obter_caminho_memoria():
|
|
21
|
+
# Cria pasta .angelo no diretório home do usuário para ser compatível com futuros installs
|
|
22
|
+
home_dir = os.path.expanduser("~")
|
|
23
|
+
pasta_angelo = os.path.join(home_dir, ".angelo")
|
|
24
|
+
pasta_memory = os.path.join(pasta_angelo, "memory")
|
|
25
|
+
|
|
26
|
+
if not os.path.exists(pasta_memory):
|
|
27
|
+
os.makedirs(pasta_memory, exist_ok=True)
|
|
28
|
+
return pasta_memory
|
|
29
|
+
|
|
30
|
+
# --- Funções do Angelo ---
|
|
31
|
+
|
|
32
|
+
def limpar_tela():
|
|
33
|
+
os.system('cls' if os.name == 'nt' else 'clear')
|
|
34
|
+
|
|
35
|
+
def verificar_permissao():
|
|
36
|
+
limpar_tela()
|
|
37
|
+
print("==================================================")
|
|
38
|
+
print(" Você permite que o Angelo acesse todas as pastas")
|
|
39
|
+
print(" e arquivos nesta sessão? (s/n)")
|
|
40
|
+
print("==================================================")
|
|
41
|
+
|
|
42
|
+
resposta = input("> ").strip().lower()
|
|
43
|
+
if resposta == 's':
|
|
44
|
+
return True
|
|
45
|
+
else:
|
|
46
|
+
print("\nAcesso negado. O Angelo Programmer não pode ser iniciado.")
|
|
47
|
+
sys.exit()
|
|
48
|
+
|
|
49
|
+
def executar_comando_sistema(comando_ia):
|
|
50
|
+
print("\n\033[93m[Angelo detectou uma ação do sistema]\033[0m")
|
|
51
|
+
print(f"Comando a ser executado: {comando_ia}")
|
|
52
|
+
confirmar = input("Aceitar execução? (s/n): ").strip().lower()
|
|
53
|
+
|
|
54
|
+
if confirmar == 's':
|
|
55
|
+
try:
|
|
56
|
+
os.system(comando_ia)
|
|
57
|
+
except Exception as e:
|
|
58
|
+
print(f"Erro ao executar comando: {e}")
|
|
59
|
+
else:
|
|
60
|
+
print("Execução cancelada pelo usuário.")
|
|
61
|
+
|
|
62
|
+
def chamar_ia(historico, mensagem_usuario):
|
|
63
|
+
contexto_sistema = (
|
|
64
|
+
"Você é o Angelo Programmer, uma IA de terminal especializada em programação e automação de sistemas. "
|
|
65
|
+
"Você ajuda o usuário a gerenciar o computador e criar códigos. "
|
|
66
|
+
"Se você sugerir um comando de terminal para o usuário executar, adicione na última linha do seu texto "
|
|
67
|
+
"a tag exata [CMD] seguida pelo comando de terminal do Windows. Fale sempre em português do Brasil de forma direta."
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
historico_curto = historico[-3:] if len(historico) > 3 else historico
|
|
71
|
+
|
|
72
|
+
prompt_final = f"Diretriz: {contexto_sistema}\n\n"
|
|
73
|
+
for msg in historico_curto:
|
|
74
|
+
role_nome = "Usuário" if msg["role"] == "user" else "Angelo"
|
|
75
|
+
prompt_final += f"{role_nome}: {msg['content']}\n"
|
|
76
|
+
prompt_final += f"Usuário: {mensagem_usuario}\nAngelo:"
|
|
77
|
+
|
|
78
|
+
url = "https://text.pollinations.ai/"
|
|
79
|
+
payload = {
|
|
80
|
+
"messages": [{"role": "user", "content": prompt_final}],
|
|
81
|
+
"jsonMode": False
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
try:
|
|
85
|
+
print("\nAngelo: ", end="", flush=True)
|
|
86
|
+
resposta = requests.post(url, json=payload, timeout=60, verify=False)
|
|
87
|
+
|
|
88
|
+
if resposta.status_code == 200 and resposta.text.strip():
|
|
89
|
+
texto_gerado = resposta.text.strip()
|
|
90
|
+
print(texto_gerado)
|
|
91
|
+
print("\n")
|
|
92
|
+
return texto_gerado
|
|
93
|
+
else:
|
|
94
|
+
print("O servidor de IA falhou ao processar. Tentando novamente...")
|
|
95
|
+
return None
|
|
96
|
+
|
|
97
|
+
except Exception as e:
|
|
98
|
+
print(f"\n[Erro de Rede]: Conexão instável ou demorou demais. ({e})\n")
|
|
99
|
+
return None
|
|
100
|
+
|
|
101
|
+
def salvar_conversa_na_pasta(num_conversa, historico):
|
|
102
|
+
pasta_memory = obter_caminho_memoria()
|
|
103
|
+
nome_arquivo = f"Conversa{num_conversa}.txt"
|
|
104
|
+
try:
|
|
105
|
+
with open(os.path.join(pasta_memory, nome_arquivo), "w", encoding="utf-8") as f:
|
|
106
|
+
for msg in historico:
|
|
107
|
+
role = "Usuário" if msg["role"] == "user" else "Angelo"
|
|
108
|
+
f.write(f"{role}: {msg['content']}\n")
|
|
109
|
+
except Exception as e:
|
|
110
|
+
print(f"[Erro ao auto-salvar histórico]: {e}")
|
|
111
|
+
|
|
112
|
+
def carregar_memoria(num_conversa):
|
|
113
|
+
pasta_memory = obter_caminho_memoria()
|
|
114
|
+
nome_arquivo = f"Conversa{num_conversa}.txt"
|
|
115
|
+
caminho_completo = os.path.join(pasta_memory, nome_arquivo)
|
|
116
|
+
|
|
117
|
+
if not os.path.exists(caminho_completo):
|
|
118
|
+
print(f"\n[Erro de Memória]: O arquivo '{caminho_completo}' não foi encontrado!")
|
|
119
|
+
return None
|
|
120
|
+
|
|
121
|
+
try:
|
|
122
|
+
novo_historico = []
|
|
123
|
+
with open(caminho_completo, "r", encoding="utf-8") as f:
|
|
124
|
+
linhas = f.readlines()
|
|
125
|
+
|
|
126
|
+
for linha in linhas:
|
|
127
|
+
if linha.startswith("Usuário:"):
|
|
128
|
+
conteudo = linha.replace("Usuário:", "").strip()
|
|
129
|
+
novo_historico.append({"role": "user", "content": conteudo})
|
|
130
|
+
elif linha.startswith("Angelo:"):
|
|
131
|
+
conteudo = linha.replace("Angelo:", "").strip()
|
|
132
|
+
novo_historico.append({"role": "assistant", "content": conteudo})
|
|
133
|
+
|
|
134
|
+
print(f"\n[Memória Carregada]: {len(novo_historico)} mensagens recuperadas de '{nome_arquivo}'!")
|
|
135
|
+
return novo_historico
|
|
136
|
+
except Exception as e:
|
|
137
|
+
print(f"\n[Erro ao ler arquivo]: {e}")
|
|
138
|
+
return None
|
|
139
|
+
|
|
140
|
+
def listar_memorias():
|
|
141
|
+
pasta_memory = obter_caminho_memoria()
|
|
142
|
+
lista_arquivos = [f for f in os.listdir(pasta_memory) if f.startswith("Conversa") and f.endswith(".txt")]
|
|
143
|
+
|
|
144
|
+
if not lista_arquivos:
|
|
145
|
+
print("\n[Aviso]: Nenhuma conversa antiga encontrada na pasta 'memory/'.")
|
|
146
|
+
return
|
|
147
|
+
|
|
148
|
+
print("\n================ CONVERSAS SALVAS ================")
|
|
149
|
+
for arquivo in lista_arquivos:
|
|
150
|
+
print(f" - {arquivo}")
|
|
151
|
+
print("==================================================\n")
|
|
152
|
+
|
|
153
|
+
def mostrar_help():
|
|
154
|
+
print("\n=================== AJUDA ANGELO ===================")
|
|
155
|
+
print("Como mexer no Angelo Programmer:")
|
|
156
|
+
print("1. Peça tarefas em texto puro. Ex: 'Crie uma pasta chamada projeto'")
|
|
157
|
+
print("2. Comandos especiais:")
|
|
158
|
+
print(" /Remember [número] -> Carrega uma conversa salva da pasta memory.")
|
|
159
|
+
print(" /Remember -> Lista todas as conversas salvas.")
|
|
160
|
+
print(" /help -> Mostra este menu de ajuda.")
|
|
161
|
+
print(" /clear -> Limpa a tela do terminal.")
|
|
162
|
+
print(" /exit -> Fecha o Angelo Programmer.")
|
|
163
|
+
print("====================================================\n")
|
|
164
|
+
|
|
165
|
+
def main():
|
|
166
|
+
try:
|
|
167
|
+
verificar_permissao()
|
|
168
|
+
|
|
169
|
+
historico_conversa = []
|
|
170
|
+
id_conversa_atual = "1"
|
|
171
|
+
|
|
172
|
+
limpar_tela()
|
|
173
|
+
print("ANGELO PROGRAMMER")
|
|
174
|
+
print("Digite /help para ele te ensinar a como mexer\n")
|
|
175
|
+
|
|
176
|
+
while True:
|
|
177
|
+
print("=====================================")
|
|
178
|
+
print("Digite o que quer que ele faça...")
|
|
179
|
+
print("=====================================")
|
|
180
|
+
|
|
181
|
+
entrada = input("> ").strip()
|
|
182
|
+
|
|
183
|
+
if not entrada:
|
|
184
|
+
continue
|
|
185
|
+
|
|
186
|
+
if entrada.lower().startswith('/remember'):
|
|
187
|
+
partes = entrada.split()
|
|
188
|
+
if len(partes) > 1:
|
|
189
|
+
num_conversa = partes[1]
|
|
190
|
+
historico_recuperado = carregar_memoria(num_conversa)
|
|
191
|
+
if historico_recuperado is not None:
|
|
192
|
+
historico_conversa = historico_recuperado
|
|
193
|
+
id_conversa_atual = num_conversa
|
|
194
|
+
else:
|
|
195
|
+
listar_memorias()
|
|
196
|
+
continue
|
|
197
|
+
|
|
198
|
+
if entrada == '/exit':
|
|
199
|
+
print("Encerrando o Angelo Programmer. Até mais!")
|
|
200
|
+
break
|
|
201
|
+
elif entrada == '/help':
|
|
202
|
+
mostrar_help()
|
|
203
|
+
continue
|
|
204
|
+
elif entrada == '/clear':
|
|
205
|
+
limpar_tela()
|
|
206
|
+
print("ANGELO PROGRAMMER")
|
|
207
|
+
print("Digite /help para ele te ensinar a como mexer\n")
|
|
208
|
+
continue
|
|
209
|
+
|
|
210
|
+
historico_conversa.append({"role": "user", "content": entrada})
|
|
211
|
+
salvar_conversa_na_pasta(id_conversa_atual, historico_conversa)
|
|
212
|
+
|
|
213
|
+
resposta_ia = chamar_ia(historico_conversa, entrada)
|
|
214
|
+
|
|
215
|
+
if resposta_ia:
|
|
216
|
+
historico_conversa.append({"role": "assistant", "content": resposta_ia})
|
|
217
|
+
salvar_conversa_na_pasta(id_conversa_atual, historico_conversa)
|
|
218
|
+
|
|
219
|
+
if len(historico_conversa) > 10:
|
|
220
|
+
historico_conversa = historico_conversa[-10:]
|
|
221
|
+
|
|
222
|
+
if "[CMD]" in resposta_ia:
|
|
223
|
+
partes = resposta_ia.split("[CMD]")
|
|
224
|
+
comando_extraido = partes[-1].strip().split('\n')[0]
|
|
225
|
+
executar_comando_sistema(comando_extraido)
|
|
226
|
+
|
|
227
|
+
except KeyboardInterrupt:
|
|
228
|
+
print("\n\nPrograma interrompido pelo usuário. Fechando o Angelo...")
|
|
229
|
+
sys.exit()
|
|
230
|
+
|
|
231
|
+
if __name__ == "__main__":
|
|
232
|
+
main()
|
package/package.json
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "angelo-programmer",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "O Angelo Programmer é uma IA programadora que ajuda a criar sites, projetos python e muito mais!",
|
|
5
|
+
"main": "bin/angelo.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"AngeloProgrammer": "bin/angelo.js"
|
|
8
|
+
},
|
|
9
|
+
"keywords": ["ai", "python", "automation"],
|
|
10
|
+
"author": "Angelo Guilherme",
|
|
11
|
+
"license": "MIT"
|
|
12
|
+
}
|