{"version":3,"file":"evolve-command.mjs","names":[],"sources":["../../../src/commands/evolve-command.ts"],"sourcesContent":["/**\n * Evolution mode commands — toggle between stable and evolving agent behavior.\n *\n * /evolve  — Enable self-improvement (memory writes, skill creation, nudges)\n * /stable  — Disable self-improvement (read-only on learned knowledge)\n * /evolution — Show current evolution mode status\n */\n\nimport { getEvolutionMode } from '../services/evolution-mode.js';\nimport { getAgentMemory } from '../services/agent-memory.js';\nimport { buildLearnedSkillsIndex } from '../tools/skill-evolve.js';\n\nfunction getSenderId(ctx: any): string {\n  return ctx?.senderId ?? ctx?.from ?? ctx?.metadata?.senderId ?? 'unknown';\n}\n\nexport const evolveCommand = {\n  name: 'evolve',\n  description: 'Enable self-improvement mode — agent learns from experience',\n  acceptsArgs: false,\n  requireAuth: true,\n  handler: async (ctx: any) => {\n    const userId = getSenderId(ctx);\n    const evo = getEvolutionMode();\n\n    if (evo.isEvolving(userId)) {\n      return {\n        text: 'Self-improvement is already active.\\n\\nThe agent can:\\n- Save memories (environment facts, tool quirks, lessons)\\n- Create and patch skills from complex workflows\\n- Search past conversations for relevant context\\n\\nUse /stable to switch to stable mode.',\n      };\n    }\n\n    evo.setMode(userId, 'evolving');\n\n    return {\n      text: `**Self-improvement enabled.**\n\nThe agent will now:\n- Proactively save important discoveries to memory\n- Create reusable skills from complex workflows (5+ tool calls)\n- Search past conversations when relevant context might exist\n- Receive periodic nudges to persist knowledge\n\nLearned memories and skills persist across sessions and improve the agent over time.\n\nUse **/stable** to return to stable mode (all learned knowledge remains accessible but no new learning occurs).`,\n    };\n  },\n};\n\nexport const stableCommand = {\n  name: 'stable',\n  description: 'Disable self-improvement — use only static skills and existing knowledge',\n  acceptsArgs: false,\n  requireAuth: true,\n  handler: async (ctx: any) => {\n    const userId = getSenderId(ctx);\n    const evo = getEvolutionMode();\n\n    if (!evo.isEvolving(userId)) {\n      return {\n        text: 'Already in stable mode.\\n\\nThe agent uses only built-in skills. Existing learned knowledge is still accessible (read-only) but no new learning occurs.\\n\\nUse /evolve to enable self-improvement.',\n      };\n    }\n\n    evo.setMode(userId, 'stable');\n\n    return {\n      text: `**Stable mode enabled.**\n\nSelf-improvement is paused:\n- Memory and skill tools will return \"disabled in stable mode\" for write operations\n- Existing learned skills and memories remain accessible (read-only)\n- Session recall (search) still works\n- No periodic nudges\n\nUse **/evolve** to resume self-improvement.`,\n    };\n  },\n};\n\nexport const evolutionCommand = {\n  name: 'evolution',\n  description: 'Show current self-improvement mode and statistics',\n  acceptsArgs: false,\n  requireAuth: true,\n  handler: async (ctx: any) => {\n    const userId = getSenderId(ctx);\n    const evo = getEvolutionMode();\n    const memory = getAgentMemory();\n\n    const mode = evo.getMode(userId);\n    const memStats = memory.getAgentMemoryStats();\n    const userStats = memory.getUserMemoryStats(userId);\n    const learnedSkillsIndex = buildLearnedSkillsIndex();\n    const learnedCount = learnedSkillsIndex ? learnedSkillsIndex.split('\\n').filter(l => l.startsWith('- ')).length : 0;\n    const evoStatus = evo.getStatus();\n\n    const lines = [\n      '**Evolution Status**',\n      '',\n      `Mode: **${mode}** ${mode === 'evolving' ? '(self-improving)' : '(stable, no new learning)'}`,\n      `Turns this session: ${evo.getTurnCount(userId)}`,\n      '',\n      '**Agent Memory**',\n      `  Entries: ${memStats.entries}`,\n      `  Usage: ${memStats.chars}/${memStats.limit} chars`,\n      '',\n      '**User Profile**',\n      `  Entries: ${userStats.entries}`,\n      `  Usage: ${userStats.chars}/${userStats.limit} chars`,\n      '',\n      `**Learned Skills**: ${learnedCount}`,\n      '',\n      '**Nudge Intervals**',\n      `  Memory: every ${evoStatus.memoryNudgeInterval} turns`,\n      `  Skills: every ${evoStatus.skillNudgeInterval} turns`,\n    ];\n\n    return { text: lines.join('\\n') };\n  },\n};\n"],"mappings":";;;;;;;;;;;AAYA,SAAS,YAAY,KAAkB;AACrC,QAAO,KAAK,YAAY,KAAK,QAAQ,KAAK,UAAU,YAAY;;AAGlE,MAAa,gBAAgB;CAC3B,MAAM;CACN,aAAa;CACb,aAAa;CACb,aAAa;CACb,SAAS,OAAO,QAAa;EAC3B,MAAM,SAAS,YAAY,IAAI;EAC/B,MAAM,MAAM,kBAAkB;AAE9B,MAAI,IAAI,WAAW,OAAO,CACxB,QAAO,EACL,MAAM,iQACP;AAGH,MAAI,QAAQ,QAAQ,WAAW;AAE/B,SAAO,EACL,MAAM;;;;;;;;;;kHAWP;;CAEJ;AAED,MAAa,gBAAgB;CAC3B,MAAM;CACN,aAAa;CACb,aAAa;CACb,aAAa;CACb,SAAS,OAAO,QAAa;EAC3B,MAAM,SAAS,YAAY,IAAI;EAC/B,MAAM,MAAM,kBAAkB;AAE9B,MAAI,CAAC,IAAI,WAAW,OAAO,CACzB,QAAO,EACL,MAAM,qMACP;AAGH,MAAI,QAAQ,QAAQ,SAAS;AAE7B,SAAO,EACL,MAAM;;;;;;;;8CASP;;CAEJ;AAED,MAAa,mBAAmB;CAC9B,MAAM;CACN,aAAa;CACb,aAAa;CACb,aAAa;CACb,SAAS,OAAO,QAAa;EAC3B,MAAM,SAAS,YAAY,IAAI;EAC/B,MAAM,MAAM,kBAAkB;EAC9B,MAAM,SAAS,gBAAgB;EAE/B,MAAM,OAAO,IAAI,QAAQ,OAAO;EAChC,MAAM,WAAW,OAAO,qBAAqB;EAC7C,MAAM,YAAY,OAAO,mBAAmB,OAAO;EACnD,MAAM,qBAAqB,yBAAyB;EACpD,MAAM,eAAe,qBAAqB,mBAAmB,MAAM,KAAK,CAAC,QAAO,MAAK,EAAE,WAAW,KAAK,CAAC,CAAC,SAAS;EAClH,MAAM,YAAY,IAAI,WAAW;AAuBjC,SAAO,EAAE,MArBK;GACZ;GACA;GACA,WAAW,KAAK,KAAK,SAAS,aAAa,qBAAqB;GAChE,uBAAuB,IAAI,aAAa,OAAO;GAC/C;GACA;GACA,cAAc,SAAS;GACvB,YAAY,SAAS,MAAM,GAAG,SAAS,MAAM;GAC7C;GACA;GACA,cAAc,UAAU;GACxB,YAAY,UAAU,MAAM,GAAG,UAAU,MAAM;GAC/C;GACA,uBAAuB;GACvB;GACA;GACA,mBAAmB,UAAU,oBAAoB;GACjD,mBAAmB,UAAU,mBAAmB;GACjD,CAEoB,KAAK,KAAK,EAAE;;CAEpC"}