ed9bdd5e09
The plan answers "какие планы на сегодня?" by putting one day in order: calendar events (with #126's ambient provenance carried through and hedged), pending reminders, and one line per morning routine that still has items outstanding. "что дальше?" trims what has already passed. It lives in internal/morning, not in a parallel system, because it is the same question the checklist asks at a different scale — the routine knows what is missing from a window, the plan knows what the whole day holds, and both read the same facts and the same idea of "today". BuildPlan is pure; tickLoop.dayPlan is the impure half that reads the store. It is not a nag. Nothing here fires, schedules or announces: the plan is built only when asked, over IPC (day_plan) or on the existing /morning page. Unprompted delivery stays with the morning nudge and the dispatcher's policy. The query source sits before "calendar" in querySources because both match "…на сегодня" and the plan's matcher is the more specific one; IsDayPlanQuery matches whole words so "планёрка" (a meeting) is not read as a request for the plan, and refuses any utterance naming another day, since the plan is built for the clock's own day only. Verified: make build and make test both exit 0; new tests cover plan ordering, the checklist-only-what-is-left rule, other-day rejection, the RU rendering against the persona checks, rest-of-day trimming, the source ordering, and the matcher's refusals.
122 lines
5.2 KiB
Go
122 lines
5.2 KiB
Go
package ipc
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"time"
|
|
)
|
|
|
|
// ErrNotImplemented is returned by every UnimplementedCoreAPI method. It is
|
|
// deliberately distinct from ErrUnknownMethod (a wire-level "no such
|
|
// method exists" verdict) and from any daemon-level "locked" error: this one
|
|
// means "this method exists on CoreAPI, but the fake/adapter embedding
|
|
// UnimplementedCoreAPI never got a real implementation for it." A test that
|
|
// exercises an undeclared method fails loudly on this text instead of
|
|
// silently nil-panicking or being mistaken for a legitimate failure.
|
|
var ErrNotImplemented = errors.New("ipc: not implemented (unimplemented CoreAPI stub)")
|
|
|
|
// UnimplementedCoreAPI is the gRPC Unimplemented*Server pattern applied to
|
|
// CoreAPI: embed it in a test double or adapter and override only the
|
|
// methods you actually exercise. Every method returns ErrNotImplemented, so
|
|
// a call that reaches an undeclared method fails loudly and specifically,
|
|
// rather than compiling to a silent no-op or nil-pointer panic. This
|
|
// replaces the old pattern of hand-writing all 30 no-op stubs per double —
|
|
// those were compiler-satisfying padding, not tests of anything.
|
|
type UnimplementedCoreAPI struct{}
|
|
|
|
var _ CoreAPI = UnimplementedCoreAPI{}
|
|
|
|
func (UnimplementedCoreAPI) WriteFact(ctx context.Context, req WriteFactReq) (int64, error) {
|
|
return 0, ErrNotImplemented
|
|
}
|
|
func (UnimplementedCoreAPI) LatestFact(ctx context.Context, key string) (Fact, error) {
|
|
return Fact{}, ErrNotImplemented
|
|
}
|
|
func (UnimplementedCoreAPI) LatestFactBySource(ctx context.Context, key, source string) (Fact, error) {
|
|
return Fact{}, ErrNotImplemented
|
|
}
|
|
func (UnimplementedCoreAPI) Since(ctx context.Context, key string, now time.Time) (time.Duration, error) {
|
|
return 0, ErrNotImplemented
|
|
}
|
|
func (UnimplementedCoreAPI) Presence(ctx context.Context) (Presence, error) {
|
|
return Presence{}, ErrNotImplemented
|
|
}
|
|
func (UnimplementedCoreAPI) CreateReminder(ctx context.Context, fire time.Time, payload, cron string) (int64, error) {
|
|
return 0, ErrNotImplemented
|
|
}
|
|
func (UnimplementedCoreAPI) MarkReminder(ctx context.Context, id int64, status string) error {
|
|
return ErrNotImplemented
|
|
}
|
|
func (UnimplementedCoreAPI) ListReminders(ctx context.Context, n int) ([]Reminder, error) {
|
|
return nil, ErrNotImplemented
|
|
}
|
|
func (UnimplementedCoreAPI) RecordNudge(ctx context.Context, rule, channel, message string, ts time.Time) (int64, error) {
|
|
return 0, ErrNotImplemented
|
|
}
|
|
func (UnimplementedCoreAPI) ResolveNudge(ctx context.Context, id int64, outcome string, ts time.Time) error {
|
|
return ErrNotImplemented
|
|
}
|
|
func (UnimplementedCoreAPI) RecentOutcomes(ctx context.Context, rule string, n int) ([]string, error) {
|
|
return nil, ErrNotImplemented
|
|
}
|
|
func (UnimplementedCoreAPI) RecentFacts(ctx context.Context, n int) ([]Fact, error) {
|
|
return nil, ErrNotImplemented
|
|
}
|
|
func (UnimplementedCoreAPI) CalendarEvents(ctx context.Context, from, to time.Time) ([]Fact, error) {
|
|
return nil, ErrNotImplemented
|
|
}
|
|
func (UnimplementedCoreAPI) RecentNudges(ctx context.Context, n int) ([]Nudge, error) {
|
|
return nil, ErrNotImplemented
|
|
}
|
|
func (UnimplementedCoreAPI) WriteNote(ctx context.Context, ts time.Time, text string, embedding []float32, source string) (int64, error) {
|
|
return 0, ErrNotImplemented
|
|
}
|
|
func (UnimplementedCoreAPI) QueryNotes(ctx context.Context, embedding []float32, k int) ([]Note, error) {
|
|
return nil, ErrNotImplemented
|
|
}
|
|
func (UnimplementedCoreAPI) RecentNotes(ctx context.Context, n int) ([]Note, error) {
|
|
return nil, ErrNotImplemented
|
|
}
|
|
func (UnimplementedCoreAPI) ProposeTool(ctx context.Context, name, utterance, scope string, ts time.Time) (bool, error) {
|
|
return false, ErrNotImplemented
|
|
}
|
|
func (UnimplementedCoreAPI) EnableTool(ctx context.Context, name string, cmd []string, destructive bool, scope string, ts time.Time) error {
|
|
return ErrNotImplemented
|
|
}
|
|
func (UnimplementedCoreAPI) DisableTool(ctx context.Context, name string) error {
|
|
return ErrNotImplemented
|
|
}
|
|
func (UnimplementedCoreAPI) DeleteTool(ctx context.Context, name string) error {
|
|
return ErrNotImplemented
|
|
}
|
|
func (UnimplementedCoreAPI) ListProposedRoutines(ctx context.Context) ([]ProposedRoutine, error) {
|
|
return nil, ErrNotImplemented
|
|
}
|
|
func (UnimplementedCoreAPI) DismissProposedRoutine(ctx context.Context, id int64) error {
|
|
return ErrNotImplemented
|
|
}
|
|
func (UnimplementedCoreAPI) AcceptProposedRoutine(ctx context.Context, id int64) error {
|
|
return ErrNotImplemented
|
|
}
|
|
func (UnimplementedCoreAPI) LookupTool(ctx context.Context, name string) (Tool, error) {
|
|
return Tool{}, ErrNotImplemented
|
|
}
|
|
func (UnimplementedCoreAPI) ListTools(ctx context.Context, status string) ([]Tool, error) {
|
|
return nil, ErrNotImplemented
|
|
}
|
|
func (UnimplementedCoreAPI) RevertFact(ctx context.Context, key string) (int64, error) {
|
|
return 0, ErrNotImplemented
|
|
}
|
|
func (UnimplementedCoreAPI) TickTrace(ctx context.Context) (TickTrace, error) {
|
|
return TickTrace{}, ErrNotImplemented
|
|
}
|
|
func (UnimplementedCoreAPI) MorningStatus(ctx context.Context) ([]MorningRoutineStatus, error) {
|
|
return nil, ErrNotImplemented
|
|
}
|
|
func (UnimplementedCoreAPI) DayPlan(ctx context.Context) (DayPlan, error) {
|
|
return DayPlan{}, ErrNotImplemented
|
|
}
|
|
func (UnimplementedCoreAPI) Chat(ctx context.Context, text string) (string, error) {
|
|
return "", ErrNotImplemented
|
|
}
|