Giter Club home page Giter Club logo

hivemind-core's Introduction

HiveMind is a community-developed superset or extension of OpenVoiceOS, the open-source voice assistant.

With HiveMind, you can extend one (or more, but usually just one!) instance of ovos-core to as many devices as you want, including devices that can't ordinarily run OpenVoiceOS!

HiveMind's developers have successfully connected to OpenVoiceOS from a PinePhone, a 2009 MacBook, and a Raspberry Pi 0, among other devices. OpenVoiceOS itself usually runs on our desktop computers or our home servers, but you can use any OpenVoiceOS-branded device as your central unit.

Work in progress documentation can be found in the docs

You can also join the Hivemind Matrix chat for general news, support and chit chat

Usage

$ hivemind-core --help
Usage: hivemind-core [OPTIONS] COMMAND [ARGS]...

Options:
  --help  Show this message and exit.

Commands:
  add-client     add credentials for a client
  delete-client  remove credentials for a client
  list-clients   list clients and credentials
  listen         start listening for HiveMind connections


$ hivemind-core add-client --help
Usage: hivemind-core add-client [OPTIONS] [NAME] [ACCESS_KEY] [PASSWORD]
                                [CRYPTO_KEY]

  add credentials for a client

Options:
  --help  Show this message and exit.



$ hivemind-core listen --help
Usage: hivemind-core listen [OPTIONS]

  start listening for HiveMind connections

Options:
  --host TEXT             HiveMind host
  --port INTEGER          HiveMind port number
  --ovos_bus_address TEXT Open Voice OS bus address
  --ovos_bus_port INTEGER Open Voice OS bus port
  --ssl BOOLEAN           use wss://
  --cert_dir TEXT         HiveMind SSL certificate directory
  --cert_name TEXT        HiveMind SSL certificate file name
  --help                  Show this message and exit.


$ hivemind-core delete-client --help
Usage: hivemind-core delete-client [OPTIONS] NODE_ID

  remove credentials for a client

Options:
  --help  Show this message and exit.


$ hivemind-core list-clients --help
Usage: hivemind-core list-clients [OPTIONS]

  list clients and credentials

Options:
  --help  Show this message and exit.

By default HiveMind listens for the Open Voice OS bus on 127.0.0.1 which should not be changed when running as the same place. In some cases such as Kubernetes when the HiveMind Listener and Open Voice OS bus are in different pods, the HiveMind Listener should be able to connect to the pod address by using the ovos_bus_address and ovos_bus_port options.

Protocol

Protocol Version 0 1
json serialization yes yes
binary serialization no yes
pre-shared AES key yes yes
password handshake no yes
PGP handshake no yes
zlib compression no yes

some clients such as HiveMind-Js do not yet support protocol V1

HiveMind components

Client Libraries

Terminals

Bridges

Minds

hivemind-core's People

Contributors

chancencounter avatar emphasize avatar goldyfruit avatar j1nx avatar jarbasal avatar joanguitar avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

hivemind-core's Issues

Handle client deletion by name

When trying to delete a client with its name instead of the ID.

Traceback (most recent call last):
  File "/home/goldyfruit/Virtualenvs/hivemind/bin/hivemind-core", line 33, in <module>
    sys.exit(load_entry_point('jarbas-hive-mind==0.13.0a1', 'console_scripts', 'hivemind-core')())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/goldyfruit/Virtualenvs/hivemind/lib64/python3.11/site-packages/click/core.py", line 1130, in __call__
    return self.main(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/goldyfruit/Virtualenvs/hivemind/lib64/python3.11/site-packages/click/core.py", line 1055, in main
    rv = self.invoke(ctx)
         ^^^^^^^^^^^^^^^^
  File "/home/goldyfruit/Virtualenvs/hivemind/lib64/python3.11/site-packages/click/core.py", line 1657, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/goldyfruit/Virtualenvs/hivemind/lib64/python3.11/site-packages/click/core.py", line 1404, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/goldyfruit/Virtualenvs/hivemind/lib64/python3.11/site-packages/click/core.py", line 760, in invoke
    return __callback(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/goldyfruit/Virtualenvs/hivemind/lib64/python3.11/site-packages/hivemind_core/scripts.py", line 59, in delete_client
    if x["client_id"] == int(node_id):
                         ^^^^^^^^^^^^
ValueError: invalid literal for int() with base 10: 'HiveMind-Node-0'

ask_yesno() not handled

When the skill trigger self.ask_yesno(), I goit the quetion in the webchat but if I answer yes or no HiveMind thinks its a new request.

UCNzbQBUxEQfipBBcsbJtIzI

Enforce crypto

To End User-proof Hivemind, I think we should go beyond "on-by-default" and require users to go the extra mile to connect devices without encryption. The spirit of #1 could be extended to whitelist not only actions but also unencrypted connections, or users could simply be obligated to go in and add the devices via terminal. Whatever the case, you've gotta prove you know what you're doing before you do it without the fez on, because the implications are staggering.

Toward that end, autodiscovery should:

  • Prompt to verify, probably at both ends
  • Generate random AES keys (it's just a lot of bits)
  • Exchange keys
  • Disconnect and reestablish (if something went wrong, fail right away, not the next time I try to connect when I've already done a bunch of config or whatever)

Default port should be different than the Mycroft message bus

Because both have to run at the same place, they can't have the same port. I think by default, hivemind should be running on a different port than 8081.

(hivemind) pi@rpi4b01:~ $ hivemind-core listen 
2023-06-15 23:22:07.445 - HiveMind - hivemind_core.service:on_alive:79 - INFO - HiveMind bus service alive
2023-06-15 23:22:07.448 - HiveMind - hivemind_core.protocol:register_bus_handlers:108 - INFO - registering internal mycroft bus handlers
2023-06-15 23:22:07.450 - HiveMind - hivemind_core.service:on_started:83 - INFO - HiveMind bus service started!
2023-06-15 23:22:07.451 - HiveMind - hivemind_core.service:run:225 - INFO - ws connection started
Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib/python3.9/threading.py", line 954, in _bootstrap_inner
    self.run()
  File "/home/pi/.venv/hivemind/lib/python3.9/site-packages/hivemind_core/service.py", line 226, in run
    application.listen(self.port, self.host)
  File "/home/pi/.venv/hivemind/lib/python3.9/site-packages/tornado/web.py", line 2207, in listen
    server.listen(
  File "/home/pi/.venv/hivemind/lib/python3.9/site-packages/tornado/tcpserver.py", line 183, in listen
    sockets = bind_sockets(
  File "/home/pi/.venv/hivemind/lib/python3.9/site-packages/tornado/netutil.py", line 162, in bind_sockets
    sock.bind(sockaddr)
OSError: [Errno 98] Address already in use

slave node not getting responses back

Hi there! First let me congratulate for the amazing job. It's a very interesting architecture and it has a lot of potential to become a very interesting project. keep up the good work!

I'm having a small issue. I have 2 components in my setup:

  1. rpi4 running mycroft and a HiveMind master instance as pi@raspberrypi:~/HiveMind-core $ python3 examples/mycroft_master.py
  2. rpi0 with an audio module (respeaker mic array v2.0) running voice satellite as
    pi@raspberrypi:~/HiveMind-voice-sat $ PYTHONPATH=$("pwd") python3 voice_satellite/__main__.py

I can talk to mycroft through the slave but I'm not getting any response back.
Reading the code is not really even clear how that should happen since HiveMind master doesn't seems to even establish a connection to the mycroft websocket.
If I open a websocket connection against the mycroft ws I can clearly see "speak" events being fired and I can see some handlers to play it in HiveMind-voice-sat.
Also I see on the main picture in the HiveMind-voice-sat readme that it should play back audio messages from mycroft.

It seems I'm missing a tiny bit but I can't figure out what

Extract zeroconf into plugin and remove all imports from our other repos

Explanation to passersby:

We try to avoid shipping LGPL code with permissively licensed code, because it is unclear whether the linking exception applies to interpreted languages like Python. Although it was the zeroconf developers' clear intention that zeroconf should be available to permissively-licensed and nonfree projects - because there is literally no other reason whatsoever to choose the LGPL - they were, unfortunately, unaware of the real situation with respect to that license and Python. This is primarily because certain evangelists go from university to university neglecting to mention that the license was written with C in mind and did not account for interpreters at all.

Tell your friends: stop licensing interpreted code under the LGPL. It probably doesn't work, and nobody knows for sure because nobody has filed the lawsuit yet.

Hence, here we are, reluctantly extracting a good library from our project, despite the fact that its developers want us to be able to use it, just to be on the safe side.

That said, zeroconf isn't leaving! It's just being extracted to a plugin, so that we can distribute code related to that LGPL module 100% separately from our much larger MIT- and Apache-licensed works.

bug - peers list, not single value

not sure on trigger condition, but this is now handled

Traceback (most recent call last):
  File "/usr/lib/python3.8/concurrent/futures/_base.py", line 328, in _invoke_callbacks
    callback(self)
  File "/home/mycroft/.local/lib/python3.8/site-packages/pyee/_executor.py", line 60, in _callback
    self.emit('error', exc)
  File "/home/mycroft/.local/lib/python3.8/site-packages/pyee/_base.py", line 111, in emit
    self._emit_handle_potential_error(event, args[0] if args else None)
  File "/home/mycroft/.local/lib/python3.8/site-packages/pyee/_base.py", line 83, in _emit_handle_potential_error
    raise error
  File "/usr/lib/python3.8/concurrent/futures/thread.py", line 57, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/home/mycroft/.local/lib/python3.8/site-packages/jarbas_hive_mind/master/__init__.py", line 415, in handle_outgoing_mycroft
    if peer and peer in self.clients:
TypeError: unhashable type: 'list

9b68de9

Dep issues

#34 reminded me that we should write down the deps that need fixing. This applies to all repos, but a central list had to go someplace.

zeroconf is missing from some repos.

jarbas_utils is still present, and in some cases is causing both jarbas_utils and ovos_utils to come in. That's off the top of my head. I think I recall some unmigrated code in the voice sat.

cryptodomex

#12 needs to be reverted @j1nx

using this on my pi0 voice satellite caused issues, it would say AES does not contain GCM mode

this is likely as simple as changing an import, keeping this issue until proper migration is done and reverting the requirement to pycryptodome in the pip release

Does not close port on exit

When exiting "examples/mycroft_master.py", it does not close the used port. I have to find it with ps aux and kill the process.

I know it's not a major issue, but I hope any I put on here will be welcome.

Thanks guys for your work

Enabling sound in flask example

We managed to create a flask running on a private server with our own customised skills (http://www.tropozone.guillaumeslizewicz.com:8081/general ), we would like to build on it and allow people to interact with it via voice.
We checked @ccoreilly implementation of hivemind for his catalan voice assistant but we're not sure where to start.
1- What would be the best way to create a new node every time someone connect to the page?
2- How could we implement tts and stt? (we've seen Ciaran use Festival and Vosk, would you recommend these options?)
Many thanks :)

feature - transformer plugins

allow the usage of utterance/metadata transformers in hivemind-core before forwarding the utterance to OVOS

as an example https://github.com/JarbasHiveMind/ovos-user-id could be used to assign a user coming from a voice satellite, or more relevantly, a hivemind bridge could map users from a chat service to a internal user_id (eg, from matrix chat)

Wakeword sound takes longer to play with "instant_listen"

The culprit for me was "confirm_listening": true and "instant_listen": true this combo makes the acknowledge sound longer to play.

To avoid this latency I had to set confirm_listening to false which prevent the sound to play but made the satellite way more snappier.

pyOpenSSL missing from the requirements.

(hivemind) pi@rpi4b01:~ $ hivemind-core listen 
Traceback (most recent call last):
  File "/home/pi/.venv/hivemind/bin/hivemind-core", line 11, in <module>
    load_entry_point('jarbas-hive-mind==0.13.0a1', 'console_scripts', 'hivemind-core')()
  File "/home/pi/.venv/hivemind/lib/python3.9/site-packages/click/core.py", line 1130, in __call__
    return self.main(*args, **kwargs)
  File "/home/pi/.venv/hivemind/lib/python3.9/site-packages/click/core.py", line 1055, in main
    rv = self.invoke(ctx)
  File "/home/pi/.venv/hivemind/lib/python3.9/site-packages/click/core.py", line 1657, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/home/pi/.venv/hivemind/lib/python3.9/site-packages/click/core.py", line 1404, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/home/pi/.venv/hivemind/lib/python3.9/site-packages/click/core.py", line 760, in invoke
    return __callback(*args, **kwargs)
  File "/home/pi/.venv/hivemind/lib/python3.9/site-packages/hivemind_core/scripts.py", line 103, in listen
    from hivemind_core.service import HiveMindService
  File "/home/pi/.venv/hivemind/lib/python3.9/site-packages/hivemind_core/service.py", line 12, in <module>
    from OpenSSL import crypto
ModuleNotFoundError: No module named 'OpenSSL'

Proposal/s: compressing messages, URIs for nodes, and how they relate

Important preface: I'm talking about messages exchanged within or between hives after a node has established an open socket with master. These are the functional messages consumed and delimited by things like some_stream.readUntil().

The notion is in the early phases, but I'm interested in compressing most/all messages into as few bits as possible. Any message that carries a proper payload will be as long as it is, not much to be done there, but most instructions can be whittled down to opcodes, provided we use a large enough space for opcodes to allow for expansion.

I've become fairly comfortable manipulating bitstrings - pip install bitstring! bitstring.BitStream is exactly what it sounds like - and it's easier than people seem to assume to write bindings for stuff like this. You don't have to be any good with binary. You only have to care about which bits represent which operations. Pick a thing that lets you manipulate bits like strings, pad the end product, turn it back into a bytes object, and you've written the smallest possible version of your protocol. Nothing to it, and you know from the outset that you can transmit over serial without modifying the spec.

There's a provisional URI scheme for IoT devices. The first example appears to use, conveniently, AES keys (or 16 chars, at any rate.)

The overwhelming majority of nodes are "internal" to a private hive. Indeed, it might turn out that most personal or LAN hives operate under a single master's jurisdiction, or a small number of masters each belonging to an individual within a household (for example.)

If each node, of any type, is assigned a URI, "full" information could be used for addressing purposes in larger hives. However, the smaller a hive gets, the fewer characters we'd need for addressing. Delimit them with a null character, for all anybody cares, and we end up with a couple bytes for addressing, a couple bytes for issuing instructions, and a couple of those instructions are things like ADDRESS\0PREP FOR PAYLOAD\0\0

Thoughts/objections?

feature - blacklist/whitelist intents/skills per client

currently all utterances are parsed by master, there is ip blacklist support only

add support to blacklist intents/skills per user

Example, some privileged actions like access to a camera, shutting down etc. should be forbidden by default

When listener restart, satellite is not able to reconnect

When listener restart, satellite is not able to reconnect, the only way is to wait either 20 minutes or restart the satellite.

ovos-core-86bc9bc566-xzpvp ovos-hivemind-listener 2023-12-06 22:44:31.047 - HiveMind - hivemind_core.service:open:114 - INFO - authorizing client: VoiceSatelliteV0.3.0
ovos-core-86bc9bc566-xzpvp ovos-hivemind-listener Uncaught exception GET /?authorization=Vm9pY2VTYXRlbGxpdGVWMC4zLjA6NjcyYWJhZDIyNWI2MjRjYTBlZjA1MjY5NmE1MTliMDE= (192.168.100.137)
ovos-core-86bc9bc566-xzpvp ovos-hivemind-listener HTTPServerRequest(protocol='http', host='192.168.100.54:5678', method='GET', uri='/?authorization=Vm9pY2VTYXRlbGxpdGVWMC4zLjA6NjcyYWJhZDIyNWI2MjRjYTBlZjA1MjY5NmE1MTliMDE=', version='HTTP/1.1', remote_ip='192.168.100.137')
ovos-core-86bc9bc566-xzpvp ovos-hivemind-listener Traceback (most recent call last):
ovos-core-86bc9bc566-xzpvp ovos-hivemind-listener   File "/home/hivemind/.venv/lib/python3.11/site-packages/hivemind_bus_client/util.py", line 154, in decrypt_bin
ovos-core-86bc9bc566-xzpvp ovos-hivemind-listener     return cipher.decrypt_and_verify(ciphertext, tag)
ovos-core-86bc9bc566-xzpvp ovos-hivemind-listener            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ovos-core-86bc9bc566-xzpvp ovos-hivemind-listener   File "/home/hivemind/.venv/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_gcm.py", line 567, in decrypt_and_verify
ovos-core-86bc9bc566-xzpvp ovos-hivemind-listener     self.verify(received_mac_tag)
ovos-core-86bc9bc566-xzpvp ovos-hivemind-listener   File "/home/hivemind/.venv/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_gcm.py", line 508, in verify
ovos-core-86bc9bc566-xzpvp ovos-hivemind-listener     raise ValueError("MAC check failed")
ovos-core-86bc9bc566-xzpvp ovos-hivemind-listener ValueError: MAC check failed
ovos-core-86bc9bc566-xzpvp ovos-hivemind-listener 
ovos-core-86bc9bc566-xzpvp ovos-hivemind-listener During handling of the above exception, another exception occurred:
ovos-core-86bc9bc566-xzpvp ovos-hivemind-listener 
ovos-core-86bc9bc566-xzpvp ovos-hivemind-listener Traceback (most recent call last):
ovos-core-86bc9bc566-xzpvp ovos-hivemind-listener   File "/home/hivemind/.venv/lib/python3.11/site-packages/tornado/websocket.py", line 630, in _run_callback
ovos-core-86bc9bc566-xzpvp ovos-hivemind-listener     result = callback(*args, **kwargs)
ovos-core-86bc9bc566-xzpvp ovos-hivemind-listener              ^^^^^^^^^^^^^^^^^^^^^^^^^
ovos-core-86bc9bc566-xzpvp ovos-hivemind-listener   File "/home/hivemind/.venv/lib/python3.11/site-packages/hivemind_core/service.py", line 107, in on_message
ovos-core-86bc9bc566-xzpvp ovos-hivemind-listener     message = self.client.decode(message)
ovos-core-86bc9bc566-xzpvp ovos-hivemind-listener               ^^^^^^^^^^^^^^^^^^^^^^^^^^^
ovos-core-86bc9bc566-xzpvp ovos-hivemind-listener   File "/home/hivemind/.venv/lib/python3.11/site-packages/hivemind_core/protocol.py", line 103, in decode
ovos-core-86bc9bc566-xzpvp ovos-hivemind-listener     payload = decrypt_bin(self.crypto_key, payload)
ovos-core-86bc9bc566-xzpvp ovos-hivemind-listener               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ovos-core-86bc9bc566-xzpvp ovos-hivemind-listener   File "/home/hivemind/.venv/lib/python3.11/site-packages/hivemind_bus_client/util.py", line 156, in decrypt_bin
ovos-core-86bc9bc566-xzpvp ovos-hivemind-listener     raise DecryptionKeyError
ovos-core-86bc9bc566-xzpvp ovos-hivemind-listener hivemind_bus_client.exceptions.DecryptionKeyError
ovos-core-86bc9bc566-xzpvp ovos-hivemind-listener 2023-12-06 22:44:31.196 - HiveMind - hivemind_core.service:on_close:153 - INFO - disconnecting client: VoiceSatelliteV0.3.0:192.168.100.137::84a2872b-796c-43b1-b0f5-d5025cd0ca99

Class HiveSkill (abstraction layer for consuming instructions from Mycroft)

I propose syntax inspired by Adapt, using decorators to outline behavior, but everything is literal and there's no NLP.

Instead of 'intents', HiveSkills have 'actions'. Your HiveSkill is namespaced for local use, and numbered by your device and master every time you connect, so it doesn't have to transmit the whole namespace and action name every time it does something.

In other words, if you have 183 Actions on your device, you and master agree on a dict or etc, and from then on, when master wants your device to execute an Action, it just sends whatever int your device currently associates with that namespaced Action.

So, where an Adapt intent specifies vocabulary to invoke it, an Action specifies one, straightforward identifier. If I create an Action called PhoneSkill.dial_number, at startup, I count up my skills and that Action ends up with index 76.

You and master know that you have a three-digit number of Actions, so it can begin the payload with a simple 076, no terminator needed. Then you just keep reading to parse the rest of the message. #14 would tell the node how long the payload will be ahead of time, so that's no concern. The decorators specify what data the Action expects, and in what order. The parser tries to populate that, and if the payload is malformed, the payload is malformed.

In cases like the phone dialer, an especially dedicated Action dev could further minimize the size of the payload by switching from bytes to bits, so it would be ideal to support straight binary as an alternative at the parser end.

installation issues

Not sure where else to ask this other than maybe a chatroom, but I'll start here.

I have a Mycroft instance running on an OpenSuse server, I cloned this repository according to your directions and the HiveMind-core seems to be running correctly also.

My issue is connecting to the core from a satellite. I have changed the credentials accordingly, but when I run either the Hive cli, or the Hive voice, I get the same error.

TypeError: init() got multiple values for argument 'crypto_key'

Any ideas?

Readme does not describe what is this project about

What is HiveMind-core was the question that I have asked myself when opening this repo.

I read parts of the readme file in dev branch but could not found paragraph that sums up what is this project all about.

Is it a dead project?

Hello,
I am trying to run this project, but alot of errors appears.
Is it a dead project?

Debug mode: log messages

We received a report today of a malformed message. I sure would like to see the message! In this case, the person reporting is a coder and can dump the message before the exception is thrown, but that isn't true of most users.

"hivemind-client terminal" complains about missing file

2023-06-15 23:24:36.708 - OVOS - ovos_bus_client.conf:load_message_bus_config:28 - DEBUG - Loading message bus configs
Traceback (most recent call last):
  File "/home/goldyfruit/Virtualenvs/hivemind/bin/hivemind-client", line 33, in <module>
    sys.exit(load_entry_point('hivemind-bus-client==0.0.3', 'console_scripts', 'hivemind-client')())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/goldyfruit/Virtualenvs/hivemind/lib64/python3.11/site-packages/click/core.py", line 1130, in __call__
    return self.main(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/goldyfruit/Virtualenvs/hivemind/lib64/python3.11/site-packages/click/core.py", line 1055, in main
    rv = self.invoke(ctx)
         ^^^^^^^^^^^^^^^^
  File "/home/goldyfruit/Virtualenvs/hivemind/lib64/python3.11/site-packages/click/core.py", line 1657, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/goldyfruit/Virtualenvs/hivemind/lib64/python3.11/site-packages/click/core.py", line 1404, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/goldyfruit/Virtualenvs/hivemind/lib64/python3.11/site-packages/click/core.py", line 760, in invoke
    return __callback(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/goldyfruit/Virtualenvs/hivemind/lib64/python3.11/site-packages/hivemind_bus_client/scripts.py", line 26, in terminal
    node.connect(FakeBus())
  File "/home/goldyfruit/Virtualenvs/hivemind/lib64/python3.11/site-packages/hivemind_bus_client/client.py", line 97, in connect
    from hivemind_bus_client.protocol import HiveMindSlaveProtocol
  File "/home/goldyfruit/Virtualenvs/hivemind/lib64/python3.11/site-packages/hivemind_bus_client/protocol.py", line 75, in <module>
    class HiveMindSlaveProtocol:
  File "/home/goldyfruit/Virtualenvs/hivemind/lib64/python3.11/site-packages/hivemind_bus_client/protocol.py", line 82, in HiveMindSlaveProtocol
    handshake: HandShake = HandShake(identity.private_key)
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/goldyfruit/Virtualenvs/hivemind/lib64/python3.11/site-packages/poorman_handshake/asymmetric/__init__.py", line 17, in __init__
    self.export_private_key(path, binary)
  File "/home/goldyfruit/Virtualenvs/hivemind/lib64/python3.11/site-packages/poorman_handshake/asymmetric/__init__.py", line 31, in export_private_key
    return export_private_key(path, self.private_key, binary)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/goldyfruit/Virtualenvs/hivemind/lib64/python3.11/site-packages/poorman_handshake/asymmetric/utils.py", line 12, in export_private_key
    with open(path, "w") as f:
         ^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: '/home/goldyfruit/.config/hivemind/unnamed-node.asc'

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.