Skip to content

FlyBot v0.2.4

Choose a tag to compare

@github-actions github-actions released this 22 Oct 21:37
· 401 commits to main since this release
177d0ff

Added

  • A plugin the host allows to make a model call can now also get its own default model: flybot.modelFor ({ '<plugin>': '<provider/model>' }) is used when the call does not name one, so a host can keep a cheap plugin cheap while the rest of the team stays on the team default. A plugin the host did not name is unchanged, a model the call names still wins, and an entry that is not a non-empty string is ignored rather than passed through (#579).
  • A Copy report button on the timeline turns the window into a short Markdown run report — per Bot its turns and failures, busy share, tokens, top tools and unanswered requests, then the team rollup and the longest open wait — and copies it with one click, in the same hours the panel shows (#582).
  • A new read-only timeline/alerts endpoint turns the timeline window into durable alerts: a Bot that fails most of its turns (errors), a Bot whose request went unanswered (waiting) or a handoff that has waited past 15 minutes (stuck) opens one alert that records when it started, and the alert resolves itself when the condition clears and stays readable for a minute after. Polling again never opens a second copy, a look-back window never resolves a live alert, and nothing new is written to the trace (#584).
  • bot_schedules lists every scheduled task of the calling Bot across all of its sessions — its own chat, the earlier parts of it, and the group chats it speaks in — with each task's next run, state and owning session, so a task the owner sees in the UI can no longer look missing from the one session a Bot happens to be in (#628).

Changed

  • Every one of your own Bots now gets your saved keys (such as $DSH_SECRET_GITHUB_TOKEN) and your connector tools (GitHub, Composio) on every turn: group rounds, Bot-to-Bot messages, scheduled turns, turns of a Bot you share with a friend, and work a Bot does in a sub-agent. The "also when others use it" connector switch is gone; each Bot keeps one on/off switch per connector. A friend's Bot still never gets your keys or connectors, and a key you set to Chosen Bots still goes only to those Bots. Bots now use the GitHub connector first and the shell token only as a fallback, for example for git push (#601).
  • Typing two or three short lines in a row in a Bot's own chat now opens one turn instead of one turn per line: the host holds the lines for 1.5 seconds and hands them over together, in the order they were typed, each on its own line. A line sent while the Bot is already answering still lands on its own, and a group chat is unchanged (#642).
  • Making a Bot or a group chat no longer starts a turn: a new Bot is sent no greeting and waits in the sidebar until you write to it or a parent Bot messages it, a new group posts no opening round, and picking a Bot's model applies it without speaking to the Bot. Text you type in the composer before creating a Bot is sent to it as your first message, so it answers you, and it is never saved as the Bot's instructions; making a team costs no model turn (#645).
  • Bots stay idle until you address them, they are @-mentioned in a group, or their parent Bot gives them a task: the prompt no longer tells a coordinator to dispatch work or a Bot to report and claim on its own, so a team with nothing to do stops producing status traffic, while a Bot that is addressed answers exactly as before (#699).
  • list_children now describes the routing fields it already answers (#733): load for every child, and openForMs/stalled for a child with an open turn, so a coordinator can send new work to an idle child instead of learning the shape from the implementation.

Fixed

  • list_bots tags a Bot whose outbound message waits on the owner's decision with a count (Writer (Write, 1 to approve)), so a coordinator sees who is blocked instead of an idle-looking roster. The tag is a count only — never the held message's text — and clears once the owner decides (#587).
  • turn-origin now treats a message source kind it does not recognise as other instead of "nobody's request", so an unknown or future source arriving in a Bot's own chat no longer inherits the owner's standing approval: only DSH's own notice kinds and the documented mention/handoff cases carry no verdict (#620).
  • A Bot-to-Bot message that repeats what the same sender already delivered to that Session within the last minute now makes one turn instead of two, and the drop is recorded in the host log as delivery: dedupe <sender> -> <session>; a relayed conclusion no longer stacks up in a coordinator's queue twice, while the same line to another Session (a group copy, another Bot) is still delivered (#641).
  • A Bot's shell now says which saved key it withheld and why, instead of looking like the key was never saved: DSH_SECRETS_WITHHELD lists NAME:reason (never a value), list_secrets and request_secret name the same reason, and a key the owner scoped to one Bot still reaches that Bot's own scheduled turn while it is shared (#651).
  • A Bot whose saved key is withheld on a turn can run its shell again: DSH_SECRETS_WITHHELD is now declared to the shell environment, so the bash call no longer fails with "undeclared key" (#653).
  • On the newer DeepSeek Harness (0.2.1-alpha.1) the composer's run-stats footer is no longer a single stats entry — the turn and step counts moved into an activity pill — so FlyBot's "1 turn" / "1 step" wording stopped replacing the shell's "1 turns 1 steps". FlyBot now wraps whichever counts pill the installed shell publishes, on both versions (#659).
  • A message to a friend's Bot right after that friendship was removed is now refused at once with the usual not a Bot a friend shared with you reason, and the Bot leaves the list, instead of being held for approval and then lost when the approval is clicked: the send policy asks Bot Social about the friendship itself rather than trusting the cached roster, and a removal event drops that cache (#666). The same check runs again when a held card is approved, so a line whose friendship was removed while the card waited fails with a reason instead of being sent into a refusal.
  • Creating a Bot from the composer now always opens the new Bot's chat: if sending the line you typed as its first message fails, you land on that chat with the failure shown instead of on a card that answers "a Bot with that name already exists". An older team's setup line ([Bot team setup]) is no longer drawn as a message from the parent Bot in the current part of its chat, matching how the earlier parts already hid it (#698).
  • The multi-pane layout no longer overflows a narrow window: the Details panel shrinks before it starves the conversation, every pane can shrink, and long values wrap, so nothing is clipped and no blank strip is left between the panes (#705).
  • Deleting a Bot now drops its open-turn records from the tree's load tracker. The tracker used to keep counting the deleted Bot forever, so a coordinator could read a Bot that no longer exists as busy (#732).
  • A hold that arrives with the status pending_approval — the spelling Bot Social's own outbound hold already uses — is now treated as waiting by both places that draw it: the held-reply card keeps its Approve / Reject buttons, and the approvals overlay offers the same decisions instead of drawing a settled "Not sent" note, so such a hold can no longer become unanswerable. One shared rule (pending and pending_approval wait; approved, auto, failed and a missing status do not) decides it, and a failed send still reads "Not sent: delivery failed" with Retry (#734).
  • A Bot whose Auto-send is on for a friend no longer goes silent: a line the Bot sends is delivered, instead of waiting on Bot Social's own outbound approval with no card anywhere to decide it. The send path now clears that hold itself, the way a typed line and a face-room Auto-send line already did, and only when Bot Social named no DLP finding on it — a flagged line still waits on its owner's card, exactly as with Auto-send off (#737).
  • A hold whose status is pending_approval is now answered by the host the same way the client draws it: Approve and Reject go through instead of being refused as "already decided", the reply's bubble stays a waiting card instead of reading "Not sent", the hold counts against the approval cap, is not cleaned up while it waits, and counts toward the Bot's wait badge. Host and client now read that judgment from one module, so the two spellings of "waiting" cannot be added on one side only (#754).
  • Durations in the run report no longer overflow their own unit: a wait of 59.6 s reads 1m instead of 60s, and 1h59m50s reads 2h00m instead of 1h60m (#761).
  • The first Main Bot created during onboarding, and a duplicated Bot, are now announced to plugins like any other new Bot, so @flybot/tree adopts them immediately instead of only after a restart (or not at all, if the server had been running before the first open).
  • Auto-send now clears a Bot Social hold only when Bot Social held the line for its blanket approval rule alone: a reason it does not know, dlp.blocked, or any risk flag keeps the line on its card instead of sending it without the owner, and a hold the server has not listed yet is logged with its approval id instead of failing silently (#766).
  • Hiding a friend's Bot chat from the sidebar ("Hide from sidebar") now sticks: the remote-chat sync no longer clears that hide on the next publish of the friends' list, and a hide the user set now survives the Bot leaving the published list and coming back, while a chat whose Bot left still disappears and a returning Bot still reappears (#611, #631).
  • A part switch now saves the new segment, the pointer and the rescued mark before the handoff turn can start, so a failure in that turn can no longer begin a second switch against an uncommitted part — which lost the previous part's handoff note and dropped the messages the second move should have left out; a failed handoff still rolls back to the old part, keeps its input and can be rescued again (#751).
  • A part switch that fails (a save error, or the fresh Session cannot take the handoff) now leaves the old part current and hands the stopped turn's input on there, instead of opening an empty fresh part with no handoff package and dropping the input (#740).
  • A turn that finished while the plugin was not listening (a plugin reload, or a crash right after DSH recorded the end) is no longer picked up as "restarted while you were working" and repeated: the durable Session log decides, and only a turn the restart really cut is resumed.
  • A restart's pickup no longer loses the work it was about to resume when a delivery fails or the app stops during the pickup: the inflight notes stay until each turn or queued message is handed over successfully (#747).
  • Approving every waiting card now works for Bot Social holds too (the button was missing or skipped them), and a local hold whose send failed reads Not sent with its error and a Retry instead of offering Approve / Reject that silently do nothing.
  • The Bot Social settings file no longer grows forever with one entry per approval hold ever seen: a decided, rejected or gone hold drops its waiting-notice entry, so the ledger stays as small as the pending queue.
  • A Bot's role label for a face-to-face room is retried when the room refuses it (a dropped request or a server error) instead of being counted as sent and never synced; a room that is forgotten clears its per-seat role marks.
  • Sharing a Bot with an existing friend now works on a Bot that has never been invited or shared: opening Share with a friend registers the Bot's Bot Social identity on demand instead of failing with “has no Bot Social identity yet”.
  • Switching the Bot Social server now turns that server's face-to-face rooms into read-only past rooms instead of leaving them open and accepting lines that can never be delivered, and a line sent to an ended room is refused with a clear message (#729). Only a change of address counts: renaming this home on the same server leaves that server's rooms open, and a switch that fails ends none of them.
  • OTLP export no longer drops a span whose record shares the millisecond the previous batch ended on (a tool call that ends at the same millisecond it started, or a turn ending at the last record's time): the export cursor re-reads records at its last timestamp and deduplicates spans by id.
  • A strict OpenAI-compatible gateway no longer rejects the whole chat: every tool FlyBot registers now sends an explicit required (empty when nothing is mandatory) and properties (empty when it takes no parameters), so an argument-less tool such as bot_schedules or list_bots cannot turn the tool list into Invalid schema for function 'bot_schedules': null is not of type "array". Tools whose schema comes from an MCP server are passed through by DSH and are not covered by this change (#768).
  • Deleting a former Main Bot (after handing the role to another Bot) no longer flattens the team: its children move to the current root (or a fresh Root when there is none), so exactly one root remains and the new Chief's list_children and replies keep working (#725).
  • Renaming a Bot (or editing its role) now reaches the tree prompts on the next turn: a coordinator no longer calls a child by its old name, and a renamed Bot sees its new name in its own prompt, instead of waiting for a restart.