@sowonai/crewx-cli 0.4.0-dev.9 → 0.4.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/README.md +34 -12
  2. package/dist/ai-provider.service.d.ts +7 -12
  3. package/dist/ai-provider.service.js +42 -20
  4. package/dist/ai-provider.service.js.map +1 -1
  5. package/dist/ai.service.d.ts +5 -45
  6. package/dist/ai.service.js +10 -587
  7. package/dist/ai.service.js.map +1 -1
  8. package/dist/app.module.js +67 -11
  9. package/dist/app.module.js.map +1 -1
  10. package/dist/cli/agent.handler.js +3 -4
  11. package/dist/cli/agent.handler.js.map +1 -1
  12. package/dist/cli/chat.handler.d.ts +2 -1
  13. package/dist/cli/chat.handler.js +17 -6
  14. package/dist/cli/chat.handler.js.map +1 -1
  15. package/dist/cli/cli.handler.js +4 -0
  16. package/dist/cli/cli.handler.js.map +1 -1
  17. package/dist/cli/doctor.handler.js +8 -40
  18. package/dist/cli/doctor.handler.js.map +1 -1
  19. package/dist/cli/execute.handler.js +8 -6
  20. package/dist/cli/execute.handler.js.map +1 -1
  21. package/dist/cli/log.handler.d.ts +2 -0
  22. package/dist/cli/log.handler.js +69 -0
  23. package/dist/cli/log.handler.js.map +1 -0
  24. package/dist/cli/query.handler.js +4 -2
  25. package/dist/cli/query.handler.js.map +1 -1
  26. package/dist/cli-options.d.ts +4 -2
  27. package/dist/cli-options.js +19 -12
  28. package/dist/cli-options.js.map +1 -1
  29. package/dist/crewx.tool.d.ts +18 -2
  30. package/dist/crewx.tool.js +542 -105
  31. package/dist/crewx.tool.js.map +1 -1
  32. package/dist/providers/dynamic-provider.factory.d.ts +9 -51
  33. package/dist/providers/dynamic-provider.factory.js +44 -506
  34. package/dist/providers/dynamic-provider.factory.js.map +1 -1
  35. package/dist/services/agent-loader.service.d.ts +6 -2
  36. package/dist/services/agent-loader.service.js +210 -26
  37. package/dist/services/agent-loader.service.js.map +1 -1
  38. package/dist/services/config.service.d.ts +7 -27
  39. package/dist/services/config.service.js +80 -38
  40. package/dist/services/config.service.js.map +1 -1
  41. package/dist/services/document-loader.service.d.ts +9 -4
  42. package/dist/services/document-loader.service.js +26 -7
  43. package/dist/services/document-loader.service.js.map +1 -1
  44. package/dist/services/help.service.js +6 -0
  45. package/dist/services/help.service.js.map +1 -1
  46. package/dist/services/parallel-processing.service.d.ts +2 -0
  47. package/dist/services/parallel-processing.service.js +40 -6
  48. package/dist/services/parallel-processing.service.js.map +1 -1
  49. package/dist/services/provider-bridge.service.d.ts +35 -0
  50. package/dist/services/provider-bridge.service.js +224 -0
  51. package/dist/services/provider-bridge.service.js.map +1 -0
  52. package/dist/services/remote-agent.service.d.ts +1 -1
  53. package/dist/services/task-management.service.d.ts +3 -3
  54. package/dist/services/task-management.service.js +2 -1
  55. package/dist/services/task-management.service.js.map +1 -1
  56. package/dist/services/template.service.d.ts +2 -0
  57. package/dist/services/template.service.js +46 -1
  58. package/dist/services/template.service.js.map +1 -1
  59. package/dist/utils/stdin-utils.d.ts +4 -25
  60. package/dist/utils/stdin-utils.js +2 -23
  61. package/dist/utils/stdin-utils.js.map +1 -1
  62. package/dist/utils/template-processor.d.ts +1 -29
  63. package/dist/utils/template-processor.js +38 -11
  64. package/dist/utils/template-processor.js.map +1 -1
  65. package/package.json +2 -3
  66. package/scripts/postbuild-cli.mjs +20 -1
  67. package/templates/agents/default.yaml +455 -0
  68. package/templates/agents/minimal.yaml +16 -0
  69. package/templates/documents/crewx-manual.md +390 -0
  70. package/templates/versions.json +19 -0
  71. package/dist/providers/base-ai.provider.d.ts +0 -1
  72. package/dist/providers/base-ai.provider.js +0 -6
  73. package/dist/providers/base-ai.provider.js.map +0 -1
  74. package/dist/providers/claude.provider.d.ts +0 -5
  75. package/dist/providers/claude.provider.js +0 -32
  76. package/dist/providers/claude.provider.js.map +0 -1
  77. package/dist/providers/codex.provider.d.ts +0 -4
  78. package/dist/providers/codex.provider.js +0 -30
  79. package/dist/providers/codex.provider.js.map +0 -1
  80. package/dist/providers/copilot.provider.d.ts +0 -5
  81. package/dist/providers/copilot.provider.js +0 -32
  82. package/dist/providers/copilot.provider.js.map +0 -1
  83. package/dist/providers/gemini.provider.d.ts +0 -5
  84. package/dist/providers/gemini.provider.js +0 -32
  85. package/dist/providers/gemini.provider.js.map +0 -1
  86. package/dist/services/context-enhancement.service.d.ts +0 -13
  87. package/dist/services/context-enhancement.service.js +0 -169
  88. package/dist/services/context-enhancement.service.js.map +0 -1
  89. package/dist/utils/mention-parser.d.ts +0 -18
  90. package/dist/utils/mention-parser.js +0 -136
  91. package/dist/utils/mention-parser.js.map +0 -1
@@ -41,9 +41,13 @@ var __importStar = (this && this.__importStar) || (function () {
41
41
  var __metadata = (this && this.__metadata) || function (k, v) {
42
42
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
43
  };
44
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
45
+ return function (target, key) { decorator(target, key, paramIndex); }
46
+ };
44
47
  var CrewXTool_1;
45
48
  Object.defineProperty(exports, "__esModule", { value: true });
46
49
  exports.CrewXTool = void 0;
50
+ const crewx_sdk_1 = require("@sowonai/crewx-sdk");
47
51
  const common_1 = require("@nestjs/common");
48
52
  const nestjs_mcp_adapter_1 = require("@sowonai/nestjs-mcp-adapter");
49
53
  const zod_1 = require("zod");
@@ -53,7 +57,6 @@ const crypto = __importStar(require("crypto"));
53
57
  const ai_service_1 = require("./ai.service");
54
58
  const ai_provider_service_1 = require("./ai-provider.service");
55
59
  const project_service_1 = require("./project.service");
56
- const crewx_sdk_1 = require("@sowonai/crewx-sdk");
57
60
  const parallel_processing_service_1 = require("./services/parallel-processing.service");
58
61
  const task_management_service_1 = require("./services/task-management.service");
59
62
  const result_formatter_service_1 = require("./services/result-formatter.service");
@@ -62,6 +65,7 @@ const document_loader_service_1 = require("./services/document-loader.service");
62
65
  const tool_call_service_1 = require("./services/tool-call.service");
63
66
  const agent_loader_service_1 = require("./services/agent-loader.service");
64
67
  const remote_agent_service_1 = require("./services/remote-agent.service");
68
+ const provider_bridge_service_1 = require("./services/provider-bridge.service");
65
69
  let CrewXTool = CrewXTool_1 = class CrewXTool {
66
70
  generateSecurityKey() {
67
71
  return crypto.randomBytes(8).toString('hex');
@@ -122,7 +126,7 @@ let CrewXTool = CrewXTool_1 = class CrewXTool {
122
126
  };
123
127
  return JSON.stringify(payload);
124
128
  }
125
- constructor(aiService, aiProviderService, projectService, parallelProcessingService, taskManagementService, resultFormatterService, templateService, documentLoaderService, toolCallService, agentLoaderService, remoteAgentService) {
129
+ constructor(aiService, aiProviderService, projectService, parallelProcessingService, taskManagementService, resultFormatterService, templateService, documentLoaderService, toolCallService, agentLoaderService, remoteAgentService, providerBridgeService, layoutLoader, layoutRenderer) {
126
130
  this.aiService = aiService;
127
131
  this.aiProviderService = aiProviderService;
128
132
  this.projectService = projectService;
@@ -134,6 +138,9 @@ let CrewXTool = CrewXTool_1 = class CrewXTool {
134
138
  this.toolCallService = toolCallService;
135
139
  this.agentLoaderService = agentLoaderService;
136
140
  this.remoteAgentService = remoteAgentService;
141
+ this.providerBridgeService = providerBridgeService;
142
+ this.layoutLoader = layoutLoader;
143
+ this.layoutRenderer = layoutRenderer;
137
144
  this.logger = new common_1.Logger(CrewXTool_1.name);
138
145
  this.timeoutConfig = (0, crewx_sdk_1.getTimeoutConfig)();
139
146
  }
@@ -141,6 +148,128 @@ let CrewXTool = CrewXTool_1 = class CrewXTool {
141
148
  this.toolCallService.setCrewXTool(this);
142
149
  this.logger.log('CrewXTool registered to ToolCallService');
143
150
  }
151
+ async processAgentSystemPrompt(agent, templateContext) {
152
+ const inlineLayout = agent.inline?.layout;
153
+ const baseSystemPrompt = agent.inline?.prompt ||
154
+ agent.inline?.system_prompt ||
155
+ agent.systemPrompt ||
156
+ agent.description ||
157
+ `You are an expert ${agent.id}.`;
158
+ const layoutSpec = inlineLayout ?? 'crewx/default';
159
+ if (layoutSpec) {
160
+ const layoutId = typeof layoutSpec === 'string' ? layoutSpec : layoutSpec.id;
161
+ const layoutProps = typeof layoutSpec === 'object' && layoutSpec !== null && 'props' in layoutSpec
162
+ ? layoutSpec.props
163
+ : undefined;
164
+ try {
165
+ const layout = this.layoutLoader.load(layoutId, layoutProps);
166
+ const providerRaw = agent.provider;
167
+ const providerList = Array.isArray(providerRaw)
168
+ ? providerRaw
169
+ : (typeof providerRaw === 'string' && providerRaw.length > 0)
170
+ ? [providerRaw]
171
+ : [];
172
+ const providerDisplay = providerList.length > 0
173
+ ? providerList.join(', ')
174
+ : (typeof providerRaw === 'string' ? providerRaw : '');
175
+ const inlineConfig = agent.inline
176
+ ? { ...agent.inline, prompt: baseSystemPrompt }
177
+ : { prompt: baseSystemPrompt };
178
+ const templateOptions = [];
179
+ const sessionInfo = {
180
+ mode: templateContext.mode ?? 'query',
181
+ platform: templateContext.platform ?? 'cli',
182
+ options: templateOptions,
183
+ env: templateContext.env ?? {},
184
+ vars: templateContext.vars ?? {},
185
+ tools: templateContext.tools ?? null,
186
+ };
187
+ const documentsForTemplate = {};
188
+ if (this.documentLoaderService.isInitialized()) {
189
+ const docNames = this.documentLoaderService.getDocumentNames();
190
+ for (const docName of docNames) {
191
+ const content = await this.documentLoaderService.getDocumentContent(docName);
192
+ const toc = await this.documentLoaderService.getDocumentToc(docName);
193
+ const summary = await this.documentLoaderService.getDocumentSummary(docName);
194
+ documentsForTemplate[docName] = {
195
+ content: content || '',
196
+ toc: toc || '',
197
+ summary: summary || '',
198
+ };
199
+ }
200
+ }
201
+ const renderContext = {
202
+ user_input: templateContext.user_input,
203
+ agent: {
204
+ id: agent.id,
205
+ name: agent.name || agent.id,
206
+ role: agent.role || '',
207
+ team: agent.team || '',
208
+ description: agent.description || '',
209
+ workingDirectory: agent.workingDirectory,
210
+ capabilities: agent.capabilities || [],
211
+ specialties: agent.specialties || [],
212
+ provider: providerDisplay,
213
+ providerList,
214
+ providerRaw,
215
+ inline: inlineConfig,
216
+ model: agent.inline?.model,
217
+ options: agent.options ?? {},
218
+ optionsArray: Array.isArray(agent.options) ? agent.options : undefined,
219
+ optionsByMode: !Array.isArray(agent.options) && typeof agent.options === 'object'
220
+ ? agent.options
221
+ : undefined,
222
+ remote: agent.remote ?? null,
223
+ documents: agent.inline && 'documents' in agent.inline ? agent.inline.documents : undefined,
224
+ },
225
+ documents: documentsForTemplate,
226
+ vars: templateContext.vars || {},
227
+ props: layoutProps ?? {},
228
+ messages: templateContext.messages || [],
229
+ platform: templateContext.platform ?? 'cli',
230
+ tools: templateContext.tools,
231
+ session: sessionInfo,
232
+ env: templateContext.env ?? {},
233
+ context: {
234
+ mode: templateContext.mode ?? 'query',
235
+ platform: templateContext.platform ?? 'cli',
236
+ options: templateOptions,
237
+ env: templateContext.env ?? {},
238
+ vars: templateContext.vars ?? {},
239
+ agent: templateContext.agent ?? null,
240
+ },
241
+ };
242
+ renderContext.layout = {
243
+ system_prompt: baseSystemPrompt,
244
+ prompt: baseSystemPrompt,
245
+ };
246
+ const rendered = this.layoutRenderer.render(layout, renderContext);
247
+ this.logger.debug(`Layout rendered successfully for agent ${agent.id}`);
248
+ const { processDocumentTemplate } = await Promise.resolve().then(() => __importStar(require('./utils/template-processor')));
249
+ const finalSystemPrompt = await processDocumentTemplate(rendered, this.documentLoaderService, templateContext);
250
+ return finalSystemPrompt;
251
+ }
252
+ catch (error) {
253
+ const layoutIdForLog = typeof layoutSpec === 'string' ? layoutSpec : layoutSpec.id;
254
+ console.error(`❌ [Layout Error] Failed to process layout (${layoutIdForLog}) for agent ${agent.id}:`, (0, crewx_sdk_1.getErrorMessage)(error));
255
+ this.logger.warn(`Failed to process layout (${layoutIdForLog}) for agent ${agent.id}: ${(0, crewx_sdk_1.getErrorMessage)(error)}`);
256
+ if (inlineLayout) {
257
+ console.log('[Layout Fallback] Using inline.system_prompt');
258
+ this.logger.warn('Falling back to inline.system_prompt');
259
+ }
260
+ else {
261
+ console.log('[Layout Fallback] Using default system prompt');
262
+ this.logger.warn('Falling back to default system prompt');
263
+ }
264
+ }
265
+ }
266
+ let systemPrompt = baseSystemPrompt;
267
+ if (systemPrompt) {
268
+ const { processDocumentTemplate } = await Promise.resolve().then(() => __importStar(require('./utils/template-processor')));
269
+ systemPrompt = await processDocumentTemplate(systemPrompt, this.documentLoaderService, templateContext);
270
+ }
271
+ return systemPrompt;
272
+ }
144
273
  async getTaskLogs(input) {
145
274
  this.logger.log('=== getTaskLogs called ===');
146
275
  this.logger.log(`Input taskId: ${input.taskId}`);
@@ -165,11 +294,29 @@ let CrewXTool = CrewXTool_1 = class CrewXTool {
165
294
  const availableProviders = await this.aiService.checkAvailableProviders();
166
295
  const installation = await this.aiService.validateCLIInstallation();
167
296
  const recommendations = this.getInstallationRecommendations(installation);
297
+ const bridgeProviders = this.providerBridgeService.listAvailableProviders();
298
+ let bridgeStatus = '⚠️ ProviderBridge: no providers registered.';
299
+ if (bridgeProviders.length > 0) {
300
+ try {
301
+ const { resolution } = await this.providerBridgeService.createAgentRuntime({
302
+ provider: bridgeProviders[0],
303
+ defaultAgentId: 'provider-bridge-check',
304
+ });
305
+ bridgeStatus = `✅ ProviderBridge ready (${resolution.provider.name})`;
306
+ }
307
+ catch (error) {
308
+ const message = error instanceof Error ? error.message : String(error);
309
+ bridgeStatus = `❌ ProviderBridge error: ${message}`;
310
+ }
311
+ }
168
312
  const responseText = `🤖 **AI Providers Status**
169
313
 
170
314
  **Available Providers:**
171
315
  ${availableProviders.length > 0 ? availableProviders.map(p => `✅ ${p}`).join('\n') : '❌ No providers available'}
172
316
 
317
+ **Provider Bridge:**
318
+ ${bridgeStatus}${bridgeProviders.length > 0 ? `\nRegistered: ${bridgeProviders.join(', ')}` : ''}
319
+
173
320
  **Installation Status:**
174
321
  • Claude CLI: ${installation.claude ? '✅ Installed' : '❌ Not Installed'}
175
322
  • Gemini CLI: ${installation.gemini ? '✅ Installed' : '❌ Not Installed'}
@@ -191,6 +338,10 @@ ${recommendations.map(r => `• ${r}`).join('\n')}`;
191
338
  gemini: installation.gemini,
192
339
  copilot: installation.copilot,
193
340
  },
341
+ providerBridge: {
342
+ status: bridgeStatus,
343
+ providers: bridgeProviders,
344
+ },
194
345
  recommendations,
195
346
  };
196
347
  }
@@ -215,7 +366,11 @@ No AI providers could be verified.`
215
366
  claude: { installed: false },
216
367
  gemini: { installed: false },
217
368
  copilot: { installed: false }
218
- }
369
+ },
370
+ providerBridge: {
371
+ status: '❌ ProviderBridge inspection skipped due to error',
372
+ providers: [],
373
+ },
219
374
  };
220
375
  }
221
376
  }
@@ -416,63 +571,146 @@ ${errorMessage}`,
416
571
  }
417
572
  }
418
573
  const workingDir = agent.workingDirectory || process.cwd();
419
- let systemPrompt = agent.systemPrompt || agent.description || `You are an expert ${agentId}.`;
420
574
  const securityKey = this.generateSecurityKey();
421
- if (systemPrompt) {
422
- const { processDocumentTemplate } = await Promise.resolve().then(() => __importStar(require('./utils/template-processor')));
423
- const contextMessages = messages && messages.length > 0 ? messages.slice(0, -1) : [];
424
- const templateContext = {
425
- env: process.env,
426
- agent: {
427
- id: agent.id,
428
- name: agent.name || agent.id,
429
- provider: (Array.isArray(agent.provider) ? agent.provider[0] : agent.provider) || 'claude',
430
- model: model || agent.inline?.model,
431
- workingDirectory: workingDir,
432
- },
433
- mode: 'query',
434
- messages: contextMessages,
435
- platform: platform,
436
- tools: this.buildToolsContext(),
437
- vars: {
438
- security_key: securityKey,
439
- },
440
- };
441
- systemPrompt = await processDocumentTemplate(systemPrompt, this.documentLoaderService, templateContext);
575
+ const contextMessages = messages && messages.length > 0 ? messages.slice(0, -1) : [];
576
+ const documents = {};
577
+ const docNames = this.documentLoaderService.getDocumentNames();
578
+ for (const docName of docNames) {
579
+ const content = await this.documentLoaderService.getDocumentContent(docName);
580
+ const toc = await this.documentLoaderService.getDocumentToc(docName);
581
+ if (content) {
582
+ documents[docName] = { content, toc };
583
+ }
442
584
  }
443
- systemPrompt += `
585
+ const templateContext = {
586
+ user_input: query,
587
+ messages: contextMessages,
588
+ agent: {
589
+ id: agent.id,
590
+ name: agent.name || agent.id,
591
+ provider: (Array.isArray(agent.provider) ? agent.provider[0] : agent.provider) || 'claude',
592
+ model: model || agent.inline?.model,
593
+ workingDirectory: workingDir,
594
+ inline: {
595
+ prompt: agent.inline?.prompt || agent.inline?.system_prompt || agent.systemPrompt || '',
596
+ },
597
+ specialties: agent.specialties,
598
+ capabilities: agent.capabilities,
599
+ description: agent.description,
600
+ },
601
+ documents,
602
+ vars: {
603
+ security_key: securityKey,
604
+ },
605
+ props: {},
606
+ mode: 'query',
607
+ platform: platform,
608
+ env: process.env,
609
+ tools: this.buildToolsContext(),
610
+ };
611
+ let systemPrompt = await this.processAgentSystemPrompt(agent, templateContext);
612
+ if (process.env.CREWX_APPEND_LEGACY === 'true') {
613
+ this.logger.debug('[WBS-14] Legacy append mode enabled (query)', {
614
+ agentId: agent.id,
615
+ layoutId: typeof agent.inline?.layout === 'string'
616
+ ? agent.inline?.layout
617
+ : agent.inline?.layout?.id ?? 'crewx/default',
618
+ });
619
+ systemPrompt += `
444
620
 
445
621
  Specialties: ${agent.specialties?.join(', ') || 'General'}
446
622
  Capabilities: ${agent.capabilities?.join(', ') || 'Analysis'}
447
623
  Working Directory: ${workingDir}`;
448
- const wrappedQuery = `
449
- <user_query key="${securityKey}">
450
- ${query}
451
- </user_query>`;
624
+ }
625
+ else if (process.env.CREWX_WBS14_TELEMETRY === 'true') {
626
+ this.logger.debug('[WBS-14] Metadata delegated to layout (query mode)', {
627
+ agentId: agent.id,
628
+ hasLayout: Boolean(agent.inline?.layout),
629
+ layoutId: typeof agent.inline?.layout === 'string'
630
+ ? agent.inline?.layout
631
+ : agent.inline?.layout?.id ?? 'crewx/default',
632
+ specialtiesCount: agent.specialties?.length ?? 0,
633
+ capabilitiesCount: agent.capabilities?.length ?? 0,
634
+ workingDirectory: workingDir,
635
+ });
636
+ }
452
637
  let fullPrompt = systemPrompt;
453
638
  if (context) {
454
639
  fullPrompt += `\n\n${context}`;
455
640
  }
456
- fullPrompt += `\n\n${wrappedQuery}`;
457
- let response;
458
- let provider;
459
- if (Array.isArray(agent.provider)) {
460
- if (agent.inline?.model || model) {
461
- provider = agent.provider[0] || 'claude';
462
- }
463
- else {
464
- provider = await this.getAvailableProvider(agent.provider);
465
- this.taskManagementService.addTaskLog(taskId, { level: 'info', message: `Using fallback provider: ${provider}` });
466
- }
641
+ if (!systemPrompt.includes('<user_query')) {
642
+ this.logger.debug('[Legacy] Adding <user_query> wrapper manually (layout not used)');
643
+ fullPrompt += `\n\n<user_query key="${securityKey}">
644
+ ${query}
645
+ </user_query>`;
646
+ }
647
+ let runtimeResult;
648
+ let providerResolution;
649
+ let providerInput;
650
+ if (args.provider) {
651
+ providerInput = args.provider;
652
+ }
653
+ else if (Array.isArray(agent.provider)) {
654
+ providerInput = await this.getAvailableProvider(agent.provider);
655
+ }
656
+ else if (typeof agent.provider === 'string' && agent.provider.trim().length > 0) {
657
+ providerInput = agent.provider;
658
+ }
659
+ try {
660
+ runtimeResult = await this.providerBridgeService.createAgentRuntime({
661
+ provider: providerInput,
662
+ defaultAgentId: agentId,
663
+ validAgents: agents.map(a => a.id),
664
+ });
665
+ providerResolution = runtimeResult.resolution;
666
+ }
667
+ catch (error) {
668
+ const errorMsg = error instanceof Error ? error.message : 'Unknown provider error';
669
+ this.taskManagementService.addTaskLog(taskId, {
670
+ level: 'error',
671
+ message: `Provider resolution failed: ${errorMsg}`,
672
+ });
673
+ this.taskManagementService.completeTask(taskId, { success: false, error: errorMsg }, false);
674
+ return {
675
+ content: [
676
+ {
677
+ type: 'text',
678
+ text: `❌ **Provider Error**\n\n${errorMsg}\n\nAvailable providers: ${this.providerBridgeService.listAvailableProviders().join(', ')}`,
679
+ },
680
+ ],
681
+ success: false,
682
+ agent: agentId,
683
+ provider: 'none',
684
+ error: errorMsg,
685
+ taskId,
686
+ readOnlyMode: true,
687
+ readOnly: true,
688
+ };
689
+ }
690
+ const resolvedProviderName = providerResolution.provider.name;
691
+ if (args.provider) {
692
+ this.taskManagementService.addTaskLog(taskId, {
693
+ level: 'info',
694
+ message: `Using CLI-specified provider: ${args.provider} (resolved to ${resolvedProviderName})`
695
+ });
696
+ }
697
+ else if (providerInput) {
698
+ this.taskManagementService.addTaskLog(taskId, {
699
+ level: 'info',
700
+ message: `Agent provider resolved to ${resolvedProviderName} (input: ${providerInput})`
701
+ });
467
702
  }
468
703
  else {
469
- provider = agent.provider || 'claude';
704
+ this.taskManagementService.addTaskLog(taskId, {
705
+ level: 'info',
706
+ message: `Using ProviderBridge fallback provider: ${resolvedProviderName}`,
707
+ });
470
708
  }
471
- const agentOptions = this.getOptionsForAgent(agent, 'query', provider);
472
- const modelToUse = model || agent.inline?.model;
709
+ const agentOptions = this.getOptionsForAgent(agent, 'query', resolvedProviderName);
710
+ const modelToUse = model || agent.inline?.model || providerResolution.defaultModel;
473
711
  const structuredPayload = await this.buildStructuredPayload({
474
712
  agentId,
475
- provider,
713
+ provider: resolvedProviderName,
476
714
  mode: 'query',
477
715
  prompt: fullPrompt,
478
716
  context,
@@ -480,17 +718,55 @@ ${query}
480
718
  platform: platform || 'cli',
481
719
  model: modelToUse,
482
720
  });
483
- response = await this.aiService.queryAI(fullPrompt, provider, {
484
- workingDirectory: workingDir,
485
- timeout: this.timeoutConfig.parallel,
486
- additionalArgs: agentOptions,
487
- taskId,
488
- model: modelToUse,
489
- agentId,
490
- securityKey,
491
- messages,
492
- pipedContext: structuredPayload,
493
- });
721
+ const runtimeMessages = this.toConversationMessages(messages);
722
+ let agentResult;
723
+ try {
724
+ agentResult = await runtimeResult.runtime.agent.query({
725
+ agentId,
726
+ prompt: fullPrompt,
727
+ context,
728
+ messages: runtimeMessages,
729
+ model: modelToUse,
730
+ options: {
731
+ workingDirectory: workingDir,
732
+ timeout: this.timeoutConfig.parallel,
733
+ additionalArgs: agentOptions,
734
+ taskId,
735
+ securityKey,
736
+ pipedContext: structuredPayload,
737
+ },
738
+ });
739
+ }
740
+ catch (error) {
741
+ const errorMsg = error instanceof Error ? error.message : 'Agent runtime query failed';
742
+ this.taskManagementService.addTaskLog(taskId, {
743
+ level: 'error',
744
+ message: `Agent runtime query failed: ${errorMsg}`,
745
+ });
746
+ this.taskManagementService.completeTask(taskId, { success: false, error: errorMsg }, false);
747
+ return {
748
+ content: [
749
+ {
750
+ type: 'text',
751
+ text: `❌ **Provider Error**\n\n${errorMsg}\n\nAvailable providers: ${this.providerBridgeService.listAvailableProviders().join(', ')}`,
752
+ },
753
+ ],
754
+ success: false,
755
+ agent: agentId,
756
+ provider: resolvedProviderName,
757
+ error: errorMsg,
758
+ taskId,
759
+ readOnlyMode: true,
760
+ readOnly: true,
761
+ };
762
+ }
763
+ const response = {
764
+ success: agentResult.success,
765
+ content: agentResult.content,
766
+ provider: agentResult.metadata?.provider ?? resolvedProviderName,
767
+ taskId: agentResult.metadata?.taskId ?? taskId,
768
+ error: agentResult.metadata?.error,
769
+ };
494
770
  this.taskManagementService.addTaskLog(taskId, { level: 'info', message: `Query completed. Success: ${response.success}` });
495
771
  this.taskManagementService.completeTask(taskId, response, response.success);
496
772
  const responseText = response.success
@@ -624,34 +900,68 @@ Please check the agent ID and try again.`
624
900
  }
625
901
  }
626
902
  const workingDir = projectPath || agent.workingDirectory || './';
627
- let systemPrompt = agent.systemPrompt || agent.description || `You are an expert ${agentId}.`;
628
903
  const securityKey = this.generateSecurityKey();
629
- if (systemPrompt) {
630
- const { processDocumentTemplate } = await Promise.resolve().then(() => __importStar(require('./utils/template-processor')));
631
- const contextMessages = messages && messages.length > 0 ? messages.slice(0, -1) : [];
632
- const templateContext = {
633
- env: process.env,
634
- agent: {
635
- id: agent.id,
636
- name: agent.name || agent.id,
637
- provider: (Array.isArray(agent.provider) ? agent.provider[0] : agent.provider) || 'claude',
638
- model: model || agent.inline?.model,
639
- workingDirectory: workingDir,
640
- },
641
- mode: 'execute',
642
- messages: contextMessages,
643
- platform: platform,
644
- tools: this.buildToolsContext(),
645
- vars: {
646
- security_key: securityKey,
647
- },
648
- };
649
- systemPrompt = await processDocumentTemplate(systemPrompt, this.documentLoaderService, templateContext);
904
+ const contextMessages = messages && messages.length > 0 ? messages.slice(0, -1) : [];
905
+ const documentsForExecute = {};
906
+ const docNamesForExecute = this.documentLoaderService.getDocumentNames();
907
+ for (const docName of docNamesForExecute) {
908
+ const content = await this.documentLoaderService.getDocumentContent(docName);
909
+ const toc = await this.documentLoaderService.getDocumentToc(docName);
910
+ if (content) {
911
+ documentsForExecute[docName] = { content, toc };
912
+ }
650
913
  }
651
- systemPrompt += `
914
+ const templateContext = {
915
+ user_input: task,
916
+ messages: contextMessages,
917
+ agent: {
918
+ id: agent.id,
919
+ name: agent.name || agent.id,
920
+ provider: (Array.isArray(agent.provider) ? agent.provider[0] : agent.provider) || 'claude',
921
+ model: model || agent.inline?.model,
922
+ workingDirectory: workingDir,
923
+ inline: {
924
+ prompt: agent.inline?.prompt || agent.inline?.system_prompt || agent.systemPrompt || '',
925
+ },
926
+ specialties: agent.specialties,
927
+ capabilities: agent.capabilities,
928
+ description: agent.description,
929
+ },
930
+ documents: documentsForExecute,
931
+ vars: {
932
+ security_key: securityKey,
933
+ },
934
+ props: {},
935
+ mode: 'execute',
936
+ platform: platform,
937
+ env: process.env,
938
+ tools: this.buildToolsContext(),
939
+ };
940
+ let systemPrompt = await this.processAgentSystemPrompt(agent, templateContext);
941
+ if (process.env.CREWX_APPEND_LEGACY === 'true') {
942
+ this.logger.debug('[WBS-14] Legacy append mode enabled (execute)', {
943
+ agentId: agent.id,
944
+ layoutId: typeof agent.inline?.layout === 'string'
945
+ ? agent.inline?.layout
946
+ : agent.inline?.layout?.id ?? 'crewx/default',
947
+ });
948
+ systemPrompt += `
652
949
  Specialties: ${agent.specialties?.join(', ') || 'General'}
653
950
  Capabilities: ${agent.capabilities?.join(', ') || 'Implementation'}
654
951
  Working Directory: ${workingDir}`;
952
+ }
953
+ else if (process.env.CREWX_WBS14_TELEMETRY === 'true') {
954
+ this.logger.debug('[WBS-14] Metadata delegated to layout (execute mode)', {
955
+ agentId: agent.id,
956
+ hasLayout: Boolean(agent.inline?.layout),
957
+ layoutId: typeof agent.inline?.layout === 'string'
958
+ ? agent.inline?.layout
959
+ : agent.inline?.layout?.id ?? 'crewx/default',
960
+ specialtiesCount: agent.specialties?.length ?? 0,
961
+ capabilitiesCount: agent.capabilities?.length ?? 0,
962
+ workingDirectory: workingDir,
963
+ });
964
+ }
655
965
  const fullPrompt = context
656
966
  ? `${systemPrompt}
657
967
  ${context}
@@ -662,26 +972,74 @@ Task: ${task}
662
972
 
663
973
  Task: ${task}
664
974
  `;
665
- let response;
666
- let provider;
667
- if (Array.isArray(agent.provider)) {
668
- if (agent.inline?.model || model) {
669
- provider = agent.provider[0] || 'claude';
670
- }
671
- else {
672
- provider = await this.getAvailableProvider(agent.provider);
673
- this.taskManagementService.addTaskLog(taskId, { level: 'info', message: `Using fallback provider: ${provider}` });
674
- }
975
+ let runtimeResult;
976
+ let providerResolution;
977
+ let providerInput;
978
+ if (args.provider) {
979
+ providerInput = args.provider;
980
+ }
981
+ else if (Array.isArray(agent.provider)) {
982
+ providerInput = await this.getAvailableProvider(agent.provider);
983
+ }
984
+ else if (typeof agent.provider === 'string' && agent.provider.trim().length > 0) {
985
+ providerInput = agent.provider;
986
+ }
987
+ try {
988
+ runtimeResult = await this.providerBridgeService.createAgentRuntime({
989
+ provider: providerInput,
990
+ defaultAgentId: agentId,
991
+ validAgents: agents.map(a => a.id),
992
+ enableCallStack: true,
993
+ });
994
+ providerResolution = runtimeResult.resolution;
995
+ }
996
+ catch (error) {
997
+ const errorMsg = error instanceof Error ? error.message : 'Unknown provider error';
998
+ this.taskManagementService.addTaskLog(taskId, {
999
+ level: 'error',
1000
+ message: `Provider resolution failed: ${errorMsg}`,
1001
+ });
1002
+ this.taskManagementService.completeTask(taskId, { success: false, error: errorMsg }, false);
1003
+ return {
1004
+ content: [
1005
+ {
1006
+ type: 'text',
1007
+ text: `❌ **Provider Error**\n\n${errorMsg}\n\nAvailable providers: ${this.providerBridgeService.listAvailableProviders().join(', ')}`,
1008
+ },
1009
+ ],
1010
+ success: false,
1011
+ agent: agentId,
1012
+ provider: 'none',
1013
+ error: errorMsg,
1014
+ taskId,
1015
+ readOnlyMode: false,
1016
+ readOnly: false,
1017
+ };
1018
+ }
1019
+ const resolvedProviderName = providerResolution.provider.name;
1020
+ if (args.provider) {
1021
+ this.taskManagementService.addTaskLog(taskId, {
1022
+ level: 'info',
1023
+ message: `Using CLI-specified provider: ${args.provider} (resolved to ${resolvedProviderName})`
1024
+ });
1025
+ }
1026
+ else if (providerInput) {
1027
+ this.taskManagementService.addTaskLog(taskId, {
1028
+ level: 'info',
1029
+ message: `Agent provider resolved to ${resolvedProviderName} (input: ${providerInput})`
1030
+ });
675
1031
  }
676
1032
  else {
677
- provider = agent.provider || 'claude';
1033
+ this.taskManagementService.addTaskLog(taskId, {
1034
+ level: 'info',
1035
+ message: `Using ProviderBridge fallback provider: ${resolvedProviderName}`,
1036
+ });
678
1037
  }
679
- this.taskManagementService.addTaskLog(taskId, { level: 'info', message: `Using provider: ${provider}` });
680
- const agentOptions = this.getOptionsForAgent(agent, 'execute', provider);
681
- const modelToUse = model || agent.inline?.model;
1038
+ const agentOptions = this.getOptionsForAgent(agent, 'execute', resolvedProviderName);
1039
+ const modelToUse = model || agent.inline?.model || providerResolution.defaultModel;
682
1040
  const structuredPayload = await this.buildStructuredPayload({
683
1041
  agentId,
684
- provider,
1042
+ provider: resolvedProviderName,
685
1043
  mode: 'execute',
686
1044
  prompt: fullPrompt,
687
1045
  context,
@@ -689,16 +1047,55 @@ Task: ${task}
689
1047
  platform: platform || 'cli',
690
1048
  model: modelToUse,
691
1049
  });
692
- response = await this.aiService.executeAI(fullPrompt, provider, {
693
- workingDirectory: workingDir,
694
- timeout: 1200000,
695
- taskId: taskId,
696
- additionalArgs: agentOptions,
697
- model: modelToUse,
698
- agentId,
699
- messages,
700
- pipedContext: structuredPayload,
701
- });
1050
+ const runtimeMessages = this.toConversationMessages(messages);
1051
+ let agentResult;
1052
+ try {
1053
+ agentResult = await runtimeResult.runtime.agent.execute({
1054
+ agentId,
1055
+ prompt: fullPrompt,
1056
+ context,
1057
+ messages: runtimeMessages,
1058
+ model: modelToUse,
1059
+ options: {
1060
+ workingDirectory: workingDir,
1061
+ timeout: 1200000,
1062
+ additionalArgs: agentOptions,
1063
+ taskId,
1064
+ pipedContext: structuredPayload,
1065
+ securityKey,
1066
+ },
1067
+ });
1068
+ }
1069
+ catch (error) {
1070
+ const errorMsg = error instanceof Error ? error.message : 'Agent runtime execution failed';
1071
+ this.taskManagementService.addTaskLog(taskId, {
1072
+ level: 'error',
1073
+ message: `Agent runtime execution failed: ${errorMsg}`,
1074
+ });
1075
+ this.taskManagementService.completeTask(taskId, { success: false, error: errorMsg }, false);
1076
+ return {
1077
+ content: [
1078
+ {
1079
+ type: 'text',
1080
+ text: `❌ **Provider Error**\n\n${errorMsg}\n\nAvailable providers: ${this.providerBridgeService.listAvailableProviders().join(', ')}`,
1081
+ },
1082
+ ],
1083
+ success: false,
1084
+ agent: agentId,
1085
+ provider: resolvedProviderName,
1086
+ error: errorMsg,
1087
+ taskId,
1088
+ readOnlyMode: false,
1089
+ readOnly: false,
1090
+ };
1091
+ }
1092
+ const response = {
1093
+ success: agentResult.success,
1094
+ content: agentResult.content,
1095
+ provider: agentResult.metadata?.provider ?? resolvedProviderName,
1096
+ taskId: agentResult.metadata?.taskId ?? taskId,
1097
+ error: agentResult.metadata?.error,
1098
+ };
702
1099
  this.taskManagementService.addTaskLog(taskId, { level: 'info', message: `Execution completed. Success: ${response.success}` });
703
1100
  this.taskManagementService.completeTask(taskId, response, response.success);
704
1101
  const responseText = response.success ? response.content : `❌ Execution Failed: ${response.error}`;
@@ -770,6 +1167,41 @@ Task: ${task}
770
1167
  readOnly,
771
1168
  };
772
1169
  }
1170
+ toConversationMessages(messages) {
1171
+ if (!messages || messages.length === 0) {
1172
+ return [];
1173
+ }
1174
+ return messages.map((message, index) => {
1175
+ const metadata = message.metadata ?? {};
1176
+ const rawTimestamp = metadata.timestamp;
1177
+ let timestamp;
1178
+ if (rawTimestamp instanceof Date) {
1179
+ timestamp = rawTimestamp;
1180
+ }
1181
+ else if (typeof rawTimestamp === 'number') {
1182
+ timestamp = new Date(rawTimestamp);
1183
+ }
1184
+ else if (typeof rawTimestamp === 'string') {
1185
+ const parsed = new Date(rawTimestamp);
1186
+ timestamp = Number.isNaN(parsed.getTime()) ? new Date() : parsed;
1187
+ }
1188
+ else {
1189
+ timestamp = new Date();
1190
+ }
1191
+ return {
1192
+ id: typeof metadata.id === 'string' ? metadata.id : `cli-msg-${index}`,
1193
+ userId: typeof metadata.userId === 'string'
1194
+ ? metadata.userId
1195
+ : message.isAssistant
1196
+ ? 'assistant'
1197
+ : 'user',
1198
+ text: message.text,
1199
+ timestamp,
1200
+ isAssistant: message.isAssistant,
1201
+ metadata: metadata,
1202
+ };
1203
+ });
1204
+ }
773
1205
  getOptionsForAgent(agent, mode, provider) {
774
1206
  try {
775
1207
  if (agent.options && typeof agent.options === 'object' && !Array.isArray(agent.options)) {
@@ -1446,6 +1878,8 @@ __decorate([
1446
1878
  ], CrewXTool.prototype, "clearAllLogs", null);
1447
1879
  exports.CrewXTool = CrewXTool = CrewXTool_1 = __decorate([
1448
1880
  (0, common_1.Injectable)(),
1881
+ __param(12, (0, common_1.Inject)('LAYOUT_LOADER')),
1882
+ __param(13, (0, common_1.Inject)('LAYOUT_RENDERER')),
1449
1883
  __metadata("design:paramtypes", [ai_service_1.AIService,
1450
1884
  ai_provider_service_1.AIProviderService,
1451
1885
  project_service_1.ProjectService,
@@ -1456,6 +1890,9 @@ exports.CrewXTool = CrewXTool = CrewXTool_1 = __decorate([
1456
1890
  document_loader_service_1.DocumentLoaderService,
1457
1891
  tool_call_service_1.ToolCallService,
1458
1892
  agent_loader_service_1.AgentLoaderService,
1459
- remote_agent_service_1.RemoteAgentService])
1893
+ remote_agent_service_1.RemoteAgentService,
1894
+ provider_bridge_service_1.ProviderBridgeService,
1895
+ crewx_sdk_1.LayoutLoader,
1896
+ crewx_sdk_1.LayoutRenderer])
1460
1897
  ], CrewXTool);
1461
1898
  //# sourceMappingURL=crewx.tool.js.map