Skip to content

FlyBot v0.2.8

Choose a tag to compare

@github-actions github-actions released this 26 Oct 01:37
· 132 commits to main since this release
7fdb808

Added

  • Each Bot keeps a task list it updates from the conversation, and a board shows Not started, In progress and Done for that Bot, a child Bot, and — for a group admin — the tasks member Bots are tracking in the group (#1058).
  • Settings → Bot Social now lists friends and links each of your Bots to People with access, so sharing and revoke are findable without opening each Bot first. Add friend stays on the + menu, and the same panel is also on that page (#1074).
  • A group's Tasks board shows one overall task and the per-Bot subtasks under it. Bots record that plan with track_tasks, continue the highest-priority unfinished task, and ask the user or the group when a task is waiting on an answer (#1099).
  • A Bot with unfinished conversation tasks keeps working without a new message. The host starts a continue turn for the next task, in that Bot's own chat or in the group session that owns the subtask, and stops when the work is done or waiting on an answer. In a group, members with their own subtasks are woken in the same pass (#1109).
  • A task that names the issue or PR it came from now says where your answer goes, and the Bot writes it there itself (#1154): the result card shows a Comment goes to … link, accepting or sending back leaves one comment for the Bot to post with its own GitHub connector, and a comment that could not be posted says so once on the card instead of failing silently.
  • The team can set quiet hours — a window (off by default) that a new or edited scheduled task's time must fall outside, checked when it is saved rather than at delivery: a task inside the window is refused with a sentence naming when it ends, and nothing is created or moved. Repeat and cron tasks are still allowed and the page says they may run inside the window, because DSH decides when they fire (#1166).
  • The task board dialog gains a Delivery view (#1173): one read-only snapshot of the repository's GitHub issues, pull requests and CI runs, in five columns — original issue, ready to start, in progress, in review, and done today — with a verdict/CI badge per pull request and a header that reports today against the last 7 days. It is repository-wide, so the per-Bot rail does not appear, and it never writes to GitHub: the host serves a cached snapshot built only from GET requests, and the token stays host-side. The view replaces the board with one honest line when no GitHub connection is set up.
  • A CI scan (.github/scripts/check-mojibake.mjs) now fails a pull request whose tracked text files contain U+FFFD — the three bytes EF BF BD a lossy decode writes in place of every character it could not read — and names each file with its occurrence and line counts, so the fix reads as "regenerate", not "retype the text". Binary assets are skipped by content (a NUL byte in the first 8 KiB), which is the rule that makes the gate usable at all: decoding the tree instead reports 22 binary files and ~2,065,422 replacement characters on a clean main. AGENTS.md now says why a file rewritten from an outside source, or regenerated, is re-read as bytes and re-encoded by its generator. See #1188.
  • A Bot can be spoken for by a supervised external process in rooms (#198): create_bot takes an external block (driver: subprocess, an argv array, optional cwd and env), and room-participant.js routes that member to a new driver while every other member keeps its DSH Session. The process is started per room and Bot, answers one JSON line per turn, and its start, clean exit, crash and timeout are explicit states — a crash is posted as the Bot's own line in the room, and a turn that reaches a dead process ends with a failure instead of silence.
  • A finished task can now be accepted or sent back right in the inbox (#401): the result card shows the Bot's evidence links and model, Accept closes the task as done, and Send back asks for one line about what should change and returns the same task to the Bot.

Changed

  • Removing one of a friend's Bots now says which link keeps the friend in the list: the question names the Bots of theirs that are still shared ("Bob stays a friend: still shared through Writer."), instead of only saying the owner is not unfriended and leaving the row unexplained (#1001).
  • The new-chat menu offers joining and starting as two rows, so one label no longer names both: Join by number or link carries the number and the invite link, and Start a face-to-face room opens the same screen under its own name without the link and scan fields, because those are ways into a group that already exists (#1021).
  • A fresh 6-digit code no longer answers with an empty-result line. When nobody is waiting, the dialog's primary line is Start a new room with … and Start a new room is the first button; the note under it still says to ask for an invite link if that room already opened (#1053).
  • A face-room line the server sends without an event_id is still keyed by the line itself, but the key now carries a bounded digest of the text instead of the whole sentence: seen lives in the owner's settings, so on a server that stamps no ids it would otherwise fill up with a copy of the conversation (#1062). The key stays stable across polls, so the duplicate #1045 fixed does not come back.
  • A Verdict: now counts only when the workstation that claims to have written it signed it: each reviewing workstation holds one Ed25519 private key, its public key sits in .github/agent/signers.json, and the gates verify Signed-by: / Nonce: / Signature: offline over the pull request, the full tip SHA, the verdict and the workstation — so a PASS written in a Reviewer's name on the shared account is no longer a conclusion, it is listed as unverified (#1110).
  • The social panel's group and dock surfaces are usable at phone width: below 640 px its buttons and inputs (including the invite-preview and waiting-room footers) are 40 px tall, its row controls at least 32 px, a long unbroken run in a held reply wraps inside its card, the dock clears the home indicator, and the phone block now closes the stylesheet so no later rule of equal specificity can override it (#1147, #1149).
  • A group picks one task lead to divide the board. That Bot, or the admin when none is picked, assigns each part; the card is claimed and the assignee starts it in the group without waiting for a confirmation. A question stays in the group (#1182).
  • The merge gate now refuses a tip whose only review is a comment from the pull request author's own GitHub account. A PASS from that login counts when the comment header carries Attestation: <full sha> role=<Bot> for this tip, the role matches Written-by, and the role is not an Owner of the pull request. A review posted by a different GitHub account is unchanged (#644).

Fixed

  • Accepting a friend's invite again now shares your Bot back with them (#1000): the two of you can message each other right away instead of one direction staying silently absent until they share again.
  • Coming back to a group nobody has spoken in yet shows the invite link the room already has, instead of minting another one on every visit — the strip now reads the room's links first, as the Members card does, counts a dated link live until its deadline passes, and never keeps the previous room's link when the dock moves to another group (#1019).
  • Re-accepting an invite from a Bot Social server whose invite info names no bot_id now grants to the peer id list_friends lists instead of a friend_home the server never receives (#1024): the pair becomes two-way again, and when no listed friend names that home the accept no longer claims a share that did not happen.
  • A window that showed the Bot team read-only because another dsh held state.lock now takes the lock on its next write once that window closes, instead of staying read-only until a state read happened to refresh it (#1027). New work that changes the state outside a request belongs in rt.mutate(fn), which follows what the other host left before applying the change, so neither side's work is lost.
  • The Add friend result no longer stacks a second "Your" on a Bot whose owner already named it that way — a Bot called Your Bot reads as "Your Bot is shared back, so they can reach you too." instead of "Your Your Bot …" (#1037).
  • The group strip no longer offers Invite by link before it has read the room's own links, so a fast click cannot mint a second ticket the panel was about to discover, and a chat that draws no strip (a face room, a Bot chat, a chat with turns) no longer issues that read at all (#1038).
  • A turn that dies before writing anything is no longer invisible: when a model call is refused (a provider budget cap, a 429), the chat shows one line naming the provider's own error above the composer, and a run of them says how many turns in a row died, so a quota outage reads as an outage instead of a Bot that chose to stay silent. A turn that already wrote text adds no line, and a completed turn clears the count (#1044).
  • A face-room line the server sends without an event_id is posted into the room once: the poll keys it by the line itself (type, sender, server time, text), instead of appending a second copy on the next poll — the duplicate the room drew as the same sentence twice, often seconds after both people had left (#1045).
  • A window that was read-only only because the other dsh had the team open now takes the free lock for the writes that were still inline, instead of dropping them or refusing with the read-only error: a friend's first line and the unread mark, a team exchange, and every DSH Agent change (add, adopt, archive, remove). The change the other host left survives, because the write adopts and re-resolves its records before it applies (#1048).
  • Typing a room number that is not exactly six digits keeps Join disabled and shows "Enter 6 digits" under the field (Chinese: 请输入 6 位数字). An empty field stays quiet, and six digits still join (#1052).
  • When someone accepts your invite, the sidebar says who joined and People with access lists them even if the grant list is still empty, with one step to ask them to share a Bot back (#1054).
  • Two identical lines from one person inside the same second in a face room now both appear: a line the server stamps in whole seconds is told apart by its own cursor (or, without one, by its place in the snapshot) instead of being read as the same line twice, so the second one is no longer dropped (#1063).
  • A group invite link seats the guest's Bots when they claim it, even if the accepting knock never arrives, and the group opens in the guest's sidebar. A claim the host cannot finish is named on the group's Members card (#1064).
  • A friend DM shows when the other home's Bot could not reply (for example it has no API key) instead of staying on "Weighing the options…" (#1068).
  • A friend's Bot that shares a local Bot's display name no longer wears that local Bot's picture: two default Chiefs both store the blue whale, and the friend's row now steps to a different shape while the local Chief keeps its own look (#1069).
  • A face room that Bot Social no longer lists is marked Closed on the hosted room, so it leaves the active sidebar list and stays as one Past rooms row. When Bot Social sends closed_at, that time is the row's time on every home (#1070).
  • People with access asks before Revoke (Revoke <name>? with Revoke and Keep, naming the rooms that share is used in), and the row separates the handle from "In use in N rooms" with a middle dot (@handle · In use in 3 rooms) instead of running the two together (#1073).
  • Enter chat in a face-to-face room no longer shows "internal error" after the other person has joined. The start request sends an empty JSON body, which Bot Social accepts (#1085).
  • Dismissing an Enter-chat error and typing in the room composer no longer shifts the window sideways. The page and the app frame cannot scroll horizontally, and the error toast stays inside the viewport (#1086).
  • A friend's direct chat says "Waiting for their approval" (等对方批准) while you wait for their reply, instead of a generic thinking line such as "Sorting out the details…", so a reply their home is holding for approval is not presented as this side still working it out (#1087).
  • A friend's Bot in the @ menu and in a mention chip uses the same picture as its sidebar row. A face-room Chief no longer shows a handle-seeded green moon there while the sidebar shows the stored blue whale (#1088).
  • A face room you start alone shows your Chief's own avatar in the room header, instead of a blank grey circle, until someone else joins (#1089).
  • A message no longer disappears when the team's next write fails. The friend-line mark and the exchange record are written before the message is handed to the Bot, so a failed write (another window took the team over, or the disk refused) used to drop the whole line; now it is logged once and the message still arrives (#1096).
  • Face lobby names and face-room titles stay readable. Labels under the avatars wrap, and the sidebar, header, and session title show both names instead of cutting the second one to an ellipsis (#1102).
  • When the other side leaves a face room and that leave closes the room, the room says so once: the "left the room. Room closed." banner is the only line, so the short platform leave no longer appears next to it. A leave that leaves the room open still posts its short line (#1103).
  • Ordinary group lines to a friend's Bot no longer keep stopping on "Waiting for approval" after Auto-send is on for that pair (the card's Auto-send from now on, or Sharing → People with access). A line Bot Social held only because the text looked like an instruction (a word such as "token", with no secret, file, or instruction-override) goes out; a real finding still waits for approval (#1113).
  • An ordinary @ or reply in a shared group no longer stops on "Waiting for the owner's approval" when the other home has not turned Auto-send on. Seating both Bots in the room is the consent for that text. A file, a DLP finding, a risk flag, or an instruction-override still waits for approval. A face-room line held as policy still waits for the owner (#1118).
  • Starting FlyBot on DSH no longer stops before the Main Bot is ready: the task drive registers its handle with Cordis provide instead of a property write the host rejects (#1120).
  • A Bot that already shares a live local group, including a group a link seated, can @ the other home's seated Bot with the @…home mention, and each successive line is delivered in the group, without a separate Sharing grant. A direct message to a Bot outside every shared room is still refused, and leaving the group restores that refusal (#1126).
  • A Bot's existing group sessions follow a model change, including when the record already says that model is applied, so a turn no longer asks a provider the Bot was moved off (#1127).
  • Share with a friend used to report success for a Bot the other home no longer runs. A row whose Bot is gone from the roster that home is still listed in now says so — <Bot> was removed from that home. Sharing with it cannot reach anyone. — and its Share is disabled; a click that still reaches the host is refused with bot/removed-bot and sends no grant, so the list stops claiming a share that would reach nobody. The row is judged on both the peer id and the handle (list_remote_bots entries carry both), and a home missing from the cached roster, or a roster read that failed or came back empty, decides nothing — it shares as before rather than guessing (#1128).
  • Needs you rows in the Inbox can be answered there. An ask_user card shows its options and a short answer — one option sends at once, a multi-select toggles until Submit — a task that is waiting on input takes a short answer, and a listed tool approval still clears with Allow once or Reject, so Open is not the only way through a group that has no card (#1140).
  • A group @ inserts the seated Bot's name, and Bots that share a live group can message each other without a separate friendship. A deleted friend home is dropped from the room and its chat is hidden (#1141).
  • Two controls in the social panel that stayed at their desk size on a phone are now touch-sized: the face-to-face room header's small buttons are 40 px instead of 22 px, and the account menu's links keep a 40 px hit area instead of collapsing to a 12 px text run (#1156).
  • A group invite link seats the joiner even when the host's FlyBot has been open, and the joiner's sidebar shows the group. The host was re-reading every open link on each inbox poll and, once Bot Social answered "Too many attempts. Try again in 10 minutes.", previewing again before that cool-down elapsed, so a new claim was never seen; a room share whose text was outside 1–4000 characters was refused, and a join that stayed on an approval card was treated as already sent. (#1161)
  • The external room driver now ends a stop it is ignored: after { type: 'stop' } and a SIGTERM grace it escalates to SIGKILL, and a seat whose stop is still in flight is never handed the next turn, so a child cannot outlive its membership. A crash line carries the last ~200 characters of the child's stderr (flattened and capped) instead of only exit N, and the room-turn timeout reads as "timed out" rather than "process timeout" (#1164).
  • Removing someone's Bot from a shared group now drops that room on their home. The other home was still listing the room and could keep receiving and sending in it, because the leave was sent only after the seat had already gone and a later line could open the room again. (#1167)
  • A decision comment that never went out now stops asking for it (#1172): after two wakes the reminder ends, and a day later the card says the comment could not be confirmed instead of the Bot being woken about it for ever. A task that is still real work keeps waking the same way.
  • Pasting a group invite link for a room this home already holds no longer ends on "Asked to join": the preview now says the group is already in the sidebar and draws no Join card, when the link seated the room and when the host added one of these Bots to it by add-member (#1176).
  • Needs you cards in the Inbox show the whole ask. The title and the reason wrap, including on a phone, so a sentence is not cut off before the in-place answer (#1177).
  • The delivery board links an issue to a pull request only when the pull request closes it, and a verdict past the first hundred comments still decides the badge (#1189).
  • The quiet-hours warning on the Scheduled tasks page now renders the host's quietUnchecked flag instead of scanning the task list a second time (#1199), so the line and the check cannot drift apart, and it still appears at once after the window is switched on. The subsystem page no longer calls the window one team-wide clock: a task's due time is read in that task's own zone.
  • A group turn shows a character-budgeted room history, with long CI and merge essays collapsed, and a compact task-board snapshot. Assigning, claiming, and progress go through that board (overall task, subtask, assignee, column, and progress); @ only wakes a member (#1203).
  • A group card wakes its assignee in that Bot's own chat. Assigning, progress, and handoff are board writes; the group stays quiet, and a Bot @ whose open card already shows the line passes (#1205).
  • An @ that could not reach the other home used to be swallowed: when a person's line had to go out as the old envelope on a server that stamps typed lines, the other home read it as a Bot's line, so the named Bot was never called and only a log line said so. The room now gets one quiet notice naming the friend's Bot whose call was lost (No call went out for @x: this connector token may not attest typed lines, so the other home reads this line as a Bot's.); the words still go out, a probe that did not answer adds no notice, and a server that cannot stamp keeps the old behaviour where the labels still call the Bot (#997).