@bpinhosilva/agent-orchestrator 1.0.0-alpha.11 → 1.0.0-alpha.13

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 (120) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/agents/agents.module.js +5 -2
  3. package/dist/agents/agents.service.js +52 -26
  4. package/dist/agents/dto/create-agent.dto.js +3 -3
  5. package/dist/agents/entities/agent.entity.js +8 -10
  6. package/dist/agents/implementations/claude.agent.js +136 -0
  7. package/dist/agents/implementations/gemini.agent.js +14 -2
  8. package/dist/app.module.js +6 -0
  9. package/dist/common/common.module.js +21 -0
  10. package/dist/common/storage.service.js +102 -0
  11. package/dist/projects/dto/create-project.dto.js +2 -2
  12. package/dist/projects/dto/update-project.dto.js +15 -0
  13. package/dist/projects/entities/project.entity.js +3 -7
  14. package/dist/projects/projects.module.js +1 -0
  15. package/dist/projects/projects.service.js +8 -5
  16. package/dist/providers/entities/provider.entity.js +1 -1
  17. package/dist/providers/providers.service.js +44 -0
  18. package/dist/src/agents/agents.module.d.ts +2 -0
  19. package/dist/src/agents/agents.module.js +3 -2
  20. package/dist/src/agents/agents.module.js.map +1 -1
  21. package/dist/src/agents/agents.service.js +49 -25
  22. package/dist/src/agents/agents.service.js.map +1 -1
  23. package/dist/src/agents/dto/create-agent.dto.d.ts +1 -1
  24. package/dist/src/agents/dto/create-agent.dto.js +5 -5
  25. package/dist/src/agents/dto/create-agent.dto.js.map +1 -1
  26. package/dist/src/agents/entities/agent.entity.d.ts +2 -3
  27. package/dist/src/agents/entities/agent.entity.js +8 -11
  28. package/dist/src/agents/entities/agent.entity.js.map +1 -1
  29. package/dist/src/agents/enums/provider.enum.d.ts +1 -3
  30. package/dist/src/agents/enums/provider.enum.js +1 -3
  31. package/dist/src/agents/enums/provider.enum.js.map +1 -1
  32. package/dist/src/agents/implementations/claude.agent.d.ts +24 -0
  33. package/dist/src/agents/implementations/claude.agent.js +141 -0
  34. package/dist/src/agents/implementations/claude.agent.js.map +1 -0
  35. package/dist/src/agents/implementations/gemini.agent.d.ts +3 -0
  36. package/dist/src/agents/implementations/gemini.agent.js +14 -2
  37. package/dist/src/agents/implementations/gemini.agent.js.map +1 -1
  38. package/dist/src/agents/interfaces/agent.interface.d.ts +1 -0
  39. package/dist/src/app.module.js +6 -0
  40. package/dist/src/app.module.js.map +1 -1
  41. package/dist/src/common/common.module.d.ts +2 -0
  42. package/dist/src/common/common.module.js +22 -0
  43. package/dist/src/common/common.module.js.map +1 -0
  44. package/dist/src/common/entities/artifact.entity.d.ts +7 -0
  45. package/dist/src/common/entities/artifact.entity.js +49 -0
  46. package/dist/src/common/entities/artifact.entity.js.map +1 -0
  47. package/dist/src/common/storage.service.d.ts +21 -0
  48. package/dist/src/common/storage.service.js +104 -0
  49. package/dist/src/common/storage.service.js.map +1 -0
  50. package/dist/src/projects/dto/create-project.dto.d.ts +1 -1
  51. package/dist/src/projects/dto/create-project.dto.js +5 -5
  52. package/dist/src/projects/dto/create-project.dto.js.map +1 -1
  53. package/dist/src/projects/dto/update-project.dto.d.ts +1 -0
  54. package/dist/src/projects/dto/update-project.dto.js +17 -1
  55. package/dist/src/projects/dto/update-project.dto.js.map +1 -1
  56. package/dist/src/projects/entities/project.entity.d.ts +1 -2
  57. package/dist/src/projects/entities/project.entity.js +6 -11
  58. package/dist/src/projects/entities/project.entity.js.map +1 -1
  59. package/dist/src/projects/projects.module.js +1 -0
  60. package/dist/src/projects/projects.module.js.map +1 -1
  61. package/dist/src/projects/projects.service.js +8 -5
  62. package/dist/src/projects/projects.service.js.map +1 -1
  63. package/dist/src/providers/entities/provider.entity.js +1 -1
  64. package/dist/src/providers/entities/provider.entity.js.map +1 -1
  65. package/dist/src/providers/providers.service.d.ts +4 -1
  66. package/dist/src/providers/providers.service.js +43 -0
  67. package/dist/src/providers/providers.service.js.map +1 -1
  68. package/dist/src/tasks/comments.controller.d.ts +12 -0
  69. package/dist/src/tasks/comments.controller.js +92 -0
  70. package/dist/src/tasks/comments.controller.js.map +1 -0
  71. package/dist/src/tasks/comments.service.d.ts +21 -0
  72. package/dist/src/tasks/comments.service.js +180 -0
  73. package/dist/src/tasks/comments.service.js.map +1 -0
  74. package/dist/src/tasks/dto/create-comment.dto.d.ts +13 -0
  75. package/dist/src/tasks/dto/create-comment.dto.js +51 -0
  76. package/dist/src/tasks/dto/create-comment.dto.js.map +1 -0
  77. package/dist/src/tasks/dto/create-task.dto.d.ts +1 -2
  78. package/dist/src/tasks/dto/create-task.dto.js +6 -9
  79. package/dist/src/tasks/dto/create-task.dto.js.map +1 -1
  80. package/dist/src/tasks/dto/update-comment.dto.d.ts +9 -0
  81. package/dist/src/tasks/dto/update-comment.dto.js +32 -0
  82. package/dist/src/tasks/dto/update-comment.dto.js.map +1 -0
  83. package/dist/src/tasks/entities/comment.entity.d.ts +23 -0
  84. package/dist/src/tasks/entities/comment.entity.js +91 -0
  85. package/dist/src/tasks/entities/comment.entity.js.map +1 -0
  86. package/dist/src/tasks/entities/task.entity.d.ts +4 -1
  87. package/dist/src/tasks/entities/task.entity.js +16 -5
  88. package/dist/src/tasks/entities/task.entity.js.map +1 -1
  89. package/dist/src/tasks/task-scheduler.service.d.ts +21 -0
  90. package/dist/src/tasks/task-scheduler.service.js +231 -0
  91. package/dist/src/tasks/task-scheduler.service.js.map +1 -0
  92. package/dist/src/tasks/tasks.controller.d.ts +5 -5
  93. package/dist/src/tasks/tasks.controller.js +26 -21
  94. package/dist/src/tasks/tasks.controller.js.map +1 -1
  95. package/dist/src/tasks/tasks.module.js +15 -3
  96. package/dist/src/tasks/tasks.module.js.map +1 -1
  97. package/dist/src/tasks/tasks.service.d.ts +4 -4
  98. package/dist/src/tasks/tasks.service.js +18 -12
  99. package/dist/src/tasks/tasks.service.js.map +1 -1
  100. package/dist/src/uploads/uploads.controller.d.ts +8 -0
  101. package/dist/src/uploads/uploads.controller.js +95 -0
  102. package/dist/src/uploads/uploads.controller.js.map +1 -0
  103. package/dist/src/uploads/uploads.module.d.ts +2 -0
  104. package/dist/src/uploads/uploads.module.js +20 -0
  105. package/dist/src/uploads/uploads.module.js.map +1 -0
  106. package/dist/tasks/comments.controller.js +84 -0
  107. package/dist/tasks/comments.service.js +175 -0
  108. package/dist/tasks/dto/create-comment.dto.js +41 -0
  109. package/dist/tasks/dto/create-task.dto.js +4 -6
  110. package/dist/tasks/dto/update-comment.dto.js +25 -0
  111. package/dist/tasks/entities/comment.entity.js +77 -0
  112. package/dist/tasks/entities/task.entity.js +12 -3
  113. package/dist/tasks/task-scheduler.service.js +248 -0
  114. package/dist/tasks/tasks.controller.js +26 -21
  115. package/dist/tasks/tasks.module.js +15 -3
  116. package/dist/tasks/tasks.service.js +18 -12
  117. package/dist/tsconfig.build.tsbuildinfo +1 -1
  118. package/dist/uploads/uploads.controller.js +92 -0
  119. package/dist/uploads/uploads.module.js +19 -0
  120. package/package.json +7 -4
package/CHANGELOG.md CHANGED
@@ -1,3 +1,20 @@
1
+ # [1.0.0-alpha.13](https://github.com/bpinhosilva/agent-orchestrator/compare/v1.0.0-alpha.12...v1.0.0-alpha.13) (2026-03-26)
2
+
3
+
4
+ ### Features
5
+
6
+ * add Claude agent implementation with Anthropic SDK and refactor agent-provider ([1400a0d](https://github.com/bpinhosilva/agent-orchestrator/commit/1400a0dec6beb8393ddc4c5a23b9b860532079e8))
7
+
8
+ # [1.0.0-alpha.12](https://github.com/bpinhosilva/agent-orchestrator/compare/v1.0.0-alpha.11...v1.0.0-alpha.12) (2026-03-24)
9
+
10
+
11
+ ### Features
12
+
13
+ * add .npmrc to enable legacy peer dependencies ([2f41a07](https://github.com/bpinhosilva/agent-orchestrator/commit/2f41a0747e3cc862241f90c24405c6ad0976557b))
14
+ * implement comprehensive project management, task comments with attachments ([10eb382](https://github.com/bpinhosilva/agent-orchestrator/commit/10eb38268d50ff9418a3e7af1788d55c759522a9))
15
+ * implement task detail view with comment polling, numeric priorities, and enhanced task card ([7a38155](https://github.com/bpinhosilva/agent-orchestrator/commit/7a38155ac796dbe528d48a340a0e6be7fa0150a3))
16
+ * introduce a task scheduler service for automated agent task assignment and execution ([d756f10](https://github.com/bpinhosilva/agent-orchestrator/commit/d756f10c441aadb3b31335a55926700b5518ec9e))
17
+
1
18
  # [1.0.0-alpha.11](https://github.com/bpinhosilva/agent-orchestrator/compare/v1.0.0-alpha.10...v1.0.0-alpha.11) (2026-03-24)
2
19
 
3
20
 
@@ -12,7 +12,10 @@ const typeorm_1 = require("@nestjs/typeorm");
12
12
  const agents_controller_1 = require("./agents.controller");
13
13
  const agents_service_1 = require("./agents.service");
14
14
  const agent_entity_1 = require("./entities/agent.entity");
15
- const gemini_agent_1 = require("./implementations/gemini.agent");
15
+ // Side-effect imports: @RegisterAgent decorators fire at class-definition time
16
+ // and self-register each implementation in AGENT_REGISTRY. No DI instantiation needed.
17
+ require("./implementations/gemini.agent");
18
+ require("./implementations/claude.agent");
16
19
  let AgentsModule = class AgentsModule {
17
20
  };
18
21
  exports.AgentsModule = AgentsModule;
@@ -20,7 +23,7 @@ exports.AgentsModule = AgentsModule = __decorate([
20
23
  (0, common_1.Module)({
21
24
  imports: [typeorm_1.TypeOrmModule.forFeature([agent_entity_1.AgentEntity])],
22
25
  controllers: [agents_controller_1.AgentsController],
23
- providers: [agents_service_1.AgentsService, gemini_agent_1.GeminiAgent],
26
+ providers: [agents_service_1.AgentsService],
24
27
  exports: [agents_service_1.AgentsService],
25
28
  })
26
29
  ], AgentsModule);
@@ -19,6 +19,7 @@ const typeorm_1 = require("@nestjs/typeorm");
19
19
  const typeorm_2 = require("typeorm");
20
20
  const agent_entity_1 = require("./entities/agent.entity");
21
21
  const agent_registry_1 = require("./registry/agent.registry");
22
+ const AGENT_RELATIONS = ['model', 'provider'];
22
23
  let AgentsService = AgentsService_1 = class AgentsService {
23
24
  constructor(agentRepository) {
24
25
  this.agentRepository = agentRepository;
@@ -27,7 +28,9 @@ let AgentsService = AgentsService_1 = class AgentsService {
27
28
  }
28
29
  async onModuleInit() {
29
30
  this.logger.log('Initializing Agent instances from database...');
30
- const agents = await this.agentRepository.find({ relations: ['model'] });
31
+ const agents = await this.agentRepository.find({
32
+ relations: AGENT_RELATIONS,
33
+ });
31
34
  for (const agentEntity of agents) {
32
35
  if (agentEntity.status !== 'inactive') {
33
36
  try {
@@ -46,14 +49,14 @@ let AgentsService = AgentsService_1 = class AgentsService {
46
49
  this.agentInstances.delete(agentEntity.id);
47
50
  return;
48
51
  }
49
- const provider = agentEntity.provider;
50
- if (!provider) {
52
+ const providerName = agentEntity.provider?.name?.toLowerCase();
53
+ if (!providerName) {
51
54
  this.logger.warn(`No provider found for agent #${agentEntity.id}. Skipping instance creation.`);
52
55
  return;
53
56
  }
54
- const AgentClass = (0, agent_registry_1.getAgentImplementation)(provider);
57
+ const AgentClass = (0, agent_registry_1.getAgentImplementation)(providerName);
55
58
  if (!AgentClass) {
56
- this.logger.warn(`No implementation found for provider: ${provider}. Skipping instance creation.`);
59
+ this.logger.warn(`No implementation found for provider: ${providerName}. Skipping instance creation.`);
57
60
  return;
58
61
  }
59
62
  try {
@@ -63,7 +66,7 @@ let AgentsService = AgentsService_1 = class AgentsService {
63
66
  description: agentEntity.description,
64
67
  systemInstructions: agentEntity.systemInstructions,
65
68
  role: agentEntity.role,
66
- provider: agentEntity.provider,
69
+ provider: providerName,
67
70
  });
68
71
  this.agentInstances.set(agentEntity.id, instance);
69
72
  this.logger.debug(`Synchronized agent instance #${agentEntity.id}`);
@@ -71,24 +74,41 @@ let AgentsService = AgentsService_1 = class AgentsService {
71
74
  catch (error) {
72
75
  const errorMessage = error instanceof Error ? error.message : String(error);
73
76
  this.logger.error(`Error synchronizing agent #${agentEntity.id}: ${errorMessage}`);
74
- throw error;
77
+ throw new common_1.BadRequestException(`Failed to initialize agent instance: ${errorMessage}`);
75
78
  }
76
79
  }
77
80
  async create(createAgentDto) {
78
- const agent = this.agentRepository.create(createAgentDto);
79
- const savedAgent = await this.agentRepository.save(agent);
80
- // Reload with relations for proper synchronization
81
- const fullyLoadedAgent = await this.findOne(savedAgent.id);
82
- this.syncAgentInstance(fullyLoadedAgent);
83
- return fullyLoadedAgent;
81
+ const { modelId, providerId, ...rest } = createAgentDto;
82
+ const agentData = { ...rest };
83
+ if (modelId) {
84
+ agentData.model = { id: modelId };
85
+ }
86
+ if (providerId) {
87
+ agentData.provider = { id: providerId };
88
+ }
89
+ return await this.agentRepository.manager.transaction(async (manager) => {
90
+ const agent = manager.create(agent_entity_1.AgentEntity, agentData);
91
+ const savedAgent = await manager.save(agent);
92
+ // Reload with full relations for proper synchronization
93
+ const fullyLoadedAgent = await manager.findOne(agent_entity_1.AgentEntity, {
94
+ where: { id: savedAgent.id },
95
+ relations: AGENT_RELATIONS,
96
+ });
97
+ if (!fullyLoadedAgent) {
98
+ throw new Error(`Agent #${savedAgent.id} not found immediately after save`);
99
+ }
100
+ // This will throw BadRequestException if instantiation fails, rolling back the transaction
101
+ this.syncAgentInstance(fullyLoadedAgent);
102
+ return fullyLoadedAgent;
103
+ });
84
104
  }
85
105
  async findAll() {
86
- return this.agentRepository.find({ relations: ['model'] });
106
+ return this.agentRepository.find({ relations: AGENT_RELATIONS });
87
107
  }
88
108
  async findOne(id) {
89
109
  const agent = await this.agentRepository.findOne({
90
110
  where: { id },
91
- relations: ['model'],
111
+ relations: AGENT_RELATIONS,
92
112
  });
93
113
  if (!agent) {
94
114
  throw new common_1.NotFoundException(`Agent #${id} not found`);
@@ -96,21 +116,27 @@ let AgentsService = AgentsService_1 = class AgentsService {
96
116
  return agent;
97
117
  }
98
118
  async update(id, updateAgentDto) {
99
- const { modelId, ...rest } = updateAgentDto;
119
+ const { modelId, providerId, ...rest } = updateAgentDto;
100
120
  const updateData = { ...rest };
101
121
  if (modelId) {
102
122
  updateData.model = { id: modelId };
103
123
  }
104
- await this.agentRepository.update(id, updateData);
105
- const updatedAgent = await this.agentRepository.findOne({
106
- where: { id },
107
- relations: ['model'],
108
- });
109
- if (!updatedAgent) {
110
- throw new common_1.NotFoundException(`Agent #${id} not found`);
124
+ if (providerId) {
125
+ updateData.provider = { id: providerId };
111
126
  }
112
- this.syncAgentInstance(updatedAgent);
113
- return updatedAgent;
127
+ return await this.agentRepository.manager.transaction(async (manager) => {
128
+ await manager.update(agent_entity_1.AgentEntity, id, updateData);
129
+ const updatedAgent = await manager.findOne(agent_entity_1.AgentEntity, {
130
+ where: { id },
131
+ relations: AGENT_RELATIONS,
132
+ });
133
+ if (!updatedAgent) {
134
+ throw new common_1.NotFoundException(`Agent #${id} not found`);
135
+ }
136
+ // This will throw BadRequestException if instantiation fails, rolling back the transaction
137
+ this.syncAgentInstance(updatedAgent);
138
+ return updatedAgent;
139
+ });
114
140
  }
115
141
  async remove(id) {
116
142
  const agent = await this.findOne(id);
@@ -138,7 +164,7 @@ let AgentsService = AgentsService_1 = class AgentsService {
138
164
  this.logger.debug(`Agent instance #${agentId} not found in memory. Checking database...`);
139
165
  const agentEntity = await this.agentRepository.findOne({
140
166
  where: { id: agentId },
141
- relations: ['model'],
167
+ relations: AGENT_RELATIONS,
142
168
  });
143
169
  if (!agentEntity) {
144
170
  throw new common_1.NotFoundException(`Agent #${agentId} not found`);
@@ -45,7 +45,7 @@ __decorate([
45
45
  __metadata("design:type", String)
46
46
  ], CreateAgentDto.prototype, "status", void 0);
47
47
  __decorate([
48
- (0, class_validator_1.IsString)(),
49
- (0, class_validator_1.IsOptional)(),
48
+ (0, class_validator_1.IsUUID)(),
49
+ (0, class_validator_1.IsNotEmpty)(),
50
50
  __metadata("design:type", String)
51
- ], CreateAgentDto.prototype, "provider", void 0);
51
+ ], CreateAgentDto.prototype, "providerId", void 0);
@@ -12,7 +12,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.AgentEntity = void 0;
13
13
  const typeorm_1 = require("typeorm");
14
14
  const model_entity_1 = require("../../models/entities/model.entity");
15
- const project_entity_1 = require("../../projects/entities/project.entity");
15
+ const provider_entity_1 = require("../../providers/entities/provider.entity");
16
16
  let AgentEntity = class AgentEntity {
17
17
  };
18
18
  exports.AgentEntity = AgentEntity;
@@ -41,8 +41,13 @@ __decorate([
41
41
  __metadata("design:type", String)
42
42
  ], AgentEntity.prototype, "status", void 0);
43
43
  __decorate([
44
- (0, typeorm_1.Column)({ type: 'text', nullable: true }),
45
- __metadata("design:type", String)
44
+ (0, typeorm_1.ManyToOne)(() => provider_entity_1.Provider, {
45
+ nullable: true,
46
+ eager: true,
47
+ onDelete: 'SET NULL',
48
+ }),
49
+ (0, typeorm_1.JoinColumn)({ name: 'providerId' }),
50
+ __metadata("design:type", provider_entity_1.Provider)
46
51
  ], AgentEntity.prototype, "provider", void 0);
47
52
  __decorate([
48
53
  (0, typeorm_1.ManyToOne)(() => model_entity_1.Model, (model) => model.agents, {
@@ -52,13 +57,6 @@ __decorate([
52
57
  }),
53
58
  __metadata("design:type", model_entity_1.Model)
54
59
  ], AgentEntity.prototype, "model", void 0);
55
- __decorate([
56
- (0, typeorm_1.ManyToOne)(() => project_entity_1.Project, (project) => project.agents, {
57
- nullable: true,
58
- onDelete: 'SET NULL',
59
- }),
60
- __metadata("design:type", project_entity_1.Project)
61
- ], AgentEntity.prototype, "project", void 0);
62
60
  __decorate([
63
61
  (0, typeorm_1.CreateDateColumn)(),
64
62
  __metadata("design:type", Date)
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var ClaudeAgent_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.ClaudeAgent = void 0;
17
+ const claude_agent_sdk_1 = require("@anthropic-ai/claude-agent-sdk");
18
+ const common_1 = require("@nestjs/common");
19
+ const agent_registry_1 = require("../registry/agent.registry");
20
+ let ClaudeAgent = ClaudeAgent_1 = class ClaudeAgent {
21
+ constructor(model = 'claude-opus-4-6') {
22
+ this.logger = new common_1.Logger(ClaudeAgent_1.name);
23
+ this.name = 'ClaudeAgent';
24
+ this.provider = 'anthropic';
25
+ this.model = model;
26
+ const apiKey = process.env.ANTHROPIC_API_KEY;
27
+ if (!apiKey) {
28
+ this.logger.error('ANTHROPIC_API_KEY environment variable is not set');
29
+ throw new Error('ANTHROPIC_API_KEY is required to initialize ClaudeAgent');
30
+ }
31
+ }
32
+ getName() {
33
+ return this.name;
34
+ }
35
+ getDescription() {
36
+ return this.description || '';
37
+ }
38
+ getSystemInstructions() {
39
+ return this.systemInstructions || '';
40
+ }
41
+ getRole() {
42
+ return this.role || '';
43
+ }
44
+ getProvider() {
45
+ return this.provider;
46
+ }
47
+ getModel() {
48
+ return this.model;
49
+ }
50
+ updateConfig(config) {
51
+ if (config['name'])
52
+ this.name = config['name'];
53
+ if (config['description'])
54
+ this.description = config['description'];
55
+ if (config['systemInstructions'])
56
+ this.systemInstructions = config['systemInstructions'];
57
+ if (config['role'])
58
+ this.role = config['role'];
59
+ if (config['provider'])
60
+ this.provider = config['provider'];
61
+ if (config['model'])
62
+ this.model = config['model'];
63
+ }
64
+ buildSystemPrompt() {
65
+ return [
66
+ `Your name is ${this.name}.`,
67
+ this.role ? `Your role is: ${this.role}.` : '',
68
+ this.description ? `Description of yourself: ${this.description}.` : '',
69
+ this.systemInstructions
70
+ ? `Instructions:\n${this.systemInstructions}`
71
+ : '',
72
+ ]
73
+ .filter(Boolean)
74
+ .join('\n');
75
+ }
76
+ async processText(input) {
77
+ this.logger.debug(`Processing input with ClaudeAgent. Model: ${this.model}`);
78
+ try {
79
+ const systemPrompt = this.buildSystemPrompt();
80
+ let resultContent = '';
81
+ let resultMetadata = {};
82
+ const q = (0, claude_agent_sdk_1.query)({
83
+ prompt: input,
84
+ options: {
85
+ model: this.model,
86
+ systemPrompt,
87
+ permissionMode: 'bypassPermissions',
88
+ persistSession: false,
89
+ tools: [],
90
+ },
91
+ });
92
+ for await (const message of q) {
93
+ if (message.type === 'result' && message.subtype === 'success') {
94
+ resultContent = message.result;
95
+ resultMetadata = {
96
+ model: this.model,
97
+ usage: message.usage,
98
+ totalCostUsd: message.total_cost_usd,
99
+ numTurns: message.num_turns,
100
+ };
101
+ }
102
+ }
103
+ return {
104
+ content: resultContent,
105
+ metadata: resultMetadata,
106
+ };
107
+ }
108
+ catch (error) {
109
+ this.logger.error(`Claude Error: ${error}`);
110
+ throw error;
111
+ }
112
+ }
113
+ isFeatureSupported(feature) {
114
+ void feature;
115
+ return false;
116
+ }
117
+ async performTask(task, project) {
118
+ this.logger.debug(`Performing task: ${task.title} for project: ${project.title}`);
119
+ const prompt = `
120
+ Task: ${task.title}
121
+ Description: ${task.description}
122
+ Project: ${project.title}
123
+ Project Description: ${project.description}
124
+
125
+ Please perform the task and provide the output.
126
+ `;
127
+ return this.processText(prompt);
128
+ }
129
+ };
130
+ exports.ClaudeAgent = ClaudeAgent;
131
+ exports.ClaudeAgent = ClaudeAgent = ClaudeAgent_1 = __decorate([
132
+ (0, common_1.Injectable)(),
133
+ (0, agent_registry_1.RegisterAgent)('anthropic'),
134
+ __param(0, (0, common_1.Optional)()),
135
+ __metadata("design:paramtypes", [String])
136
+ ], ClaudeAgent);
@@ -21,7 +21,7 @@ let GeminiAgent = GeminiAgent_1 = class GeminiAgent {
21
21
  constructor(model = 'gemini-2.5-flash-lite') {
22
22
  this.logger = new common_1.Logger(GeminiAgent_1.name);
23
23
  this.name = 'GeminiAgent';
24
- this.provider = 'Google';
24
+ this.provider = 'google';
25
25
  this.enableGrounding = true;
26
26
  this.model = model;
27
27
  const apiKey = process.env.GEMINI_API_KEY;
@@ -157,11 +157,23 @@ let GeminiAgent = GeminiAgent_1 = class GeminiAgent {
157
157
  const hasExcludedSuffix = excludedSuffixes.some((s) => modelName.includes(s));
158
158
  return hasSupportedPrefix && !hasExcludedSuffix;
159
159
  }
160
+ async performTask(task, project) {
161
+ this.logger.debug(`Performing task: ${task.title} for project: ${project.title}`);
162
+ const prompt = `
163
+ Task: ${task.title}
164
+ Description: ${task.description}
165
+ Project: ${project.title}
166
+ Project Description: ${project.description}
167
+
168
+ Please perform the task and provide the output.
169
+ `;
170
+ return this.processText(prompt);
171
+ }
160
172
  };
161
173
  exports.GeminiAgent = GeminiAgent;
162
174
  exports.GeminiAgent = GeminiAgent = GeminiAgent_1 = __decorate([
163
175
  (0, common_1.Injectable)(),
164
- (0, agent_registry_1.RegisterAgent)('Google'),
176
+ (0, agent_registry_1.RegisterAgent)('google'),
165
177
  __param(0, (0, common_1.Optional)()),
166
178
  __metadata("design:paramtypes", [String])
167
179
  ], GeminiAgent);
@@ -19,12 +19,16 @@ const models_module_1 = require("./models/models.module");
19
19
  const tasks_module_1 = require("./tasks/tasks.module");
20
20
  const projects_module_1 = require("./projects/projects.module");
21
21
  const users_module_1 = require("./users/users.module");
22
+ const common_module_1 = require("./common/common.module");
23
+ const uploads_module_1 = require("./uploads/uploads.module");
24
+ const schedule_1 = require("@nestjs/schedule");
22
25
  let AppModule = class AppModule {
23
26
  };
24
27
  exports.AppModule = AppModule;
25
28
  exports.AppModule = AppModule = __decorate([
26
29
  (0, common_1.Module)({
27
30
  imports: [
31
+ schedule_1.ScheduleModule.forRoot(),
28
32
  typeorm_1.TypeOrmModule.forRoot({
29
33
  type: process.env.DATABASE_URL ? 'postgres' : 'sqlite',
30
34
  database: process.env.DATABASE_URL
@@ -37,6 +41,8 @@ exports.AppModule = AppModule = __decorate([
37
41
  serve_static_1.ServeStaticModule.forRoot({
38
42
  rootPath: (0, path_1.join)(__dirname, '..', '..', 'ui', 'dist'),
39
43
  }),
44
+ common_module_1.CommonModule,
45
+ uploads_module_1.UploadsModule,
40
46
  agents_module_1.AgentsModule,
41
47
  providers_module_1.ProvidersModule,
42
48
  models_module_1.ModelsModule,
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.CommonModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const storage_service_1 = require("./storage.service");
12
+ let CommonModule = class CommonModule {
13
+ };
14
+ exports.CommonModule = CommonModule;
15
+ exports.CommonModule = CommonModule = __decorate([
16
+ (0, common_1.Global)(),
17
+ (0, common_1.Module)({
18
+ providers: [storage_service_1.StorageService],
19
+ exports: [storage_service_1.StorageService],
20
+ })
21
+ ], CommonModule);
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __metadata = (this && this.__metadata) || function (k, v) {
42
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
+ };
44
+ var StorageService_1;
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.StorageService = void 0;
47
+ const common_1 = require("@nestjs/common");
48
+ const os = __importStar(require("os"));
49
+ const path = __importStar(require("path"));
50
+ const fs = __importStar(require("fs"));
51
+ const crypto = __importStar(require("crypto"));
52
+ let StorageService = StorageService_1 = class StorageService {
53
+ constructor() {
54
+ this.logger = new common_1.Logger(StorageService_1.name);
55
+ this.baseDir = path.join(os.homedir(), '.agent-orchestrator');
56
+ this.ensureDir(this.baseDir);
57
+ this.ensureDir(path.join(this.baseDir, 'artifacts'));
58
+ }
59
+ ensureDir(dir) {
60
+ if (!fs.existsSync(dir)) {
61
+ fs.mkdirSync(dir, { recursive: true });
62
+ this.logger.log(`Created directory: ${dir}`);
63
+ }
64
+ }
65
+ getArtifactsPath() {
66
+ return path.join(this.baseDir, 'artifacts');
67
+ }
68
+ getFullPath(relativePath) {
69
+ const filename = path.basename(relativePath);
70
+ return path.join(this.getArtifactsPath(), filename);
71
+ }
72
+ async saveBase64(base64, mimeType, originalName) {
73
+ const buffer = Buffer.from(base64, 'base64');
74
+ return this.saveBuffer(buffer, mimeType, originalName);
75
+ }
76
+ async saveBuffer(buffer, mimeType, originalName) {
77
+ const id = crypto.randomUUID();
78
+ const extension = mimeType.split('/')[1] || 'bin';
79
+ const filename = `${id}.${extension}`;
80
+ const filePath = path.join(this.getArtifactsPath(), filename);
81
+ await fs.promises.writeFile(filePath, buffer);
82
+ this.logger.debug(`Saved artifact to: ${filePath}`);
83
+ return {
84
+ id,
85
+ originalName,
86
+ mimeType,
87
+ filePath: `uploads/artifacts/${filename}`, // Publicly accessible path via UploadsController
88
+ };
89
+ }
90
+ async delete(relativePath) {
91
+ const fullPath = this.getFullPath(relativePath);
92
+ if (fs.existsSync(fullPath)) {
93
+ await fs.promises.unlink(fullPath);
94
+ this.logger.debug(`Deleted artifact file: ${fullPath}`);
95
+ }
96
+ }
97
+ };
98
+ exports.StorageService = StorageService;
99
+ exports.StorageService = StorageService = StorageService_1 = __decorate([
100
+ (0, common_1.Injectable)(),
101
+ __metadata("design:paramtypes", [])
102
+ ], StorageService);
@@ -32,6 +32,6 @@ __decorate([
32
32
  ], CreateProjectDto.prototype, "status", void 0);
33
33
  __decorate([
34
34
  (0, class_validator_1.IsUUID)(),
35
- (0, class_validator_1.IsNotEmpty)(),
35
+ (0, class_validator_1.IsOptional)(),
36
36
  __metadata("design:type", String)
37
- ], CreateProjectDto.prototype, "defaultAgentId", void 0);
37
+ ], CreateProjectDto.prototype, "ownerAgentId", void 0);
@@ -1,8 +1,23 @@
1
1
  "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
2
11
  Object.defineProperty(exports, "__esModule", { value: true });
3
12
  exports.UpdateProjectDto = void 0;
4
13
  const swagger_1 = require("@nestjs/swagger");
5
14
  const create_project_dto_1 = require("./create-project.dto");
15
+ const class_validator_1 = require("class-validator");
6
16
  class UpdateProjectDto extends (0, swagger_1.PartialType)(create_project_dto_1.CreateProjectDto) {
7
17
  }
8
18
  exports.UpdateProjectDto = UpdateProjectDto;
19
+ __decorate([
20
+ (0, class_validator_1.IsUUID)(),
21
+ (0, class_validator_1.IsOptional)(),
22
+ __metadata("design:type", String)
23
+ ], UpdateProjectDto.prototype, "ownerAgentId", void 0);
@@ -43,18 +43,14 @@ __decorate([
43
43
  }),
44
44
  __metadata("design:type", String)
45
45
  ], Project.prototype, "status", void 0);
46
- __decorate([
47
- (0, typeorm_1.OneToMany)(() => agent_entity_1.AgentEntity, (agent) => agent.project),
48
- __metadata("design:type", Array)
49
- ], Project.prototype, "agents", void 0);
50
46
  __decorate([
51
47
  (0, typeorm_1.ManyToOne)(() => agent_entity_1.AgentEntity, {
52
- nullable: false,
48
+ nullable: true,
53
49
  eager: true,
54
- onDelete: 'RESTRICT',
50
+ onDelete: 'SET NULL',
55
51
  }),
56
52
  __metadata("design:type", agent_entity_1.AgentEntity)
57
- ], Project.prototype, "defaultAgent", void 0);
53
+ ], Project.prototype, "ownerAgent", void 0);
58
54
  __decorate([
59
55
  (0, typeorm_1.CreateDateColumn)(),
60
56
  __metadata("design:type", Date)
@@ -21,5 +21,6 @@ exports.ProjectsModule = ProjectsModule = __decorate([
21
21
  imports: [typeorm_1.TypeOrmModule.forFeature([project_entity_1.Project, agent_entity_1.AgentEntity])],
22
22
  controllers: [projects_controller_1.ProjectsController],
23
23
  providers: [projects_service_1.ProjectsService],
24
+ exports: [projects_service_1.ProjectsService],
24
25
  })
25
26
  ], ProjectsModule);
@@ -26,7 +26,9 @@ let ProjectsService = class ProjectsService {
26
26
  title: createProjectDto.title,
27
27
  description: createProjectDto.description,
28
28
  status: createProjectDto.status ?? project_entity_1.ProjectStatus.PLANNING,
29
- defaultAgent: { id: createProjectDto.defaultAgentId },
29
+ ownerAgent: createProjectDto.ownerAgentId
30
+ ? { id: createProjectDto.ownerAgentId }
31
+ : null,
30
32
  });
31
33
  return this.projectsRepository.save(project);
32
34
  }
@@ -48,10 +50,11 @@ let ProjectsService = class ProjectsService {
48
50
  project.description = updateProjectDto.description;
49
51
  if (updateProjectDto.status !== undefined)
50
52
  project.status = updateProjectDto.status;
51
- if (updateProjectDto.defaultAgentId !== undefined)
52
- project.defaultAgent = {
53
- id: updateProjectDto.defaultAgentId,
54
- };
53
+ if (updateProjectDto.ownerAgentId !== undefined) {
54
+ project.ownerAgent = updateProjectDto.ownerAgentId
55
+ ? { id: updateProjectDto.ownerAgentId }
56
+ : null;
57
+ }
55
58
  return this.projectsRepository.save(project);
56
59
  }
57
60
  async remove(id) {
@@ -28,7 +28,7 @@ __decorate([
28
28
  __metadata("design:type", String)
29
29
  ], Provider.prototype, "description", void 0);
30
30
  __decorate([
31
- (0, typeorm_1.OneToMany)(() => model_entity_1.Model, (model) => model.provider),
31
+ (0, typeorm_1.OneToMany)(() => model_entity_1.Model, (model) => model.provider, { cascade: true }),
32
32
  __metadata("design:type", Array)
33
33
  ], Provider.prototype, "models", void 0);
34
34
  __decorate([