rspace-online/lib/mi-suggestions.ts

114 lines
5.0 KiB
TypeScript

/**
* MI Context-Aware Suggestions — client-side suggestion registry.
*
* Maps module IDs to suggested prompts. When the MI panel opens,
* it reads the current module context and returns matching chips.
* No server call needed for static suggestions.
*/
export interface MiSuggestion {
label: string;
icon: string;
prompt: string;
autoSend?: boolean;
}
const MODULE_SUGGESTIONS: Record<string, MiSuggestion[]> = {
rspace: [
{ label: "Add a note", icon: "📝", prompt: "Add a markdown note to the canvas", autoSend: true },
{ label: "Generate an image", icon: "🎨", prompt: "Generate an image", autoSend: false },
{ label: "Arrange my shapes", icon: "📐", prompt: "Arrange all shapes on the canvas into a grid", autoSend: true },
{ label: "What's on this canvas?", icon: "🔍", prompt: "Summarize what's on this canvas", autoSend: true },
],
rnotes: [
{ label: "Create a notebook", icon: "📓", prompt: "Create a new notebook", autoSend: true },
{ label: "Summarize my notes", icon: "📋", prompt: "Summarize my recent notes", autoSend: true },
{ label: "Import from Obsidian", icon: "⬇", prompt: "How do I import notes from Obsidian?", autoSend: true },
],
rcal: [
{ label: "Create an event", icon: "📅", prompt: "Create a calendar event", autoSend: false },
{ label: "What's this week?", icon: "🗓", prompt: "What's on my calendar this week?", autoSend: true },
{ label: "Import a calendar", icon: "⬇", prompt: "How do I import an ICS calendar?", autoSend: true },
],
rtasks: [
{ label: "Create a task", icon: "✅", prompt: "Create a task", autoSend: false },
{ label: "Show open tasks", icon: "📋", prompt: "Show my open tasks", autoSend: true },
{ label: "Set up a project", icon: "🏗", prompt: "Help me set up a project board", autoSend: true },
],
rflows: [
{ label: "Create a flow", icon: "💧", prompt: "Create a new funding flow", autoSend: false },
{ label: "How do flows work?", icon: "❓", prompt: "How do community funding flows work?", autoSend: true },
],
rvote: [
{ label: "Create a proposal", icon: "🗳", prompt: "Create a governance proposal", autoSend: false },
{ label: "Start a vote", icon: "✋", prompt: "Start a governance vote", autoSend: false },
],
rchat: [
{ label: "Start a discussion", icon: "💬", prompt: "Start a new discussion thread", autoSend: false },
{ label: "Create a channel", icon: "📢", prompt: "Create a new chat channel", autoSend: false },
],
rcrm: [
{ label: "Add a contact", icon: "👤", prompt: "Add a new contact", autoSend: false },
{ label: "Show my pipeline", icon: "📊", prompt: "Show my CRM pipeline", autoSend: true },
],
rsocials: [
{ label: "Create a campaign", icon: "📣", prompt: "Create a social media campaign", autoSend: false },
{ label: "Draft a post", icon: "✏", prompt: "Draft a social media post", autoSend: false },
],
rwallet: [
{ label: "Check my balance", icon: "💰", prompt: "Check my wallet balance", autoSend: true },
{ label: "How do tokens work?", icon: "🪙", prompt: "How do CRDT tokens work?", autoSend: true },
],
rmaps: [
{ label: "Share my location", icon: "📍", prompt: "How do I share my location?", autoSend: true },
{ label: "Find nearby places", icon: "🔍", prompt: "Find interesting places nearby", autoSend: true },
],
rphotos: [
{ label: "Upload photos", icon: "📷", prompt: "How do I upload photos?", autoSend: true },
{ label: "Create an album", icon: "🖼", prompt: "Create a new photo album", autoSend: false },
],
rfiles: [
{ label: "Upload a file", icon: "📁", prompt: "How do I upload files?", autoSend: true },
{ label: "Browse files", icon: "🗂", prompt: "Show my recent files", autoSend: true },
],
};
const GENERIC_SUGGESTIONS: MiSuggestion[] = [
{ label: "What can I do here?", icon: "✨", prompt: "What can I do in this space?", autoSend: true },
{ label: "Set up this space", icon: "🏗", prompt: "Help me set up this space", autoSend: true },
{ label: "Show me around", icon: "🧭", prompt: "Give me a tour of the available rApps", autoSend: true },
];
const CANVAS_SUGGESTIONS: MiSuggestion[] = [
{ label: "Summarize selected", icon: "📋", prompt: "Summarize the selected shapes", autoSend: true },
{ label: "Connect these", icon: "🔗", prompt: "Connect the selected shapes", autoSend: true },
{ label: "Arrange in grid", icon: "📐", prompt: "Arrange the selected shapes in a grid", autoSend: true },
];
export function getContextSuggestions(ctx: {
module: string;
hasShapes: boolean;
hasSelectedShapes: boolean;
}): MiSuggestion[] {
const suggestions: MiSuggestion[] = [];
// Canvas selection suggestions take priority
if (ctx.hasSelectedShapes) {
suggestions.push(...CANVAS_SUGGESTIONS);
}
// Module-specific suggestions
const moduleSuggestions = MODULE_SUGGESTIONS[ctx.module];
if (moduleSuggestions) {
suggestions.push(...moduleSuggestions);
}
// Always add generic suggestions if we have room
if (suggestions.length < 6) {
const remaining = 6 - suggestions.length;
suggestions.push(...GENERIC_SUGGESTIONS.slice(0, remaining));
}
return suggestions;
}