feat: IPC additions for reminders/events/routines, ack tracking, tool management
- Extend IPC wire protocol: add ListReminders, ListEvents, ListProposedRoutines, DismissProposedRoutine, AcceptProposedRoutine IPC methods with request/response types. Update wire.go with new message kinds. - Add ack_sends table (migration #5): tracks sev4 telegram repeat-til-ack delivery state with rule name + timestamp, indexed for dedup. - Add Store.DeleteTool: permanently removes a tool row (for dismissing proposed tools), idempotent on missing tool. - Update tick.go: wire new IPC handlers into daemon tick.
This commit is contained in:
@@ -375,6 +375,131 @@ func TestCaller_Peercred(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// TestChatViaClient — Chat round-trips over the wire. Uses a custom CoreAPI
|
||||
// that implements Chat (storeAPI returns an error for it).
|
||||
func TestChatViaClient(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
sock := filepath.Join(dir, "maven.sock")
|
||||
chatAPI := &chatTestAPI{}
|
||||
srv, err := Listen(sock, chatAPI)
|
||||
if err != nil {
|
||||
t.Fatalf("listen: %v", err)
|
||||
}
|
||||
done := make(chan struct{})
|
||||
go func() {
|
||||
_ = srv.Serve()
|
||||
close(done)
|
||||
}()
|
||||
t.Cleanup(func() {
|
||||
_ = srv.Close()
|
||||
<-done
|
||||
})
|
||||
cli, err := Dial(srv.Path())
|
||||
if err != nil {
|
||||
t.Fatalf("dial: %v", err)
|
||||
}
|
||||
t.Cleanup(func() { _ = cli.Close() })
|
||||
|
||||
reply, err := cli.Chat(context.Background(), "привет")
|
||||
if err != nil {
|
||||
t.Fatalf("Chat: %v", err)
|
||||
}
|
||||
if reply != "и тебе привет!" {
|
||||
t.Fatalf("Chat = %q, want %q", reply, "и тебе привет!")
|
||||
}
|
||||
}
|
||||
|
||||
// chatTestAPI — a minimal CoreAPI that only implements Chat for testing.
|
||||
type chatTestAPI struct{}
|
||||
|
||||
func (a *chatTestAPI) WriteFact(ctx context.Context, req WriteFactReq) (int64, error) {
|
||||
return 0, ErrUnknownMethod
|
||||
}
|
||||
func (a *chatTestAPI) LatestFact(ctx context.Context, key string) (Fact, error) {
|
||||
return Fact{}, ErrUnknownMethod
|
||||
}
|
||||
func (a *chatTestAPI) LatestFactBySource(ctx context.Context, key, source string) (Fact, error) {
|
||||
return Fact{}, ErrUnknownMethod
|
||||
}
|
||||
func (a *chatTestAPI) Since(ctx context.Context, key string, now time.Time) (time.Duration, error) {
|
||||
return 0, ErrUnknownMethod
|
||||
}
|
||||
func (a *chatTestAPI) Presence(ctx context.Context) (Presence, error) {
|
||||
return Presence{}, ErrUnknownMethod
|
||||
}
|
||||
func (a *chatTestAPI) CreateReminder(ctx context.Context, fire time.Time, payload, cron string) (int64, error) {
|
||||
return 0, ErrUnknownMethod
|
||||
}
|
||||
func (a *chatTestAPI) MarkReminder(ctx context.Context, id int64, status string) error {
|
||||
return ErrUnknownMethod
|
||||
}
|
||||
func (a *chatTestAPI) ListReminders(ctx context.Context, n int) ([]Reminder, error) {
|
||||
return nil, ErrUnknownMethod
|
||||
}
|
||||
func (a *chatTestAPI) RecordNudge(ctx context.Context, rule, channel, message string, ts time.Time) (int64, error) {
|
||||
return 0, ErrUnknownMethod
|
||||
}
|
||||
func (a *chatTestAPI) ResolveNudge(ctx context.Context, id int64, outcome string, ts time.Time) error {
|
||||
return ErrUnknownMethod
|
||||
}
|
||||
func (a *chatTestAPI) RecentOutcomes(ctx context.Context, rule string, n int) ([]string, error) {
|
||||
return nil, ErrUnknownMethod
|
||||
}
|
||||
func (a *chatTestAPI) RecentFacts(ctx context.Context, n int) ([]Fact, error) {
|
||||
return nil, ErrUnknownMethod
|
||||
}
|
||||
func (a *chatTestAPI) CalendarEvents(ctx context.Context, from, to time.Time) ([]Fact, error) {
|
||||
return nil, ErrUnknownMethod
|
||||
}
|
||||
func (a *chatTestAPI) RecentNudges(ctx context.Context, n int) ([]Nudge, error) {
|
||||
return nil, ErrUnknownMethod
|
||||
}
|
||||
func (a *chatTestAPI) WriteNote(ctx context.Context, ts time.Time, text string, embedding []float32, source string) (int64, error) {
|
||||
return 0, ErrUnknownMethod
|
||||
}
|
||||
func (a *chatTestAPI) QueryNotes(ctx context.Context, embedding []float32, k int) ([]Note, error) {
|
||||
return nil, ErrUnknownMethod
|
||||
}
|
||||
func (a *chatTestAPI) RecentNotes(ctx context.Context, n int) ([]Note, error) {
|
||||
return nil, ErrUnknownMethod
|
||||
}
|
||||
func (a *chatTestAPI) ProposeTool(ctx context.Context, name, utterance, scope string, ts time.Time) (bool, error) {
|
||||
return false, ErrUnknownMethod
|
||||
}
|
||||
func (a *chatTestAPI) EnableTool(ctx context.Context, name string, cmd []string, destructive bool, scope string, ts time.Time) error {
|
||||
return ErrUnknownMethod
|
||||
}
|
||||
func (a *chatTestAPI) DisableTool(ctx context.Context, name string) error {
|
||||
return ErrUnknownMethod
|
||||
}
|
||||
func (a *chatTestAPI) DeleteTool(ctx context.Context, name string) error {
|
||||
return ErrUnknownMethod
|
||||
}
|
||||
func (a *chatTestAPI) ListProposedRoutines(ctx context.Context) ([]ProposedRoutine, error) {
|
||||
return nil, ErrUnknownMethod
|
||||
}
|
||||
func (a *chatTestAPI) DismissProposedRoutine(ctx context.Context, id int64) error {
|
||||
return ErrUnknownMethod
|
||||
}
|
||||
func (a *chatTestAPI) LookupTool(ctx context.Context, name string) (Tool, error) {
|
||||
return Tool{}, ErrUnknownMethod
|
||||
}
|
||||
func (a *chatTestAPI) ListTools(ctx context.Context, status string) ([]Tool, error) {
|
||||
return nil, ErrUnknownMethod
|
||||
}
|
||||
func (a *chatTestAPI) RevertFact(ctx context.Context, key string) (int64, error) {
|
||||
return 0, ErrUnknownMethod
|
||||
}
|
||||
func (a *chatTestAPI) TickTrace(ctx context.Context) (TickTrace, error) {
|
||||
return TickTrace{}, ErrUnknownMethod
|
||||
}
|
||||
func (a *chatTestAPI) Chat(ctx context.Context, text string) (string, error) {
|
||||
if text == "привет" {
|
||||
return "и тебе привет!", nil
|
||||
}
|
||||
return "поговорили.", nil
|
||||
}
|
||||
|
||||
// TestDispatch_UnknownMethod — an unknown method over the wire comes back as
|
||||
// ErrUnknownMethod, not a panic or a dropped conn. The server must stay up
|
||||
// for the next (legitimate) request on the same conn.
|
||||
|
||||
Reference in New Issue
Block a user