{"version":3,"file":"onboarding-commands.mjs","names":[],"sources":["../../../src/commands/onboarding-commands.ts"],"sourcesContent":["/**\n * Onboarding slash commands — tappable options for persona, capabilities, and skip.\n *\n * These let users tap instead of type during the onboarding flow.\n * Each command calls into the OnboardingFlow state machine and returns\n * the response text. OpenClaw's command system handles sending it.\n */\n\nimport { getOnboardingFlow, type PersonaId, CAPABILITIES } from '../services/onboarding-flow.js';\n\n/** Helper: extract sender ID from command context. */\nfunction getSenderId(ctx: any): string {\n  return ctx?.senderId ?? ctx?.from ?? ctx?.metadata?.senderId ?? 'unknown';\n}\n\n// ── Persona Commands ────────────────────────────────────────────────────────\n\nfunction makePersonaCommand(id: PersonaId, label: string, description: string) {\n  return {\n    name: id,\n    description: `Set communication style: ${description}`,\n    acceptsArgs: false,\n    requireAuth: true,\n    handler: async (ctx: any) => {\n      const userId = getSenderId(ctx);\n      const flow = getOnboardingFlow(userId);\n      const response = flow.onPersonaSelected(id);\n      if (response) {\n        return { text: response.text };\n      }\n      return { text: `${label} persona noted. (You can change this anytime with /${id})` };\n    },\n  };\n}\n\nexport const professionalCommand = makePersonaCommand('professional', 'Professional', 'Clear, concise, business-like');\nexport const degenCommand = makePersonaCommand('degen', 'Degen', 'CT native, crypto twitter energy');\nexport const chillCommand = makePersonaCommand('chill', 'Chill', 'Relaxed, like texting a friend');\nexport const technicalCommand = makePersonaCommand('technical', 'Technical', 'Data-heavy, on-chain metrics');\nexport const mentorCommand = makePersonaCommand('mentor', 'Mentor', 'Educational, explains as it goes');\n\n// ── Capability Commands ─────────────────────────────────────────────────────\n\nexport const capAllCommand = {\n  name: 'all',\n  description: 'Select all capabilities during onboarding',\n  acceptsArgs: false,\n  requireAuth: true,\n  handler: async (ctx: any) => {\n    const userId = getSenderId(ctx);\n    const flow = getOnboardingFlow(userId);\n    const response = flow.onCapabilitiesSelected('all');\n    if (response) {\n      return { text: response.text };\n    }\n    return { text: 'All capabilities enabled.' };\n  },\n};\n\n// Individual capability commands — tapping /cap_X selects that ONE capability and advances.\n// Users can also type multiple numbers (\"1, 2, 3\") or /all instead of tapping individual caps.\nfunction makeCapCommand(capId: string, name: string) {\n  return {\n    name: `cap_${capId}`,\n    description: `Select capability: ${name}`,\n    acceptsArgs: false,\n    requireAuth: true,\n    handler: async (ctx: any) => {\n      const userId = getSenderId(ctx);\n      const flow = getOnboardingFlow(userId);\n      const idx = CAPABILITIES.findIndex(c => c.id === capId);\n      if (idx < 0) return { text: `Unknown capability: ${capId}` };\n      const response = flow.onCapabilitiesSelected(String(idx + 1));\n      if (response) {\n        return { text: response.text };\n      }\n      return { text: `${name} enabled.` };\n    },\n  };\n}\n\nexport const capCommands = CAPABILITIES.map(c => makeCapCommand(c.id, c.name));\n\n// ── Wallet Creation Commands ────────────────────────────────────────────────\n\nexport const createWalletCommand = {\n  name: 'create_wallet',\n  description: 'Generate a new encrypted wallet (stored locally)',\n  acceptsArgs: false,\n  requireAuth: true,\n  handler: async (ctx: any) => {\n    const userId = getSenderId(ctx);\n    const flow = getOnboardingFlow(userId);\n    const response = await flow.onCreateWallet();\n    if (response) {\n      return { text: response.text };\n    }\n    return { text: 'Wallet creation is only available during the wallet connection step. Use /connect for other wallet options.' };\n  },\n};\n\nexport const importWalletCommand = {\n  name: 'import_wallet',\n  description: 'Import wallet from a 12/24-word seed phrase',\n  acceptsArgs: false,\n  requireAuth: true,\n  handler: async (ctx: any) => {\n    const userId = getSenderId(ctx);\n    const flow = getOnboardingFlow(userId);\n    const response = flow.onImportWallet();\n    if (response) {\n      return { text: response.text };\n    }\n    return { text: 'Wallet import is only available during the wallet connection step. Use /connect for other wallet options.' };\n  },\n};\n\n// ── Back Command ────────────────────────────────────────────────────────────\n\nexport const backCommand = {\n  name: 'back',\n  description: 'Go back one step during onboarding',\n  acceptsArgs: false,\n  requireAuth: true,\n  handler: async (ctx: any) => {\n    const userId = getSenderId(ctx);\n    const flow = getOnboardingFlow(userId);\n    if (flow.isActive) {\n      const response = flow.back();\n      if (response) {\n        return { text: response.text };\n      }\n      return { text: \"Can't go back from the current step.\" };\n    }\n    return { text: 'No active onboarding. Use /help to see available commands.' };\n  },\n};\n\n// ── Skip Command ────────────────────────────────────────────────────────────\n\nexport const skipCommand = {\n  name: 'skip',\n  description: 'Skip the onboarding tutorial',\n  acceptsArgs: false,\n  requireAuth: true,\n  handler: async (ctx: any) => {\n    const userId = getSenderId(ctx);\n    const flow = getOnboardingFlow(userId);\n    if (flow.isActive) {\n      const response = flow.skip();\n      return { text: response.text };\n    }\n    return { text: 'No active onboarding to skip.' };\n  },\n};\n\n// ── Restart Command ─────────────────────────────────────────────────────────\n\nexport const restartCommand = {\n  name: 'reonboard',\n  description: 'Restart the onboarding tutorial from the beginning',\n  acceptsArgs: false,\n  requireAuth: true,\n  handler: async (ctx: any) => {\n    const userId = getSenderId(ctx);\n    const flow = getOnboardingFlow(userId);\n    const response = flow.restart();\n    return { text: response.text };\n  },\n};\n"],"mappings":"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"}