diff --git a/bin/opencode-ink.mjs b/bin/opencode-ink.mjs index cdfe96d..21cccb7 100644 --- a/bin/opencode-ink.mjs +++ b/bin/opencode-ink.mjs @@ -2558,6 +2558,156 @@ const App = () => { setInput(''); return; + // ═══════════════════════════════════════════════════════════ + // NEW FEATURES - Session Memory, Skills, Debug + // ═══════════════════════════════════════════════════════════ + case '/remember': { + if (!arg) { + setMessages(prev => [...prev, { role: 'system', content: '❌ Usage: /remember \nExample: /remember User prefers TypeScript over JavaScript' }]); + } else { + (async () => { + const memory = getSessionMemory(); + await memory.load(); + await memory.remember(arg); + setMessages(prev => [...prev, { role: 'system', content: `✅ Remembered: "${arg}"\n📝 Fact #${memory.facts.length} saved to session memory.` }]); + })(); + } + setInput(''); + return; + } + + case '/forget': { + if (!arg) { + setMessages(prev => [...prev, { role: 'system', content: '❌ Usage: /forget \nExample: /forget 1' }]); + } else { + (async () => { + const memory = getSessionMemory(); + await memory.load(); + const index = parseInt(arg, 10); + const removed = await memory.forget(index); + if (removed) { + setMessages(prev => [...prev, { role: 'system', content: `✅ Forgot fact #${index}: "${removed.fact}"` }]); + } else { + setMessages(prev => [...prev, { role: 'system', content: `❌ Fact #${index} not found. Use /memory to see all facts.` }]); + } + })(); + } + setInput(''); + return; + } + + case '/memory': { + (async () => { + const memory = getSessionMemory(); + await memory.load(); + const facts = memory.getDisplayList(); + if (facts.length === 0) { + setMessages(prev => [...prev, { role: 'system', content: '📭 No facts in session memory.\nUse /remember to add one.' }]); + } else { + const list = facts.map(f => `${f.index}. [${f.category}] ${f.fact} (${f.displayDate})`).join('\n'); + setMessages(prev => [...prev, { role: 'system', content: `📝 **Session Memory** (${facts.length} facts)\n\n${list}\n\nUse /forget to remove a fact.` }]); + } + })(); + setInput(''); + return; + } + + case '/clearmemory': { + (async () => { + const memory = getSessionMemory(); + await memory.clear(); + setMessages(prev => [...prev, { role: 'system', content: '🗑️ Session memory cleared.' }]); + })(); + setInput(''); + return; + } + + case '/skills': { + const display = getSkillListDisplay(); + setMessages(prev => [...prev, { role: 'system', content: `🎯 **Available Skills**\n${display}\nUsage: /skill then describe your task` }]); + setInput(''); + return; + } + + case '/skill': { + if (!arg) { + const skills = getAllSkills(); + const names = skills.map(s => s.id).join(', '); + setMessages(prev => [...prev, { role: 'system', content: `❌ Usage: /skill \nAvailable: ${names}` }]); + } else { + const skillName = arg.split(/\s+/)[0]; + const skill = getSkill(skillName); + if (!skill) { + const skills = getAllSkills(); + const names = skills.map(s => s.id).join(', '); + setMessages(prev => [...prev, { role: 'system', content: `❌ Unknown skill: "${skillName}"\nAvailable: ${names}` }]); + } else { + setMessages(prev => [...prev, { role: 'system', content: `🎯 **Activated: ${skill.name}**\n${skill.description}\n\nNow describe your task and I'll apply this skill.` }]); + } + } + setInput(''); + return; + } + + case '/debug': { + const nowEnabled = debugLogger.toggle(); + setMessages(prev => [...prev, { + role: 'system', + content: nowEnabled + ? `🔧 Debug logging **ENABLED**\nLogs: ${debugLogger.getPath()}` + : '🔧 Debug logging **DISABLED**' + }]); + setInput(''); + return; + } + + case '/debugclear': { + (async () => { + await debugLogger.clear(); + setMessages(prev => [...prev, { role: 'system', content: '🗑️ Debug log cleared.' }]); + })(); + setInput(''); + return; + } + + case '/help': { + setMessages(prev => [...prev, { + role: 'system', + content: `📚 **Available Commands** + +**Memory** + /remember - Save a fact to session memory + /memory - View all remembered facts + /forget <#> - Remove a fact by number + /clearmemory - Clear all memory + +**Skills** + /skills - List available skills + /skill - Activate a skill (test, review, docs, etc.) + +**Debug** + /debug - Toggle debug logging + /debugclear - Clear debug log + +**Settings** + /settings - Open command palette + /model - Change AI model + /smartx - Toggle SmartX auto-healing + /auto - Toggle auto-approve + /context - Toggle smart context + /agents - Multi-agent menu + +**Session** + /clear - Clear chat + /save - Save session + /load - Load session + /exit - Exit TUI` + }]); + setInput(''); + return; + } + // ═══════════════════════════════════════════════════════════ + case '/paste': // Read directly from system clipboard (preserves newlines!) try {