agent-mcp.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. /**
  2. * Agent MCP - Manages project agent roles during PBL generation.
  3. *
  4. * Migrated from PBL-Nano. No HTML rendering, no list_tools(), no hardcoded model.
  5. * Operates directly on a shared PBLProjectConfig.
  6. */
  7. import type { PBLProjectConfig, PBLAgent, PBLRoleDivision, PBLToolResult } from '../types';
  8. export class AgentMCP {
  9. private config: PBLProjectConfig;
  10. constructor(config: PBLProjectConfig) {
  11. this.config = config;
  12. }
  13. listAgents(): PBLToolResult {
  14. return {
  15. success: true,
  16. agents: this.config.agents.map((a) => ({ ...a })),
  17. message: this.config.agents.length === 0 ? 'No agents found.' : undefined,
  18. };
  19. }
  20. getAgentInfo(name: string): PBLToolResult {
  21. const agent = this.config.agents.find((a) => a.name === name);
  22. if (!agent) {
  23. return { success: false, error: `Agent "${name}" not found.` };
  24. }
  25. return { success: true, agent: { ...agent } };
  26. }
  27. createAgent(params: {
  28. name: string;
  29. system_prompt: string;
  30. default_mode: string;
  31. delay_time?: number;
  32. actor_role?: string;
  33. role_division?: PBLRoleDivision;
  34. is_system_agent?: boolean;
  35. }): PBLToolResult {
  36. const {
  37. name,
  38. system_prompt,
  39. default_mode,
  40. delay_time = 0,
  41. actor_role = '',
  42. role_division = 'development',
  43. is_system_agent = false,
  44. } = params;
  45. if (!name?.trim()) {
  46. return { success: false, error: 'Agent name cannot be empty.' };
  47. }
  48. if (!system_prompt?.trim()) {
  49. return { success: false, error: 'System prompt cannot be empty.' };
  50. }
  51. if (this.config.agents.find((a) => a.name === name)) {
  52. return { success: false, error: `Agent "${name}" already exists.` };
  53. }
  54. const newAgent: PBLAgent = {
  55. name,
  56. actor_role,
  57. role_division,
  58. system_prompt,
  59. default_mode,
  60. delay_time,
  61. env: {
  62. chat: {
  63. max_tokens: 4096,
  64. system_prompt,
  65. },
  66. },
  67. is_user_role: false,
  68. is_active: false,
  69. is_system_agent,
  70. };
  71. this.config.agents.push(newAgent);
  72. return { success: true, message: `Agent "${name}" created successfully.` };
  73. }
  74. updateAgent(params: {
  75. name: string;
  76. new_name?: string;
  77. system_prompt?: string;
  78. default_mode?: string;
  79. delay_time?: number;
  80. actor_role?: string;
  81. role_division?: PBLRoleDivision;
  82. }): PBLToolResult {
  83. const agent = this.config.agents.find((a) => a.name === params.name);
  84. if (!agent) {
  85. return { success: false, error: `Agent "${params.name}" not found.` };
  86. }
  87. if (
  88. params.new_name &&
  89. params.new_name !== params.name &&
  90. this.config.agents.find((a) => a.name === params.new_name)
  91. ) {
  92. return {
  93. success: false,
  94. error: `Agent "${params.new_name}" already exists.`,
  95. };
  96. }
  97. if (params.new_name !== undefined) agent.name = params.new_name;
  98. if (params.system_prompt !== undefined) {
  99. agent.system_prompt = params.system_prompt;
  100. if (agent.env.chat && typeof agent.env.chat === 'object') {
  101. (agent.env.chat as Record<string, unknown>).system_prompt = params.system_prompt;
  102. }
  103. }
  104. if (params.default_mode !== undefined) agent.default_mode = params.default_mode;
  105. if (params.delay_time !== undefined) agent.delay_time = params.delay_time;
  106. if (params.actor_role !== undefined) agent.actor_role = params.actor_role;
  107. if (params.role_division !== undefined) agent.role_division = params.role_division;
  108. return { success: true, message: 'Agent updated successfully.' };
  109. }
  110. deleteAgent(name: string): PBLToolResult {
  111. const index = this.config.agents.findIndex((a) => a.name === name);
  112. if (index === -1) {
  113. return { success: false, error: `Agent "${name}" not found.` };
  114. }
  115. this.config.agents.splice(index, 1);
  116. return { success: true, message: 'Agent deleted successfully.' };
  117. }
  118. }