From 37a28ead25b5e8e38076905feefa3fa9c8c86604 Mon Sep 17 00:00:00 2001 From: Ben Sima Date: Thu, 11 Dec 2025 22:51:44 -0500 Subject: Add Telegram bot agent (t-251) - Omni/Agent/Telegram.hs: Telegram API client with getUpdates/sendMessage - Omni/Bot.hs: Standalone CLI for running the bot - User identification via Memory.getOrCreateUserByTelegramId - Memory-enhanced agent with remember/recall tools - Run with: bot --token=XXX or TELEGRAM_BOT_TOKEN env var --- Omni/Bot.hs | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 Omni/Bot.hs (limited to 'Omni/Bot.hs') diff --git a/Omni/Bot.hs b/Omni/Bot.hs new file mode 100644 index 0000000..77a0408 --- /dev/null +++ b/Omni/Bot.hs @@ -0,0 +1,66 @@ +#!/usr/bin/env run.sh +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE QuasiQuotes #-} +{-# LANGUAGE NoImplicitPrelude #-} + +-- | Omni Bot - Family assistant via Telegram. +-- +-- Usage: +-- bot # Uses TELEGRAM_BOT_TOKEN env var +-- bot --token=XXX # Explicit token +-- bot --model=MODEL # Override LLM model +-- +-- : out bot +-- : dep aeson +-- : dep http-conduit +-- : dep stm +module Omni.Bot where + +import Alpha +import qualified Data.Text as Text +import qualified Omni.Agent.Telegram as Telegram +import qualified Omni.Cli as Cli +import qualified Omni.Test as Test +import qualified System.Console.Docopt as Docopt + +main :: IO () +main = Cli.main plan + +plan :: Cli.Plan () +plan = + Cli.Plan + { Cli.help = help, + Cli.move = move, + Cli.test = test, + Cli.tidy = \_ -> pure () + } + +help :: Cli.Docopt +help = + [Cli.docopt| +bot - Omni family assistant via Telegram + +Usage: + bot [--token=TOKEN] [--model=MODEL] + bot test + bot (-h | --help) + +Options: + -h --help Show this help + --token=TOKEN Telegram bot token (or use TELEGRAM_BOT_TOKEN env) + --model=MODEL LLM model to use [default: anthropic/claude-sonnet-4] +|] + +move :: Cli.Arguments -> IO () +move args = do + let maybeToken = fmap Text.pack (Cli.getArg args (Cli.longOption "token")) + Telegram.startBot maybeToken + +test :: Test.Tree +test = + Test.group + "Omni.Bot" + [ Test.unit "help is non-empty" <| do + let usage = str (Docopt.usage help) :: String + null usage Test.@=? False + ] -- cgit v1.2.3