mirror of
https://github.com/andrewyng/openworker.git
synced 2026-09-04 16:42:35 +00:00
OpenWorker: initial import
Imported from andrewyng/aisuite@1b4bbf303e (contents of its platform/ directory, hoisted to the repo root). Development history prior to this commit lives in that repository. Co-authored-by: Devika <devikaverma11@gmail.com>
This commit is contained in:
@@ -0,0 +1,110 @@
|
||||
"""Small CLI to exercise connectors independently.
|
||||
|
||||
python -m coworker.connectors.cli status
|
||||
Show which platforms are configured (token present) + allowlist size.
|
||||
|
||||
python -m coworker.connectors.cli fake [--user U1] [--allow U1]
|
||||
Offline REPL: type messages as if they arrived from a platform; a built-in echo
|
||||
handler replies through the gateway. Exercises auth + inbound dispatch + outbound
|
||||
with no network. Try --user with someone NOT in --allow to see it dropped.
|
||||
|
||||
python -m coworker.connectors.cli send --target telegram:12345 --text "hi"
|
||||
Live outbound via the send_message tool (needs a bot token in the SecretStore).
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import asyncio
|
||||
import sys
|
||||
|
||||
from ..secrets import SecretStore
|
||||
from .base import MessageEvent
|
||||
from .config import ConnectorSettings, load_settings
|
||||
from .fake import FakeAdapter
|
||||
from .gateway import Gateway
|
||||
from .tools import make_send_message_tool
|
||||
|
||||
|
||||
def _cmd_status() -> int:
|
||||
settings = load_settings(SecretStore())
|
||||
print("Connector status:")
|
||||
for platform, s in settings.items():
|
||||
print(
|
||||
f" {platform:10s} enabled={s.enabled} allow_all={s.allow_all} "
|
||||
f"allowed_users={len(s.allowed_users)}"
|
||||
)
|
||||
return 0
|
||||
|
||||
|
||||
async def _run_fake(user: str, allow: list[str]) -> int:
|
||||
fake = FakeAdapter()
|
||||
settings = {
|
||||
"fake": ConnectorSettings(
|
||||
platform="fake", enabled=True, allowed_users=set(allow), allow_all=not allow
|
||||
)
|
||||
}
|
||||
gateway = Gateway(settings=settings)
|
||||
|
||||
async def echo_handler(event: MessageEvent) -> None:
|
||||
reply = f"echo: {event.text}"
|
||||
await gateway.deliver(event.source.target, reply)
|
||||
print(f" ↩ sent to {event.source.target}: {reply!r}")
|
||||
|
||||
gateway.set_handler(echo_handler)
|
||||
gateway.register(fake)
|
||||
await gateway.start()
|
||||
print(f"fake gateway up (user={user}, allow={allow or '∗ all'}). Ctrl-D to quit.\n")
|
||||
|
||||
while True:
|
||||
try:
|
||||
text = await asyncio.to_thread(input, "you> ")
|
||||
except (EOFError, KeyboardInterrupt):
|
||||
print()
|
||||
break
|
||||
text = text.strip()
|
||||
if not text:
|
||||
continue
|
||||
before = len(fake.outbox)
|
||||
await fake.inject(text, user_id=user, user_name=user)
|
||||
if len(fake.outbox) == before:
|
||||
print(" ⨯ dropped (not authorized)")
|
||||
await gateway.stop()
|
||||
return 0
|
||||
|
||||
|
||||
def _cmd_send(target: str, text: str) -> int:
|
||||
tool = make_send_message_tool(SecretStore())
|
||||
result = tool(target=target, text=text)
|
||||
print(result)
|
||||
return 0 if result.get("ok") else 1
|
||||
|
||||
|
||||
def main(argv: list[str] | None = None) -> int:
|
||||
parser = argparse.ArgumentParser(prog="coworker-connectors")
|
||||
sub = parser.add_subparsers(dest="cmd", required=True)
|
||||
|
||||
sub.add_parser("status")
|
||||
|
||||
p_fake = sub.add_parser("fake")
|
||||
p_fake.add_argument("--user", default="u1")
|
||||
p_fake.add_argument(
|
||||
"--allow", action="append", default=[], help="authorized user id (repeatable)"
|
||||
)
|
||||
|
||||
p_send = sub.add_parser("send")
|
||||
p_send.add_argument("--target", required=True)
|
||||
p_send.add_argument("--text", required=True)
|
||||
|
||||
args = parser.parse_args(argv)
|
||||
if args.cmd == "status":
|
||||
return _cmd_status()
|
||||
if args.cmd == "fake":
|
||||
return asyncio.run(_run_fake(args.user, args.allow))
|
||||
if args.cmd == "send":
|
||||
return _cmd_send(args.target, args.text)
|
||||
return 1
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
Reference in New Issue
Block a user