|
import os from 'os'; |
|
import pty from 'node-pty'; |
|
|
|
let sharedPtyProcess = null; |
|
let sharedTerminalMode = false; |
|
|
|
const shell = os.platform() === 'win32' ? 'powershell.exe' : 'bash'; |
|
|
|
const spawnShell = () => { |
|
return pty.spawn(shell, [], { |
|
name: 'xterm-color', |
|
env: process.env, |
|
}); |
|
}; |
|
|
|
export const setSharedTerminalMode = (useSharedTerminal) => { |
|
sharedTerminalMode = useSharedTerminal; |
|
if (sharedTerminalMode && !sharedPtyProcess) { |
|
sharedPtyProcess = spawnShell(); |
|
} |
|
}; |
|
class IA { |
|
constructor(){ |
|
this.messages=[] |
|
this.listeners={} |
|
} |
|
write(data){ |
|
this.messages.append({role:"user",content:data}) |
|
fetch('https://text.pollinations.ai/openai',{ |
|
body:JSON.stringify({ |
|
messages:this.messages, |
|
private:true, |
|
model:"openai-large" |
|
}) |
|
}).then(resp=>resp.json()).then(respuesta=>{ |
|
this.messages.append(respuesta.choices[0].message) |
|
this.emit('data',this.messages[messages.length-1].content) |
|
}) |
|
} |
|
emit(text,data){ |
|
v = this.listeners[text] |
|
for(var i in v){ |
|
i.apply(null,data) |
|
} |
|
|
|
} |
|
on(text,cb){ |
|
if (!this.listeners[text]){ |
|
this.listeners[text]=[] |
|
} |
|
this.listeners[text].push(cb) |
|
} |
|
} |
|
export const handleTerminalConnection = (ws) => { |
|
let ptyProcess = sharedTerminalMode ? sharedPtyProcess : spawnShell(); |
|
|
|
ws.on('message', command => { |
|
const processedCommand = commandProcessor(command); |
|
console.log(processedCommand.toString()) |
|
if(processedCommand.toString()=="ia"){ |
|
ptyProcess.kill() |
|
sharedPtyProcess = IA() |
|
|
|
} |
|
ptyProcess.write(processedCommand); |
|
}); |
|
|
|
ptyProcess.on('data', (rawOutput) => { |
|
const processedOutput = outputProcessor(rawOutput); |
|
ws.send(processedOutput); |
|
}); |
|
|
|
ws.on('close', () => { |
|
if (!sharedTerminalMode) { |
|
ptyProcess.kill(); |
|
} |
|
}); |
|
}; |
|
|
|
|
|
const commandProcessor = (command) => { |
|
return command; |
|
}; |
|
|
|
|
|
const outputProcessor = (output) => { |
|
return output; |
|
}; |