/ src / lib / setup-defaults.ts
setup-defaults.ts
   1  /**
   2   * Shared setup defaults used by both the web wizard and CLI.
   3   * Isomorphic — no 'use client', no server imports.
   4   */
   5  
   6  export type SetupProvider =
   7    | 'claude-cli'
   8    | 'codex-cli'
   9    | 'opencode-cli'
  10    | 'opencode-web'
  11    | 'gemini-cli'
  12    | 'copilot-cli'
  13    | 'droid-cli'
  14    | 'cursor-cli'
  15    | 'qwen-code-cli'
  16    | 'goose'
  17    | 'anthropic'
  18    | 'openai'
  19    | 'openrouter'
  20    | 'google'
  21    | 'deepseek'
  22    | 'groq'
  23    | 'together'
  24    | 'mistral'
  25    | 'xai'
  26    | 'fireworks'
  27    | 'nebius'
  28    | 'deepinfra'
  29    | 'ollama'
  30    | 'openclaw'
  31    | 'hermes'
  32    | 'custom'
  33  
  34  export interface SetupProviderOption {
  35    id: SetupProvider
  36    name: string
  37    description: string
  38    requiresKey: boolean
  39    supportsEndpoint: boolean
  40    /** @deprecated No longer used — each provider type can only be configured once */
  41    allowMultiple?: boolean
  42    defaultEndpoint?: string
  43    keyUrl?: string
  44    keyLabel?: string
  45    keyPlaceholder?: string
  46    optionalKey?: boolean
  47    badge?: string
  48    icon: string
  49    modelLibraryUrl?: string
  50    cloudEndpoint?: string
  51  }
  52  
  53  export const SETUP_PROVIDERS: SetupProviderOption[] = [
  54    {
  55      id: 'claude-cli',
  56      name: 'Claude Code CLI',
  57      description: 'Anthropic’s coding agent with native tools, strong edits, and first-class CLI workflows.',
  58      requiresKey: false,
  59      supportsEndpoint: false,
  60      badge: 'CLI',
  61      icon: 'C',
  62      modelLibraryUrl: 'https://docs.anthropic.com/en/docs/about-claude/models',
  63    },
  64    {
  65      id: 'codex-cli',
  66      name: 'OpenAI Codex CLI',
  67      description: 'OpenAI’s terminal coding agent with resume support and structured headless output.',
  68      requiresKey: false,
  69      supportsEndpoint: false,
  70      badge: 'CLI',
  71      icon: 'O',
  72      modelLibraryUrl: 'https://platform.openai.com/docs/models',
  73    },
  74    {
  75      id: 'opencode-cli',
  76      name: 'OpenCode CLI',
  77      description: 'A flexible coding CLI that can route across multiple model backends.',
  78      requiresKey: false,
  79      supportsEndpoint: false,
  80      badge: 'CLI',
  81      icon: 'O',
  82    },
  83    {
  84      id: 'opencode-web',
  85      name: 'OpenCode Web',
  86      description: 'Connect to a remote OpenCode HTTP server (`opencode serve` or `opencode web`). Supports HTTPS and HTTP Basic Auth.',
  87      requiresKey: false,
  88      optionalKey: true,
  89      supportsEndpoint: true,
  90      defaultEndpoint: 'http://localhost:4096',
  91      keyLabel: 'username:password (Basic Auth)',
  92      keyPlaceholder: 'opencode:••••••• (or just the password)',
  93      badge: 'HTTP',
  94      icon: 'O',
  95    },
  96    {
  97      id: 'gemini-cli',
  98      name: 'Gemini CLI',
  99      description: 'Google’s terminal coding agent with project-aware headless mode and resume support.',
 100      requiresKey: false,
 101      supportsEndpoint: false,
 102      badge: 'CLI',
 103      icon: 'G',
 104      modelLibraryUrl: 'https://ai.google.dev/gemini-api/docs/models',
 105    },
 106    {
 107      id: 'copilot-cli',
 108      name: 'GitHub Copilot CLI',
 109      description: 'GitHub’s multi-model terminal agent for coding and automation.',
 110      requiresKey: false,
 111      supportsEndpoint: false,
 112      badge: 'CLI',
 113      icon: 'P',
 114    },
 115    {
 116      id: 'droid-cli',
 117      name: 'Factory Droid CLI',
 118      description: 'Factory.ai’s terminal coding agent with headless exec mode, session resume, and autonomy controls.',
 119      requiresKey: false,
 120      supportsEndpoint: false,
 121      optionalKey: true,
 122      keyUrl: 'https://app.factory.ai/settings/api-keys',
 123      keyLabel: 'app.factory.ai',
 124      keyPlaceholder: 'FACTORY_API_KEY (optional if signed in via `droid`)',
 125      badge: 'CLI',
 126      icon: 'F',
 127    },
 128    {
 129      id: 'cursor-cli',
 130      name: 'Cursor Agent CLI',
 131      description: 'Cursor’s terminal agent with resume support, JSON output, and Cursor-native coding workflows.',
 132      requiresKey: false,
 133      supportsEndpoint: false,
 134      badge: 'CLI',
 135      icon: 'U',
 136    },
 137    {
 138      id: 'qwen-code-cli',
 139      name: 'Qwen Code CLI',
 140      description: 'Qwen’s terminal coding agent with structured headless mode and multi-provider model config.',
 141      requiresKey: false,
 142      supportsEndpoint: false,
 143      badge: 'CLI',
 144      icon: 'Q',
 145    },
 146    {
 147      id: 'goose',
 148      name: 'Goose',
 149      description: 'A runtime-managed terminal agent with extensions, session history, and ACP support.',
 150      requiresKey: false,
 151      supportsEndpoint: false,
 152      optionalKey: true,
 153      badge: 'Runtime',
 154      icon: 'G',
 155    },
 156    {
 157      id: 'openai',
 158      name: 'OpenAI',
 159      description: 'Great default for most users. Fast, reliable GPT models.',
 160      requiresKey: true,
 161      supportsEndpoint: true,
 162      defaultEndpoint: 'https://api.openai.com/v1',
 163      keyUrl: 'https://platform.openai.com/api-keys',
 164      keyLabel: 'platform.openai.com',
 165      badge: 'Recommended',
 166      icon: 'O',
 167      modelLibraryUrl: 'https://platform.openai.com/docs/models',
 168    },
 169    {
 170      id: 'openrouter',
 171      name: 'OpenRouter',
 172      description: 'One API key for a broad multi-provider model catalog through an OpenAI-compatible API.',
 173      requiresKey: true,
 174      supportsEndpoint: false,
 175      defaultEndpoint: 'https://openrouter.ai/api/v1',
 176      keyUrl: 'https://openrouter.ai/keys',
 177      keyLabel: 'openrouter.ai',
 178      badge: 'Catalog',
 179      icon: 'R',
 180      modelLibraryUrl: 'https://openrouter.ai/models',
 181    },
 182    {
 183      id: 'openclaw',
 184      name: 'OpenClaw',
 185      description: 'Deploy or connect official-only local and remote OpenClaw gateways, then map starter agents across your swarm by role, tag, or use case.',
 186      requiresKey: false,
 187      supportsEndpoint: true,
 188      allowMultiple: true,
 189      defaultEndpoint: 'http://localhost:18789/v1',
 190      optionalKey: true,
 191      badge: 'First-Tier',
 192      icon: 'C',
 193    },
 194    {
 195      id: 'hermes',
 196      name: 'Hermes Agent',
 197      description: 'Connect Hermes Agent through its local or remote OpenAI-compatible API server runtime.',
 198      requiresKey: false,
 199      supportsEndpoint: true,
 200      allowMultiple: true,
 201      defaultEndpoint: 'http://127.0.0.1:8642/v1',
 202      optionalKey: true,
 203      badge: 'API Server',
 204      icon: 'H',
 205    },
 206    {
 207      id: 'anthropic',
 208      name: 'Anthropic',
 209      description: 'Claude models — strong for coding, analysis, and long-form reasoning.',
 210      requiresKey: true,
 211      supportsEndpoint: false,
 212      keyUrl: 'https://console.anthropic.com/settings/keys',
 213      keyLabel: 'console.anthropic.com',
 214      icon: 'A',
 215      modelLibraryUrl: 'https://docs.anthropic.com/en/docs/about-claude/models',
 216    },
 217    {
 218      id: 'google',
 219      name: 'Google Gemini',
 220      description: 'Gemini models with strong multimodal and coding support.',
 221      requiresKey: true,
 222      supportsEndpoint: false,
 223      keyUrl: 'https://aistudio.google.com/app/apikey',
 224      keyLabel: 'aistudio.google.com',
 225      keyPlaceholder: 'AIza...',
 226      icon: 'G',
 227      modelLibraryUrl: 'https://ai.google.dev/gemini-api/docs/models',
 228    },
 229    {
 230      id: 'deepseek',
 231      name: 'DeepSeek',
 232      description: 'High-value reasoning and coding models from DeepSeek.',
 233      requiresKey: true,
 234      supportsEndpoint: false,
 235      keyUrl: 'https://platform.deepseek.com/api_keys',
 236      keyLabel: 'platform.deepseek.com',
 237      icon: 'D',
 238      modelLibraryUrl: 'https://api-docs.deepseek.com/quick_start/pricing',
 239    },
 240    {
 241      id: 'groq',
 242      name: 'Groq',
 243      description: 'Very fast inference with open and reasoning model options.',
 244      requiresKey: true,
 245      supportsEndpoint: false,
 246      keyUrl: 'https://console.groq.com/keys',
 247      keyLabel: 'console.groq.com',
 248      icon: 'G',
 249      modelLibraryUrl: 'https://console.groq.com/docs/models',
 250    },
 251    {
 252      id: 'together',
 253      name: 'Together AI',
 254      description: 'Broad catalog of open models with OpenAI-compatible APIs.',
 255      requiresKey: true,
 256      supportsEndpoint: false,
 257      keyUrl: 'https://api.together.xyz/settings/api-keys',
 258      keyLabel: 'api.together.xyz',
 259      icon: 'T',
 260      modelLibraryUrl: 'https://docs.together.ai/docs/chat-models',
 261    },
 262    {
 263      id: 'mistral',
 264      name: 'Mistral AI',
 265      description: 'Efficient frontier models with strong latency and quality.',
 266      requiresKey: true,
 267      supportsEndpoint: false,
 268      keyUrl: 'https://console.mistral.ai/api-keys/',
 269      keyLabel: 'console.mistral.ai',
 270      icon: 'M',
 271      modelLibraryUrl: 'https://docs.mistral.ai/getting-started/models/models_overview/',
 272    },
 273    {
 274      id: 'xai',
 275      name: 'xAI (Grok)',
 276      description: 'Grok models for fast answers, coding, and analysis.',
 277      requiresKey: true,
 278      supportsEndpoint: false,
 279      keyUrl: 'https://console.x.ai',
 280      keyLabel: 'console.x.ai',
 281      icon: 'X',
 282      modelLibraryUrl: 'https://docs.x.ai/docs/models',
 283    },
 284    {
 285      id: 'fireworks',
 286      name: 'Fireworks AI',
 287      description: 'Serverless and optimized open-model inference endpoints.',
 288      requiresKey: true,
 289      supportsEndpoint: false,
 290      keyUrl: 'https://fireworks.ai/account/api-keys',
 291      keyLabel: 'fireworks.ai',
 292      icon: 'F',
 293      modelLibraryUrl: 'https://fireworks.ai/models',
 294    },
 295    {
 296      id: 'nebius',
 297      name: 'Nebius',
 298      description: 'Wide catalog of 60+ open-source models via Nebius Token Factory.',
 299      requiresKey: true,
 300      supportsEndpoint: false,
 301      keyUrl: 'https://studio.nebius.com/settings/api-keys',
 302      keyLabel: 'studio.nebius.com',
 303      icon: 'N',
 304      modelLibraryUrl: 'https://nebius.com/services/token-factory',
 305    },
 306    {
 307      id: 'deepinfra',
 308      name: 'DeepInfra',
 309      description: 'Fast serverless inference for popular open-source models.',
 310      requiresKey: true,
 311      supportsEndpoint: false,
 312      keyUrl: 'https://deepinfra.com/dash/api_keys',
 313      keyLabel: 'deepinfra.com',
 314      icon: 'D',
 315      modelLibraryUrl: 'https://deepinfra.com/models',
 316    },
 317    {
 318      id: 'ollama',
 319      name: 'Ollama',
 320      description: 'Run local open-source models or connect to Ollama Cloud.',
 321      requiresKey: false,
 322      supportsEndpoint: true,
 323      allowMultiple: true,
 324      defaultEndpoint: 'http://localhost:11434',
 325      optionalKey: true,
 326      badge: 'Local + Cloud',
 327      icon: 'L',
 328      modelLibraryUrl: 'https://ollama.com/library',
 329      cloudEndpoint: 'https://api.ollama.com',
 330    },
 331    {
 332      id: 'custom',
 333      name: 'Custom Provider',
 334      description: 'Any OpenAI-compatible API endpoint (LM Studio, vLLM, local gateways, etc.).',
 335      requiresKey: false,
 336      supportsEndpoint: true,
 337      allowMultiple: true,
 338      optionalKey: true,
 339      icon: '+',
 340    },
 341  ]
 342  
 343  export const STARTER_AGENT_TOOLS = [
 344    'memory',
 345    'files',
 346    'execute',
 347    'web_search',
 348    'web_fetch',
 349    'browser',
 350    'manage_agents',
 351    'manage_tasks',
 352    'manage_schedules',
 353    'schedule_wake',
 354    'manage_skills',
 355    'manage_connectors',
 356    'manage_sessions',
 357    'manage_secrets',
 358    'manage_documents',
 359    'manage_webhooks',
 360    'claude_code',
 361    'codex_cli',
 362    'opencode_cli',
 363    'gemini_cli',
 364    'copilot_cli',
 365    'droid_cli',
 366    'cursor_cli',
 367    'qwen_code_cli',
 368    'openclaw_workspace',
 369  ]
 370  
 371  export const SWARMCLAW_ASSISTANT_PROMPT = `You are the default SwarmClaw assistant inside the SwarmClaw dashboard.
 372  
 373  Primary objective:
 374  - Help the user operate SwarmClaw itself before anything else.
 375  
 376  When the user asks about SwarmClaw, prioritize concrete guidance with exact UI paths and commands:
 377  - Sessions: create, configure provider/model, and run chats.
 378  - Agents: create specialist agents, set provider/model, tools, prompts, and delegation.
 379  - Providers: connect API keys/endpoints, troubleshoot auth/model issues.
 380  - Tasks + Schedules: queue work and automate recurring runs.
 381  - Skills + Connectors + Webhooks + Secrets + Memory: explain when to use each and how to configure safely.
 382  
 383  Behavior:
 384  - Be concise, direct, and action-oriented.
 385  - If the request is ambiguous, ask one focused clarifying question.
 386  - Prefer step-by-step instructions that can be executed immediately.
 387  - When the user asks for direct execution (for example browsing, screenshots, research, or file edits), use available tools and return real results instead of only describing what to do.
 388  - If a capability depends on provider/tool configuration, call that out explicitly.`
 389  
 390  const PERSONAL_ASSISTANT_PROMPT = `You are a personal AI copilot inside SwarmClaw.
 391  
 392  Primary objective:
 393  - Help the user make progress on whatever matters to them, whether that is research, planning, writing, building, organizing life admin, or running a business.
 394  
 395  Behavior:
 396  - Start from the user's intent, not from the tooling.
 397  - Turn vague goals into concrete next steps.
 398  - When useful, suggest tasks, schedules, or specialist agents, but do not force control-plane workflow on the user.
 399  - Stay concise, practical, and execution-oriented.`
 400  
 401  const RESEARCH_PROMPT = `You are a research copilot inside SwarmClaw.
 402  
 403  Primary objective:
 404  - Gather facts, compare options, summarize findings, and keep the user's work organized.
 405  
 406  Behavior:
 407  - Clarify the research question when needed.
 408  - Prefer structured findings, tradeoffs, and source-backed summaries.
 409  - Capture useful outputs in files or tasks when that helps the user continue.`
 410  
 411  const BUILDER_PROMPT = `You are a builder agent inside SwarmClaw.
 412  
 413  Primary objective:
 414  - Help the user design, implement, debug, and ship software or technical projects.
 415  
 416  Behavior:
 417  - Move from goal to concrete implementation steps quickly.
 418  - Use code, files, browser, and task tooling when helpful.
 419  - Surface blockers, assumptions, and verification clearly.`
 420  
 421  const REVIEWER_PROMPT = `You are a reviewer agent inside SwarmClaw.
 422  
 423  Primary objective:
 424  - Review plans, code, documents, and outputs for quality, correctness, and risk.
 425  
 426  Behavior:
 427  - Focus first on bugs, regressions, gaps, and unclear assumptions.
 428  - Be direct and specific.
 429  - Offer concrete follow-up actions when you find issues.`
 430  
 431  const WRITER_PROMPT = `You are a writing copilot inside SwarmClaw.
 432  
 433  Primary objective:
 434  - Help the user draft, refine, and structure written work for clarity and impact.
 435  
 436  Behavior:
 437  - Adapt tone, format, and level of detail to the user's context.
 438  - Suggest outlines, drafts, revisions, and packaging for different channels.
 439  - Keep momentum high and avoid generic filler.`
 440  
 441  const EDITOR_PROMPT = `You are an editor inside SwarmClaw.
 442  
 443  Primary objective:
 444  - Improve drafts for clarity, structure, tone, and quality.
 445  
 446  Behavior:
 447  - Tighten weak writing, call out inconsistencies, and preserve the intended voice.
 448  - Give concise, high-signal edits and rationale.
 449  - Flag missing evidence or unclear claims when relevant.`
 450  
 451  const OPERATOR_PROMPT = `You are an operations-focused SwarmClaw operator.
 452  
 453  Primary objective:
 454  - Keep work moving across agents, tasks, schedules, and approvals without losing sight of the user's real goals.
 455  
 456  Behavior:
 457  - Monitor progress, surface bottlenecks, and delegate when appropriate.
 458  - Be explicit about what is blocked, what is running, and what should happen next.
 459  - Treat the control plane as a means to an end, not the end itself.`
 460  
 461  export type OnboardingPath = 'quick' | 'intent' | 'manual'
 462  
 463  export interface OnboardingPathOption {
 464    id: OnboardingPath
 465    title: string
 466    description: string
 467    detail: string
 468    badge?: string
 469  }
 470  
 471  export const ONBOARDING_PATHS: OnboardingPathOption[] = [
 472    {
 473      id: 'quick',
 474      title: 'Quick Start',
 475      description: 'Provider first, one starter kit, fastest path into chat.',
 476      detail: 'Best when you already know which provider you want and want to get moving quickly.',
 477      badge: 'Fastest',
 478    },
 479    {
 480      id: 'intent',
 481      title: 'Goal-Driven Setup',
 482      description: 'Choose a starter team around what you want to accomplish.',
 483      detail: 'Best when you know the outcome you want but want SwarmClaw to start from a stronger template.',
 484      badge: 'Guided',
 485    },
 486    {
 487      id: 'manual',
 488      title: 'Custom Setup',
 489      description: 'Configure providers first and choose whether to start blank or from a template.',
 490      detail: 'Best for advanced users who want control over the initial setup and agent mix.',
 491    },
 492  ]
 493  
 494  export interface StarterKitAgentTemplate {
 495    id: string
 496    name: string
 497    description: string
 498    systemPrompt: string
 499    tools: string[]
 500    capabilities?: string[]
 501    recommendedProviders?: SetupProvider[]
 502    delegationEnabled?: boolean
 503  }
 504  
 505  export interface StarterKit {
 506    id: string
 507    name: string
 508    description: string
 509    detail: string
 510    badge?: string
 511    recommendedFor?: OnboardingPath[]
 512    agents: StarterKitAgentTemplate[]
 513  }
 514  
 515  const PERSONAL_AGENT_TOOLS = [
 516    'memory',
 517    'files',
 518    'execute',
 519    'web_search',
 520    'web_fetch',
 521    'browser',
 522    'manage_tasks',
 523    'manage_schedules',
 524    'manage_documents',
 525  ]
 526  
 527  const RESEARCH_AGENT_TOOLS = [
 528    'memory',
 529    'files',
 530    'execute',
 531    'web_search',
 532    'web_fetch',
 533    'browser',
 534    'manage_tasks',
 535    'manage_documents',
 536  ]
 537  
 538  const BUILDER_AGENT_TOOLS = [
 539    'memory',
 540    'files',
 541    'execute',
 542    'web_search',
 543    'web_fetch',
 544    'browser',
 545    'manage_tasks',
 546    'claude_code',
 547    'codex_cli',
 548    'opencode_cli',
 549    'gemini_cli',
 550    'copilot_cli',
 551    'droid_cli',
 552    'cursor_cli',
 553    'qwen_code_cli',
 554  ]
 555  
 556  const INBOX_TRIAGE_PROMPT = `You are an inbox triage copilot inside SwarmClaw.
 557  
 558  Primary objective:
 559  - Sort incoming email, messages, and notifications so the user only sees what needs their attention.
 560  
 561  Behavior:
 562  - Classify items by urgency, topic, and whether they need a reply.
 563  - Draft short reply candidates for the user to approve when appropriate.
 564  - Surface clear summaries and action lists instead of raw firehose.
 565  - Stop and ask the user before sending on their behalf.`
 566  
 567  const DATA_ANALYST_PROMPT = `You are a data analyst inside SwarmClaw.
 568  
 569  Primary objective:
 570  - Help the user explore, clean, and summarize data, producing concise findings and charts when useful.
 571  
 572  Behavior:
 573  - Prefer working in a shell (python/pandas) or via files, showing intermediate results.
 574  - State the question before computing, and flag limitations or assumptions.
 575  - Summarize insights with simple prose plus key numbers.
 576  - When useful, save artifacts (CSV, markdown, PNG) to the working directory.`
 577  
 578  const INBOX_AGENT_TOOLS = [
 579    'memory',
 580    'files',
 581    'web_search',
 582    'web_fetch',
 583    'email',
 584    'manage_tasks',
 585    'manage_documents',
 586  ]
 587  
 588  const DATA_ANALYST_TOOLS = [
 589    'memory',
 590    'files',
 591    'execute',
 592    'web_search',
 593    'web_fetch',
 594    'manage_tasks',
 595    'manage_documents',
 596  ]
 597  
 598  const OPERATOR_AGENT_TOOLS = STARTER_AGENT_TOOLS
 599  const OPENCLAW_AGENT_TOOLS = [
 600    'memory',
 601    'files',
 602    'execute',
 603    'web_search',
 604    'web_fetch',
 605    'browser',
 606    'manage_tasks',
 607    'manage_schedules',
 608    'manage_sessions',
 609    'openclaw_workspace',
 610  ]
 611  
 612  export const STARTER_KITS: StarterKit[] = [
 613    {
 614      id: 'personal_assistant',
 615      name: 'Personal Assistant',
 616      description: 'One flexible agent for open-ended work.',
 617      detail: 'A strong default for general planning, research, writing, and day-to-day execution.',
 618      badge: 'Recommended',
 619      recommendedFor: ['quick', 'intent'],
 620      agents: [
 621        {
 622          id: 'sidekick',
 623          name: 'Sidekick',
 624          description: 'A versatile assistant for everyday work, planning, and follow-through.',
 625          systemPrompt: PERSONAL_ASSISTANT_PROMPT,
 626          tools: PERSONAL_AGENT_TOOLS,
 627          capabilities: ['planning', 'research', 'writing', 'coordination'],
 628        },
 629      ],
 630    },
 631    {
 632      id: 'research_copilot',
 633      name: 'Research Copilot',
 634      description: 'A focused setup for investigation and synthesis.',
 635      detail: 'Useful for market scans, comparisons, technical investigation, and source-backed summaries.',
 636      recommendedFor: ['quick', 'intent', 'manual'],
 637      agents: [
 638        {
 639          id: 'researcher',
 640          name: 'Researcher',
 641          description: 'Collects facts, compares options, and produces structured findings.',
 642          systemPrompt: RESEARCH_PROMPT,
 643          tools: RESEARCH_AGENT_TOOLS,
 644          capabilities: ['research', 'analysis', 'summarization'],
 645        },
 646      ],
 647    },
 648    {
 649      id: 'builder_studio',
 650      name: 'Builder Studio',
 651      description: 'Start with a builder and a reviewer.',
 652      detail: 'Good for coding, prototyping, product work, and technical iteration.',
 653      recommendedFor: ['quick', 'intent', 'manual'],
 654      agents: [
 655        {
 656          id: 'builder',
 657          name: 'Builder',
 658          description: 'Implements ideas, ships changes, and drives technical execution.',
 659          systemPrompt: BUILDER_PROMPT,
 660          tools: BUILDER_AGENT_TOOLS,
 661          capabilities: ['coding', 'debugging', 'implementation'],
 662          recommendedProviders: ['anthropic', 'openai', 'google', 'openclaw', 'ollama'],
 663        },
 664        {
 665          id: 'reviewer',
 666          name: 'Reviewer',
 667          description: 'Reviews plans and outputs for bugs, regressions, and quality gaps.',
 668          systemPrompt: REVIEWER_PROMPT,
 669          tools: RESEARCH_AGENT_TOOLS,
 670          capabilities: ['review', 'testing', 'risk assessment'],
 671          recommendedProviders: ['anthropic', 'openai', 'google', 'openclaw'],
 672        },
 673      ],
 674    },
 675    {
 676      id: 'content_studio',
 677      name: 'Content Studio',
 678      description: 'A writer and editor working together.',
 679      detail: 'Useful for blogs, marketing copy, docs, newsletters, and publishing workflows.',
 680      recommendedFor: ['intent', 'manual'],
 681      agents: [
 682        {
 683          id: 'writer',
 684          name: 'Writer',
 685          description: 'Drafts content, outlines, and messaging in the user’s preferred style.',
 686          systemPrompt: WRITER_PROMPT,
 687          tools: PERSONAL_AGENT_TOOLS,
 688          capabilities: ['writing', 'messaging', 'structuring'],
 689        },
 690        {
 691          id: 'editor',
 692          name: 'Editor',
 693          description: 'Improves structure, tone, and quality before publishing.',
 694          systemPrompt: EDITOR_PROMPT,
 695          tools: RESEARCH_AGENT_TOOLS,
 696          capabilities: ['editing', 'quality control', 'review'],
 697        },
 698      ],
 699    },
 700    {
 701      id: 'operator_swarm',
 702      name: 'Delegate Team',
 703      description: 'A coordinator plus an execution agent for multi-agent work.',
 704      detail: 'Use this when you want one agent to plan and delegate while another handles focused execution.',
 705      recommendedFor: ['intent', 'manual'],
 706      agents: [
 707        {
 708          id: 'operator',
 709          name: 'Operator',
 710          description: 'Coordinates tasks, delegates work, and keeps the workspace moving.',
 711          systemPrompt: OPERATOR_PROMPT,
 712          tools: OPERATOR_AGENT_TOOLS,
 713          capabilities: ['coordination', 'delegation', 'operations'],
 714          delegationEnabled: true,
 715          recommendedProviders: ['openclaw', 'anthropic', 'openai'],
 716        },
 717        {
 718          id: 'maker',
 719          name: 'Maker',
 720          description: 'Executes focused work items assigned by the user or other agents.',
 721          systemPrompt: BUILDER_PROMPT,
 722          tools: BUILDER_AGENT_TOOLS,
 723          capabilities: ['execution', 'implementation', 'research'],
 724        },
 725      ],
 726    },
 727    {
 728      id: 'openclaw_fleet',
 729      name: 'OpenClaw Fleet',
 730      description: 'An OpenClaw-first starter setup for local or remote gateways.',
 731      detail: 'Designed for users who want multiple OpenClaw-backed agents right away, with official-only local deploy, single-VPS, and private-tailnet defaults built into setup.',
 732      recommendedFor: ['manual'],
 733      badge: 'OpenClaw',
 734      agents: [
 735        {
 736          id: 'openclaw_operator',
 737          name: 'OpenClaw Operator',
 738          description: 'Coordinates OpenClaw-backed execution and keeps distributed agents aligned.',
 739          systemPrompt: OPERATOR_PROMPT,
 740          tools: OPERATOR_AGENT_TOOLS,
 741          capabilities: ['coordination', 'delegation', 'openclaw'],
 742          delegationEnabled: true,
 743          recommendedProviders: ['openclaw'],
 744        },
 745        {
 746          id: 'openclaw_builder',
 747          name: 'Remote Builder',
 748          description: 'A build-focused OpenClaw agent for implementation work on a chosen gateway.',
 749          systemPrompt: BUILDER_PROMPT,
 750          tools: OPENCLAW_AGENT_TOOLS,
 751          capabilities: ['coding', 'implementation', 'openclaw'],
 752          recommendedProviders: ['openclaw'],
 753        },
 754        {
 755          id: 'openclaw_researcher',
 756          name: 'Remote Researcher',
 757          description: 'A research-focused OpenClaw agent for browser and knowledge work on a chosen gateway.',
 758          systemPrompt: RESEARCH_PROMPT,
 759          tools: OPENCLAW_AGENT_TOOLS,
 760          capabilities: ['research', 'analysis', 'openclaw'],
 761          recommendedProviders: ['openclaw'],
 762        },
 763      ],
 764    },
 765    {
 766      id: 'inbox_triage',
 767      name: 'Inbox Triager',
 768      description: 'A single agent that sorts and summarizes your inbox.',
 769      detail: 'Good when messages pile up faster than you can read them. Pairs well with the email connector.',
 770      recommendedFor: ['intent', 'manual'],
 771      agents: [
 772        {
 773          id: 'triager',
 774          name: 'Triager',
 775          description: 'Triages inbound messages into urgent, reply-needed, and informational buckets.',
 776          systemPrompt: INBOX_TRIAGE_PROMPT,
 777          tools: INBOX_AGENT_TOOLS,
 778          capabilities: ['triage', 'summarization', 'drafting'],
 779        },
 780      ],
 781    },
 782    {
 783      id: 'data_analyst',
 784      name: 'Data Analyst',
 785      description: 'A single agent focused on exploring and summarizing data.',
 786      detail: 'Useful for ad-hoc analysis, CSV crunching, and producing concise findings with charts.',
 787      recommendedFor: ['intent', 'manual'],
 788      agents: [
 789        {
 790          id: 'analyst',
 791          name: 'Analyst',
 792          description: 'Runs exploratory analyses, cleans datasets, and writes short summaries with key numbers.',
 793          systemPrompt: DATA_ANALYST_PROMPT,
 794          tools: DATA_ANALYST_TOOLS,
 795          capabilities: ['analysis', 'summarization', 'visualization'],
 796        },
 797      ],
 798    },
 799    {
 800      id: 'blank_workspace',
 801      name: 'Blank Workspace',
 802      description: 'Finish setup without starter agents.',
 803      detail: 'Use this if you want to land in the app first and create providers, agents, and workflows yourself.',
 804      recommendedFor: ['manual'],
 805      badge: 'Blank',
 806      agents: [],
 807    },
 808  ]
 809  
 810  export interface DefaultAgentConfig {
 811    name: string
 812    description: string
 813    systemPrompt: string
 814    model: string
 815    tools: string[]
 816  }
 817  
 818  export const DEFAULT_AGENTS: Record<SetupProvider, DefaultAgentConfig> = {
 819    'claude-cli': {
 820      name: 'Claude CLI',
 821      description: 'A helpful assistant powered by Claude Code CLI.',
 822      systemPrompt: SWARMCLAW_ASSISTANT_PROMPT,
 823      model: 'claude-sonnet-4-6',
 824      tools: STARTER_AGENT_TOOLS,
 825    },
 826    'codex-cli': {
 827      name: 'Codex CLI',
 828      description: 'A helpful assistant powered by OpenAI Codex CLI.',
 829      systemPrompt: SWARMCLAW_ASSISTANT_PROMPT,
 830      model: 'gpt-5.3-codex',
 831      tools: STARTER_AGENT_TOOLS,
 832    },
 833    'opencode-cli': {
 834      name: 'OpenCode',
 835      description: 'A helpful assistant powered by OpenCode CLI.',
 836      systemPrompt: SWARMCLAW_ASSISTANT_PROMPT,
 837      model: 'claude-sonnet-4-6',
 838      tools: STARTER_AGENT_TOOLS,
 839    },
 840    'opencode-web': {
 841      name: 'OpenCode Web',
 842      description: 'A helpful assistant powered by a remote OpenCode HTTP server.',
 843      systemPrompt: SWARMCLAW_ASSISTANT_PROMPT,
 844      model: 'anthropic/claude-sonnet-4-6',
 845      tools: STARTER_AGENT_TOOLS,
 846    },
 847    'gemini-cli': {
 848      name: 'Gemini CLI',
 849      description: 'A helpful assistant powered by Gemini CLI.',
 850      systemPrompt: SWARMCLAW_ASSISTANT_PROMPT,
 851      model: 'gemini-3.1-pro',
 852      tools: STARTER_AGENT_TOOLS,
 853    },
 854    'copilot-cli': {
 855      name: 'Copilot CLI',
 856      description: 'A helpful assistant powered by GitHub Copilot CLI.',
 857      systemPrompt: SWARMCLAW_ASSISTANT_PROMPT,
 858      model: 'claude-sonnet-4-6',
 859      tools: STARTER_AGENT_TOOLS,
 860    },
 861    'droid-cli': {
 862      name: 'Factory Droid',
 863      description: 'A helpful assistant powered by Factory Droid CLI.',
 864      systemPrompt: SWARMCLAW_ASSISTANT_PROMPT,
 865      model: 'default',
 866      tools: STARTER_AGENT_TOOLS,
 867    },
 868    'cursor-cli': {
 869      name: 'Cursor CLI',
 870      description: 'A helpful assistant powered by Cursor Agent CLI.',
 871      systemPrompt: SWARMCLAW_ASSISTANT_PROMPT,
 872      model: 'auto',
 873      tools: STARTER_AGENT_TOOLS,
 874    },
 875    'qwen-code-cli': {
 876      name: 'Qwen Code',
 877      description: 'A helpful assistant powered by Qwen Code CLI.',
 878      systemPrompt: SWARMCLAW_ASSISTANT_PROMPT,
 879      model: 'default',
 880      tools: STARTER_AGENT_TOOLS,
 881    },
 882    goose: {
 883      name: 'Goose',
 884      description: 'A helpful assistant powered by Goose.',
 885      systemPrompt: SWARMCLAW_ASSISTANT_PROMPT,
 886      model: 'default',
 887      tools: STARTER_AGENT_TOOLS,
 888    },
 889    anthropic: {
 890      name: 'Claude',
 891      description: 'A helpful Claude-powered assistant.',
 892      systemPrompt: SWARMCLAW_ASSISTANT_PROMPT,
 893      model: 'claude-sonnet-4-6',
 894      tools: STARTER_AGENT_TOOLS,
 895    },
 896    openai: {
 897      name: 'Atlas',
 898      description: 'A helpful GPT-powered assistant.',
 899      systemPrompt: SWARMCLAW_ASSISTANT_PROMPT,
 900      model: 'gpt-5.4',
 901      tools: STARTER_AGENT_TOOLS,
 902    },
 903    openrouter: {
 904      name: 'Router',
 905      description: 'A helpful assistant powered through OpenRouter.',
 906      systemPrompt: SWARMCLAW_ASSISTANT_PROMPT,
 907      model: 'anthropic/claude-sonnet-4.6',
 908      tools: STARTER_AGENT_TOOLS,
 909    },
 910    google: {
 911      name: 'Gemini',
 912      description: 'A helpful Gemini-powered assistant.',
 913      systemPrompt: SWARMCLAW_ASSISTANT_PROMPT,
 914      model: 'gemini-3.1-pro',
 915      tools: STARTER_AGENT_TOOLS,
 916    },
 917    deepseek: {
 918      name: 'DeepSeek',
 919      description: 'A helpful DeepSeek-powered assistant.',
 920      systemPrompt: SWARMCLAW_ASSISTANT_PROMPT,
 921      model: 'deepseek-chat',
 922      tools: STARTER_AGENT_TOOLS,
 923    },
 924    groq: {
 925      name: 'Bolt',
 926      description: 'A low-latency assistant powered by Groq.',
 927      systemPrompt: SWARMCLAW_ASSISTANT_PROMPT,
 928      model: 'meta-llama/llama-4-maverick-17b-128e-instruct',
 929      tools: STARTER_AGENT_TOOLS,
 930    },
 931    together: {
 932      name: 'Mosaic',
 933      description: 'A helpful assistant powered by Together AI.',
 934      systemPrompt: SWARMCLAW_ASSISTANT_PROMPT,
 935      model: 'meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8',
 936      tools: STARTER_AGENT_TOOLS,
 937    },
 938    mistral: {
 939      name: 'Mistral',
 940      description: 'A helpful assistant powered by Mistral.',
 941      systemPrompt: SWARMCLAW_ASSISTANT_PROMPT,
 942      model: 'mistral-large-latest',
 943      tools: STARTER_AGENT_TOOLS,
 944    },
 945    xai: {
 946      name: 'Grok',
 947      description: 'A helpful assistant powered by xAI Grok.',
 948      systemPrompt: SWARMCLAW_ASSISTANT_PROMPT,
 949      model: 'grok-4',
 950      tools: STARTER_AGENT_TOOLS,
 951    },
 952    fireworks: {
 953      name: 'Spark',
 954      description: 'A helpful assistant powered by Fireworks AI.',
 955      systemPrompt: SWARMCLAW_ASSISTANT_PROMPT,
 956      model: 'accounts/fireworks/models/deepseek-v3p2',
 957      tools: STARTER_AGENT_TOOLS,
 958    },
 959    nebius: {
 960      name: 'Nebius Agent',
 961      description: 'A helpful assistant powered by Nebius.',
 962      systemPrompt: SWARMCLAW_ASSISTANT_PROMPT,
 963      model: 'deepseek-ai/DeepSeek-V3.2',
 964      tools: STARTER_AGENT_TOOLS,
 965    },
 966    deepinfra: {
 967      name: 'DeepInfra Agent',
 968      description: 'A helpful assistant powered by DeepInfra.',
 969      systemPrompt: SWARMCLAW_ASSISTANT_PROMPT,
 970      model: 'deepseek-ai/DeepSeek-V3.2',
 971      tools: STARTER_AGENT_TOOLS,
 972    },
 973    ollama: {
 974      name: 'Local',
 975      description: 'A local assistant running through Ollama.',
 976      systemPrompt: SWARMCLAW_ASSISTANT_PROMPT,
 977      model: 'llama3',
 978      tools: STARTER_AGENT_TOOLS,
 979    },
 980    openclaw: {
 981      name: 'OpenClaw Operator',
 982      description: 'A manager agent for talking to and coordinating OpenClaw instances.',
 983      systemPrompt: 'You are an operator focused on reliable execution, clear status updates, and task completion.',
 984      model: '',
 985      tools: STARTER_AGENT_TOOLS,
 986    },
 987    hermes: {
 988      name: 'Hermes',
 989      description: 'A runtime-backed assistant powered by Hermes Agent.',
 990      systemPrompt: SWARMCLAW_ASSISTANT_PROMPT,
 991      model: 'hermes-agent',
 992      tools: STARTER_AGENT_TOOLS,
 993    },
 994    custom: {
 995      name: 'Custom Agent',
 996      description: 'An assistant powered by a custom OpenAI-compatible provider.',
 997      systemPrompt: SWARMCLAW_ASSISTANT_PROMPT,
 998      model: '',
 999      tools: STARTER_AGENT_TOOLS,
1000    },
1001  }
1002  
1003  export function getDefaultModelForProvider(provider: SetupProvider): string {
1004    return DEFAULT_AGENTS[provider].model
1005  }