package backthink import ( "fmt" "git.yeij.top/AskaEth/Cyrene_v2/internal/bus" "git.yeij.top/AskaEth/Cyrene_v2/internal/iot" ) // Bus subjects the service subscribes to for event-triggered thinking. They are // the contract defined by design/12 §1: an IoT state change, a reminder firing, // or a generic system event. const ( // SubjectReminderTrigger is the bus subject on which reminders fire. SubjectReminderTrigger = "reminder.trigger" // SubjectSystemEvent is the bus subject for generic system events. SubjectSystemEvent = "system.event" ) // SystemEvent is the optional typed payload a caller may publish to // SubjectSystemEvent to convey a system notice. Import defaults to Normal. Under // design/12 §6 策略一, a low-value system notice (a join/leave ping, generic // platform noise) is downgraded to a registration-only record and does not wake a // full thinking pass; only a high-importance (owner-relevant) system event thinks, // so a busy public platform cannot trigger a flood of expensive reflections. type SystemEvent struct { Summary string Import Importance } // Trigger describes what woke a thinking pass: the source subsystem, a // human-readable summary and the event's estimated importance. type Trigger struct { Source string Summary string Import Importance } // heartbeatTrigger is the periodic, low-importance trigger. Low importance means // the pass rarely interrupts the user, honouring "默认不发送 chat 类型消息". func heartbeatTrigger() Trigger { return Trigger{Source: "heartbeat", Summary: "periodic autonomous reflection", Import: ImportanceLow} } // triggerForEvent maps a bus event to a Trigger. An IoT device change is treated // as normal importance, a reminder firing as high importance, and a generic // system event as normal importance. func triggerForEvent(e bus.Event) Trigger { switch e.Subject { case iot.DeviceUpdateSubject: if d, ok := e.Payload.(iot.DeviceUpdate); ok { return Trigger{ Source: e.Subject, Summary: fmt.Sprintf("device %s (%s) %s", d.Device.ID, d.Device.Type, d.Action), Import: ImportanceNormal, } } return Trigger{Source: e.Subject, Summary: e.Subject, Import: ImportanceNormal} case SubjectReminderTrigger: return Trigger{Source: e.Subject, Summary: e.Subject, Import: ImportanceHigh} case SubjectSystemEvent: tr := Trigger{Source: e.Subject, Summary: e.Subject, Import: ImportanceNormal} if sy, ok := e.Payload.(SystemEvent); ok { if sy.Summary != "" { tr.Summary = sy.Summary } tr.Import = sy.Import } return tr default: return Trigger{Source: e.Subject, Summary: e.Subject, Import: ImportanceNormal} } }