Versions in this module Expand all Collapse all v0 v0.2.11 Oct 19, 2026 Changes in this version + const CopyMaxBytes + const CopyUsage + const DefaultView + const FlowAck + const FlowBlocks + const FlowChain + const FlowEventCap + const FlowNodeBoard + const FlowNodeCourier + const FlowNodeFleet + const FlowNodeListener + const FlowNodePane + const FlowPrompt + const FlowReply + const FlowStatus + const FlowUndelivered + const FormatHTML + const FormatPDF + const OutputDirEnv + const OutputUsage + var ErrNeedsFormat = errors.New("output needs a format: html or pdf (e.g. ##board output 5 pdf)") + var ErrNoPDFConverter = errors.New("no PDF converter found (install Google Chrome/Chromium or wkhtmltopdf)") + var UsageLines = []string + func ConvertPDF(htmlPath, pdfPath string) error + func CountViews(ts []Thread) (status, prompt int) + func DefaultOutputDir() string + func FlowBoardNodeID(b string) string + func FormatItems(items []Item) string + func IsPromptThread(t Thread) bool + func ItemByWorker(it Item, worker string) bool + func ItemClock(ts int64) string + func NoMessagesLine(worker string) string + func NormaliseComm(c string) string + func OpenFile(path string) error + func OutputFileName(board, worker string, n int, now time.Time, ext string) string + func OutputSummary(picked, matched int, worker, path string) string + func PDFConverter() (kind, path string) + func RenderFlowDeps(d FlowDeps) []string + func RenderFlowDepsFit(d FlowDeps, maxRows int) []string + func RenderHTML(p HTMLPage) ([]byte, error) + func RenderTeam(f Flow, nowMS int64, depRows int) []string + func SanitiseBody(s string) string + func SanitiseInline(s string) string + func StatusTone(value string) string + func TeamCounts(f Flow) (members, blocked int) + func TeamGoalCell(r TeamRow, nowMS int64) string + func TeamGoalReport(f Flow) string + func TruncationNotes(r *QueryReply) string + func WriteOutput(req OutputRequest) (string, error) + type CopyResult struct + Matched int + Picked []Item + Text string + Total int + Worker string + func BuildCopy(r *QueryReply, worker string, n int) (CopyResult, error) + func BuildCopyItems(items []Item, worker string, n int) (CopyResult, error) + func (c CopyResult) Summary() string + type ErrNoMessages struct + Worker string + func (e ErrNoMessages) Error() string + type Flow struct + Board string + Edges []FlowEdge + Events []FlowEvent + Nodes []FlowNode + Stats FlowStats + func BuildFlow(boardID string, threads []Thread, panes []FlowPane) Flow + type FlowDepCycle struct + Members []string + Waiting int + type FlowDepNode struct + Activity string + Also []string + Children []FlowDepNode + Health string + ID string + Label string + Repeat bool + Waiting int + Work string + type FlowDeps struct + Blocked int + Cycles []FlowDepCycle + Roots []FlowDepNode + func BuildFlowDeps(f Flow) FlowDeps + func (d FlowDeps) Bottleneck() *FlowDepNode + type FlowEdge struct + Answered *int + Count int + From string + LastTS int64 + LatencyMS *int64 + Open *int + To string + Type string + Undelivered *int + type FlowEvent struct + CmdID string + From string + Kind string + Summary string + TS int64 + Thread string + To string + Type string + type FlowNode struct + Activity string + BlockedBy []string + Comm string + GoalEta int64 + GoalPct *int + GoalState string + Health string + ID string + Kind string + Label string + Parent string + Posts int + Role string + Task string + Work string + type FlowPane struct + ID string + Meta map[string]string + Name string + func FlowPanesFromSnapshot(s *domain.WorkspaceSnapshot) []FlowPane + type FlowStats struct + Answered int + Blocked int + Open int + Panes int + Prompts int + Status int + Undelivered int + type HTMLPage struct + Board string + Loc *time.Location + Matched int + N int + Now time.Time + Picked []Item + Total int + Worker string + type InboxItem struct + AckTS int64 + Answered bool + CmdID string + File string + From string + FromPaneID string + TS int64 + Text string + ThreadID string + func FindCommand(r *QueryReply, paneID, cmdID string) (InboxItem, bool) + func Inbox(r *QueryReply, paneID string) []InboxItem + type Item struct + Post *msg.MsgBoardPost + Reply bool + ThreadKey string + func Flatten(r *QueryReply) []Item + func FlattenWhere(r *QueryReply, keep func(*msg.MsgBoardPost) bool) []Item + func Select(items []Item, worker string, n int) (picked []Item, matched, total int) + type ItemArgs struct + Board string + Format string + N int + NoOpen bool + Out string + Worker string + func ParseItemArgs(args []string, output bool) (ItemArgs, error) + type OutputRequest struct + Dir string + Format string + Open bool + Page HTMLPage type QueryReply + func FilterReply(r *QueryReply, v View) *QueryReply + func ItemsReply(r *QueryReply, picked []Item) QueryReply + type TeamRow struct + Activity string + BlockedBy []string + GoalEta int64 + GoalPct *int + GoalState string + Health string + ID string + Label string + LastPost int64 + Role string + Task string + Work string + func TeamRows(f Flow) []TeamRow type Thread + func FilterThreads(ts []Thread, v View) []Thread + type View string + const ViewAll + const ViewFlow + const ViewPrompt + const ViewStatus + const ViewTeam + func ParseView(s string) (View, error) + func (v View) Keeps(t Thread) bool v0.2.9 Aug 16, 2026 v0.2.7 Aug 16, 2026 v0.2.6 Aug 15, 2026 Changes in this version + var ErrNoRecorder = errors.New("board: the recorder did not answer") + func IsStandaloneKey(key string) bool + func ServeQueries(nc *nats.Conn, storeFor func(board string) *Store, live LivePanesFunc) ([]*nats.Subscription, error) type Event + Board string + type LivePanesFunc func() (map[string]bool, error) + type PersistenceFor func(board string) *Persistence + func SingleBoardPersistence(board string, p *Persistence) PersistenceFor + type Query struct + Limit int + Since int64 + type QueryReply struct + Err string + Filtered int + Roster []RosterEntry + RosterReconciled bool + Stats Stats + Threads []Thread + Withheld int + func Answer(s *Store, q Query) QueryReply + func Ask(nc *nats.Conn, board string, q Query, timeout time.Duration) (*QueryReply, error) type Subscriber + func (s *Subscriber) DroppedFor(board string) uint64 v0.2.5 Aug 9, 2026 v0.2.4 Aug 9, 2026 Changes in this version + const DefaultBufferSize + const MaxPosts + const RetentionMaxBytes + const RetentionTTL + func BucketConfig(session string) *nats.KeyValueConfig + func BucketName(session string) string + type Event struct + Kind EventKind + Post *msg.MsgBoardPost + Register *msg.MsgBoardRegister + type EventKind int + const EventPost + const EventRegister + type KV interface + Get func(key string) (nats.KeyValueEntry, error) + Keys func(opts ...nats.WatchOpt) ([]string, error) + Put func(key string, value []byte) (uint64, error) + type Persistence struct + func NewPersistence(kv KV) *Persistence + func (p *Persistence) Restore(s *Store) (posts int, registrations int, err error) + func (p *Persistence) SavePost(post *msg.MsgBoardPost) error + func (p *Persistence) SaveRegister(r *msg.MsgBoardRegister) error + type RosterEntry struct + PaneID string + Persona string + TS int64 + type Stats struct + Duplicates uint64 + Evicted uint64 + Posts int + Provisional int + Threads int + UnknownVersion uint64 + type Store struct + func New(max int) *Store + func (s *Store) Apply(p *msg.MsgBoardPost) bool + func (s *Store) ApplyEvent(ev Event) + func (s *Store) Register(r *msg.MsgBoardRegister) + func (s *Store) RetainRoster(livePaneIDs map[string]bool) + func (s *Store) Roster() []RosterEntry + func (s *Store) Stats() Stats + func (s *Store) Threads() []Thread + func (s *Store) VersionCounts() map[int]int + type Subscriber struct + func Subscribe(nc *nats.Conn, codecs *msg.CodecRegistry, buf int, persist *Persistence) (*Subscriber, error) + func (s *Subscriber) Close() + func (s *Subscriber) Dropped() uint64 + func (s *Subscriber) Events() <-chan Event + func (s *Subscriber) WriteErrors() uint64 + type Thread struct + Key string + Provisional bool + Replies []*msg.MsgBoardPost + Root *msg.MsgBoardPost