3.9 KiB
3.9 KiB
DailyBriefGenerationPipeline — A2A Spec
Product: MindLyst
Trigger: Cron (0 7 * * * per-user timezone), or on-demand via MCP tool mindlyst.brief.generate(userId)
Output: DailyBriefDoc in daily_briefs Cosmos container + push notification
Agent roster
| Step | Agent | Input | Output |
|---|---|---|---|
| 1 | MemoryCollectorAgent |
userId, brainIds[], lookback window |
Top N memory items per brain ranked by urgencyScore |
| 2 | SummaryAgent |
Memory items per brain | Per-brain summary text (calls extraction.extract(text, 'memory-insight')) |
| 3 | BriefComposerAgent |
Per-brain summaries + user preferences | DailyBriefDoc draft |
| 4 | DeliveryAgent |
DailyBriefDoc + userId |
Stored doc + push notification fired |
Agent contracts
MemoryCollectorAgent
// Tool: mindlyst.memory.listByBrain
// Endpoint: GET /memory-items?productId=mindlyst&brainId=<id>&filter=forgotten&limit=20
// Returns: { items: MemoryItemDoc[], limit, offset }
input: {
userId: string;
brainIds: string[];
lookbackHours?: number; // default 24
}
output: {
byBrain: Record<string, MemoryItemDoc[]>;
totalItems: number;
}
SummaryAgent
// Tool: extraction.extract
// Endpoint: POST extraction-service /api/extract { text, taskId: 'memory-insight' }
input: {
brainId: string;
items: MemoryItemDoc[];
}
output: {
brainId: string;
summary: string;
highlights: string[]; // top entities/patterns
}
BriefComposerAgent
// Pure in-process transformation — no external calls
input: {
userId: string;
brainSummaries: Array<{ brainId: string; summary: string; highlights: string[] }>;
date: string; // ISO date
}
output: DailyBriefDoc; // ready to upsert
DeliveryAgent
// Tool: mindlyst.brief.store → POST /daily-briefs
// Tool: platform.push.fire → POST platform-service /push-triggers
input: {
brief: DailyBriefDoc;
userId: string;
}
output: {
stored: boolean;
notified: boolean;
briefId: string;
}
Data model
interface DailyBriefDoc {
id: string;
userId: string;
productId: 'mindlyst';
date: string; // YYYY-MM-DD
greeting: string;
brainSummaries: BrainSummary[];
priorityItems: MemoryItemRef[];
totalMemoriesConsidered: number;
generatedAt: string;
deliveredAt: string | null;
}
Error handling
- If
extraction-serviceis unavailable,SummaryAgentfalls back to a simple top-3 item list (no extraction). - If any brain has 0 items, it is omitted from the brief.
- If
DeliveryAgentfails to push, it retries once; the brief is still stored. - Idempotent: re-running for the same
(userId, date)upserts the existing doc.
MCP tool surface
mindlyst.brief.generate(userId: string, date?: string): DailyBriefDoc
mindlyst.brief.get(userId: string, date: string): DailyBriefDoc | null
mindlyst.brief.list(userId: string, limit?: number): DailyBriefDoc[]
Implementation checklist
MemoryCollectorAgent— thin wrapper overGET /memory-items(multi-brain fan-out)SummaryAgent— calls extraction-servicememory-insighttaskBriefComposerAgent— template assembly + LLM call for greetingDeliveryAgent— upsert todaily_briefs+ fire push trigger- Cron registration in
backend/src/server.ts(Fastify cron plugin or external scheduler) - MCP tool registrations in
backend/src/modules/daily-briefs/routes.ts