X-Git-Url: https://git.giacomolli.uk/onechat/blobdiff_plain/0da1ef837bbd190cc5787214187d1b29d62b9410..d008b46cbfc6348255e9b9a1fc009f0e4bd6aa2a:/README.rst?ds=inline diff --git a/README.rst b/README.rst index b3787d2..7930b0e 100644 --- a/README.rst +++ b/README.rst @@ -186,7 +186,10 @@ device. The terminal client and Telegram take three commands: Linked devices, tap Link a device, then tap Link with phone number instead, and enter the code. The code expires in about 2 minutes, and the same command gives a new code. When the link succeeds, the daemon - answers with the linked number. + answers with the linked number. Linked devices on the phone shows the + device as OneChat. The name applies at the pairing, so an existing + link keeps its old name until ``/whatsapp unlink`` and a new + ``/whatsapp pair PHONE``. ``/whatsapp status`` Shows the link: not linked, linked and connected, or linked and @@ -217,8 +220,9 @@ Each batch goes to the chat of the agent as one work message that starts with ``[WhatsApp]``, with the name and the ID of the chat, and the time, the sender, and the text of each message. The messages of the user show as ``You``. ``whatsapp/state.json``, with mode 0600, keeps the batches -that are not in the chat yet, so they survive a restart. A crash just -after a batch goes to the chat can make the batch repeat once. +that are not in the chat yet, so they survive a restart, and the records +of the sends. A crash just after a batch goes to the chat can make the +batch repeat once. A batch of a private chat with a message of another person starts a turn, and so does a batch of a group with a message that mentions the @@ -246,6 +250,21 @@ minute at the most, and then gives all its batches to the agent in one turn, not one turn for each chat. The batches of ``whatsapp/state.json`` at the start wait for the first catch-up in the same way. +The agent finds a chat with the tool ``whatsapp_find``: it gives the +contacts and the groups whose name holds a text, with no regard to case +and accents, with their IDs. The names of the contacts come from the +session, and the names of the groups from WhatsApp, kept in memory for +one hour. The names arrive from the phone some minutes after the link, +and until then the tool says that they are not ready. The agent sends a +text message with the tool ``whatsapp_send``, only when the user asks +for it. Each send has an ID that the agent gives: a repeated call with +the same ID gives the answer of the first call and sends nothing. The +state file keeps the last 1000 send records. When the daemon stops +during a send, the result is not known, and the tool tells the agent to +ask the user to look at the chat in WhatsApp. Without a link, both tools +tell the agent to ask the user to run ``/whatsapp pair PHONE``. Only the +agent has the WhatsApp tools, not its subagents. + Each batch of a group goes to the chat, also with no turn, and the memory tree summarizes it with model calls, which use the quota. @@ -257,6 +276,46 @@ good, for example because another program uses the same session, all clients get a notice at once. When the user removes the device in the phone, the daemon deletes the session and tells all clients one time. +*********** + Schedules +*********** + +The agent sets reminders and timed tasks when the user asks for them, +such as "remind me tomorrow at 9" or "every weekday at 8, tell me what +my WhatsApp groups talked about". A schedule has a text, the task for +the agent, and either one time or a cron expression. The agent also +lists the schedules with their next times, and removes one when the user +asks. Only the agent has the schedule tools, not its subagents. + +A cron expression has five fields: minute, hour, day of month, month, +and day of week, where 0 and 7 are Sunday. A field is a comma list of +``*``, ``N``, and ``N-M``, and ``*`` and ``N-M`` can have a step ``/S``, +as in ``0 8 * * 1-5`` or ``*/15 9-17 * * *``. When both day fields start +with something other than ``*``, a day matches when either field +matches. Names such as ``MON``, macros such as ``@daily``, the +characters ``? L W #``, and ``N/S`` are refused. The runs must be at +least 5 minutes apart, because each run is a full turn that uses the +quota, so ``*/5 * * * *`` is the shortest schedule. + +The times use the time zone of the machine. A time that the clock skips +at the start of daylight saving time runs later by the length of the +skip. A time that the clock repeats at its end runs once, at its first +occurrence. + +At its time, a schedule goes to the chat as a work message that starts +with ``[Schedule ID]``, with its time and its text, and it starts a +turn. The message ends with a line that tells the agent to end its turn +with an empty reply when nothing needs the user. The terminal client +shows the message, and Telegram shows only the reply. After its run, a +one-time schedule goes, and a repeating schedule gets its next time. + +``agent/schedules.json``, with mode 0600, holds the schedules. Each +change writes it before the tool answers, so the schedules survive a +restart. A schedule that came due while the daemon was stopped runs once +at the next start, with its original time and a line that says that the +run is late. A repeating schedule that missed several times runs once. A +crash just after a run goes to the chat can make the run repeat once. + ******* Probe *******