feat(elder): @Elder merges a thread's delivers when asked (#26)

This commit is contained in:
Smokey committed 2026-10-28 05:40:22 -06:00
1 parent b43cb8c2cc
commit 77b33cbe6d
2 files changed
+70 -2

No files matched your search

+51 -2
View File
@@ -28,9 +28,14 @@ KIND: deliver (here is the result)
KIND: decline (with a reason)
Then, on the next line, your message text.`
// nestMembers lists who may be addressed in a nest: its crows plus the owner.
// serviceRoles are addressable in a nest but never members: they only act when
// a crow's or the owner's message asks them to.
var serviceRoles = []string{"Elder"}
// nestMembers lists who may be addressed in a nest: its crows, the owner, and
// the service roles.
func nestMembers(nest Nest) []string {
return append(append([]string{}, nest.Crows...), "owner")
return append(append(append([]string{}, nest.Crows...), "owner"), serviceRoles...)
}
func (s *Server) getNestMessages(w http.ResponseWriter, r *http.Request) {
@@ -179,6 +184,8 @@ func (s *Server) postNestMessage(w http.ResponseWriter, r *http.Request) {
switch {
case mode == "conspiracy" && invited > 0:
go s.respondConspiracy(nest, record, invited)
case record.To == "Elder":
go s.respondElder(nest, record)
case slices.Contains(nest.Crows, record.To):
go s.respondToRequest(nest, record)
}
@@ -308,6 +315,48 @@ func (s *Server) respondOne(nest Nest, req Message, crow string, lens bool) {
}
}
// respondElder merges the reports on a thread: the Elder only speaks when a
// message asks it to (CHATROOM_SPEC section 6 — synthesis is requested, not a
// fixed step). It answers whoever opened the thread it merges.
func (s *Server) respondElder(nest Nest, req Message) {
if req.RefersTo == "" {
return
}
target, found := s.msgs.ByMsgID(req.RefersTo)
if !found {
return
}
var reports []string
for _, m := range s.msgs.ReportsTo(nest.ID, target.MsgID(), "deliver") {
if slices.Contains(nest.Crows, m.Author) {
reports = append(reports, "["+m.Author+"] "+m.Text)
}
}
if len(reports) == 0 {
return
}
budget := &Budget{name: "elder-merge", limit: s.p.G.TokenBudgetPerItem}
system := systemFor("Elder", elderSystem, true)
prompt := "REQUEST: " + target.Text + "\n--- reports to merge ---\n" + strings.Join(reports, "\n--- \n")
answer, err := s.p.Flock.ask(s.ctx, nil, "Elder", system, prompt, budget)
if err != nil {
return
}
reply := Message{
NestID: nest.ID,
Kind: "deliver",
Author: "Elder",
Text: strings.TrimSpace(answer),
To: target.Author,
RefersTo: target.MsgID(),
TaggedBy: "harness",
Timestamp: time.Now().UTC().Format(time.RFC3339),
}
if record, err := s.msgs.Append(reply); err == nil {
s.emitNestMessage(record)
}
}
// checkDivergence asks Jev whether this deliver restates earlier delivers that
// answer the same request. Above the band the crow gets a review nudge; the
// deliver itself stays in the log (nudges never silence).