cast-code 1.0.9 → 1.0.11
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.
- package/dist/modules/core/services/deep-agent.service.js +1 -1
- package/dist/modules/core/services/deep-agent.service.js.map +1 -1
- package/dist/modules/kanban/kanban.module.js +36 -0
- package/dist/modules/kanban/kanban.module.js.map +1 -0
- package/dist/modules/kanban/services/kanban-server.service.js +322 -0
- package/dist/modules/kanban/services/kanban-server.service.js.map +1 -0
- package/dist/modules/kanban/views/kanban-ui.js +858 -0
- package/dist/modules/kanban/views/kanban-ui.js.map +1 -0
- package/dist/modules/mentions/services/mentions.service.js +3 -3
- package/dist/modules/mentions/services/mentions.service.js.map +1 -1
- package/dist/modules/permissions/services/prompt.service.js +17 -70
- package/dist/modules/permissions/services/prompt.service.js.map +1 -1
- package/dist/modules/repl/repl.module.js +3 -1
- package/dist/modules/repl/repl.module.js.map +1 -1
- package/dist/modules/repl/services/commands/project-commands.service.js +7 -9
- package/dist/modules/repl/services/commands/project-commands.service.js.map +1 -1
- package/dist/modules/repl/services/repl.service.js +112 -38
- package/dist/modules/repl/services/repl.service.js.map +1 -1
- package/dist/modules/repl/services/smart-input.js +2 -2
- package/dist/modules/repl/services/smart-input.js.map +1 -1
- package/dist/modules/tasks/services/plan-executor.service.js +2 -2
- package/dist/modules/tasks/services/plan-executor.service.js.map +1 -1
- package/dist/modules/tasks/services/plan-mode.service.js +11 -10
- package/dist/modules/tasks/services/plan-mode.service.js.map +1 -1
- package/dist/modules/tasks/services/task-management.service.js +54 -21
- package/dist/modules/tasks/services/task-management.service.js.map +1 -1
- package/dist/modules/tasks/services/task-tools.service.js +2 -2
- package/dist/modules/tasks/services/task-tools.service.js.map +1 -1
- package/dist/modules/tasks/types/task.types.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "KanbanServerService", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return KanbanServerService;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _common = require("@nestjs/common");
|
|
12
|
+
const _core = require("@nestjs/core");
|
|
13
|
+
const _http = /*#__PURE__*/ _interop_require_wildcard(require("http"));
|
|
14
|
+
const _child_process = require("child_process");
|
|
15
|
+
const _taskmanagementservice = require("../../tasks/services/task-management.service");
|
|
16
|
+
const _kanbanui = require("../views/kanban-ui");
|
|
17
|
+
const _tasktypes = require("../../tasks/types/task.types");
|
|
18
|
+
function _getRequireWildcardCache(nodeInterop) {
|
|
19
|
+
if (typeof WeakMap !== "function") return null;
|
|
20
|
+
var cacheBabelInterop = new WeakMap();
|
|
21
|
+
var cacheNodeInterop = new WeakMap();
|
|
22
|
+
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
23
|
+
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
24
|
+
})(nodeInterop);
|
|
25
|
+
}
|
|
26
|
+
function _interop_require_wildcard(obj, nodeInterop) {
|
|
27
|
+
if (!nodeInterop && obj && obj.__esModule) {
|
|
28
|
+
return obj;
|
|
29
|
+
}
|
|
30
|
+
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
31
|
+
return {
|
|
32
|
+
default: obj
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
var cache = _getRequireWildcardCache(nodeInterop);
|
|
36
|
+
if (cache && cache.has(obj)) {
|
|
37
|
+
return cache.get(obj);
|
|
38
|
+
}
|
|
39
|
+
var newObj = {
|
|
40
|
+
__proto__: null
|
|
41
|
+
};
|
|
42
|
+
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
43
|
+
for(var key in obj){
|
|
44
|
+
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
45
|
+
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
46
|
+
if (desc && (desc.get || desc.set)) {
|
|
47
|
+
Object.defineProperty(newObj, key, desc);
|
|
48
|
+
} else {
|
|
49
|
+
newObj[key] = obj[key];
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
newObj.default = obj;
|
|
54
|
+
if (cache) {
|
|
55
|
+
cache.set(obj, newObj);
|
|
56
|
+
}
|
|
57
|
+
return newObj;
|
|
58
|
+
}
|
|
59
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
60
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
61
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
62
|
+
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;
|
|
63
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
64
|
+
}
|
|
65
|
+
function _ts_metadata(k, v) {
|
|
66
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
67
|
+
}
|
|
68
|
+
let KanbanServerService = class KanbanServerService {
|
|
69
|
+
async getDeepAgent() {
|
|
70
|
+
if (!this.deepAgent) {
|
|
71
|
+
const { DeepAgentService } = await Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("../../core/services/deep-agent.service")));
|
|
72
|
+
this.deepAgent = this.moduleRef.get(DeepAgentService, {
|
|
73
|
+
strict: false
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
return this.deepAgent;
|
|
77
|
+
}
|
|
78
|
+
start() {
|
|
79
|
+
if (this.server) {
|
|
80
|
+
process.stdout.write(` Kanban already running at http://localhost:${this.port}\r\n`);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
this.server = _http.createServer((req, res)=>this.handleRequest(req, res));
|
|
84
|
+
this.server.listen(this.port, ()=>{
|
|
85
|
+
process.stdout.write(` Kanban: http://localhost:${this.port}\r\n`);
|
|
86
|
+
(0, _child_process.exec)(`xdg-open http://localhost:${this.port}`);
|
|
87
|
+
});
|
|
88
|
+
this.taskService.events.on('task:created', (task)=>this.broadcast('task:created', task));
|
|
89
|
+
this.taskService.events.on('task:updated', (task)=>this.broadcast('task:updated', task));
|
|
90
|
+
this.taskService.events.on('plan:created', (plan)=>this.broadcast('plan:created', plan));
|
|
91
|
+
process.on('exit', ()=>this.stop());
|
|
92
|
+
}
|
|
93
|
+
stop() {
|
|
94
|
+
if (!this.server) return;
|
|
95
|
+
for (const client of this.sseClients){
|
|
96
|
+
try {
|
|
97
|
+
client.end();
|
|
98
|
+
} catch {}
|
|
99
|
+
}
|
|
100
|
+
this.sseClients = [];
|
|
101
|
+
this.server.close();
|
|
102
|
+
this.server = null;
|
|
103
|
+
}
|
|
104
|
+
isRunning() {
|
|
105
|
+
return this.server !== null;
|
|
106
|
+
}
|
|
107
|
+
async handleRequest(req, res) {
|
|
108
|
+
const url = req.url || '/';
|
|
109
|
+
const method = req.method || 'GET';
|
|
110
|
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
111
|
+
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
|
|
112
|
+
res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
|
|
113
|
+
if (method === 'OPTIONS') {
|
|
114
|
+
res.writeHead(204);
|
|
115
|
+
res.end();
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (url === '/api/events') {
|
|
119
|
+
this.handleSSE(res);
|
|
120
|
+
} else if (url === '/api/state') {
|
|
121
|
+
this.handleState(res);
|
|
122
|
+
} else if (url === '/api/tasks' && method === 'POST') {
|
|
123
|
+
await this.handleCreateTask(req, res);
|
|
124
|
+
} else if (url === '/api/tasks/auto-execute' && method === 'POST') {
|
|
125
|
+
await this.handleAutoExecute(res);
|
|
126
|
+
} else if (url.startsWith('/api/tasks/') && method === 'PATCH') {
|
|
127
|
+
const parts = url.split('/');
|
|
128
|
+
const taskId = parts[parts.length - 1];
|
|
129
|
+
await this.handleUpdateTask(taskId, req, res);
|
|
130
|
+
} else if (url.startsWith('/api/tasks/') && url.endsWith('/execute') && method === 'POST') {
|
|
131
|
+
const parts = url.split('/');
|
|
132
|
+
const taskId = parts[parts.length - 2];
|
|
133
|
+
await this.handleExecuteTask(taskId, res);
|
|
134
|
+
} else {
|
|
135
|
+
res.writeHead(200, {
|
|
136
|
+
'Content-Type': 'text/html; charset=utf-8'
|
|
137
|
+
});
|
|
138
|
+
res.end((0, _kanbanui.getKanbanHtml)());
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
handleSSE(res) {
|
|
142
|
+
res.writeHead(200, {
|
|
143
|
+
'Content-Type': 'text/event-stream',
|
|
144
|
+
'Cache-Control': 'no-cache',
|
|
145
|
+
'Connection': 'keep-alive'
|
|
146
|
+
});
|
|
147
|
+
res.write(':\n\n');
|
|
148
|
+
this.sseClients.push(res);
|
|
149
|
+
res.on('close', ()=>{
|
|
150
|
+
this.sseClients = this.sseClients.filter((c)=>c !== res);
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
handleState(res) {
|
|
154
|
+
const tasks = this.taskService.listTasks();
|
|
155
|
+
const plans = Array.from(this.taskService.getPlans().values());
|
|
156
|
+
const body = JSON.stringify({
|
|
157
|
+
tasks,
|
|
158
|
+
plans
|
|
159
|
+
});
|
|
160
|
+
res.writeHead(200, {
|
|
161
|
+
'Content-Type': 'application/json'
|
|
162
|
+
});
|
|
163
|
+
res.end(body);
|
|
164
|
+
}
|
|
165
|
+
async handleCreateTask(req, res) {
|
|
166
|
+
let body = '';
|
|
167
|
+
req.on('data', (chunk)=>body += chunk);
|
|
168
|
+
req.on('end', ()=>{
|
|
169
|
+
try {
|
|
170
|
+
const { subject, description } = JSON.parse(body);
|
|
171
|
+
const task = this.taskService.createTask({
|
|
172
|
+
subject,
|
|
173
|
+
description
|
|
174
|
+
});
|
|
175
|
+
res.writeHead(201, {
|
|
176
|
+
'Content-Type': 'application/json'
|
|
177
|
+
});
|
|
178
|
+
res.end(JSON.stringify(task));
|
|
179
|
+
} catch (err) {
|
|
180
|
+
res.writeHead(400);
|
|
181
|
+
res.end(JSON.stringify({
|
|
182
|
+
error: 'Invalid JSON'
|
|
183
|
+
}));
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
async handleUpdateTask(taskId, req, res) {
|
|
188
|
+
let body = '';
|
|
189
|
+
req.on('data', (chunk)=>body += chunk);
|
|
190
|
+
req.on('end', async ()=>{
|
|
191
|
+
try {
|
|
192
|
+
const updates = JSON.parse(body);
|
|
193
|
+
const oldTask = this.taskService.getTask(taskId);
|
|
194
|
+
const task = this.taskService.updateTask(taskId, updates);
|
|
195
|
+
if (task) {
|
|
196
|
+
res.writeHead(200, {
|
|
197
|
+
'Content-Type': 'application/json'
|
|
198
|
+
});
|
|
199
|
+
res.end(JSON.stringify(task));
|
|
200
|
+
if (updates.status === _tasktypes.TaskStatus.IN_PROGRESS && oldTask?.status !== _tasktypes.TaskStatus.IN_PROGRESS) {
|
|
201
|
+
this.runAgentForTask(task);
|
|
202
|
+
}
|
|
203
|
+
} else {
|
|
204
|
+
res.writeHead(404);
|
|
205
|
+
res.end(JSON.stringify({
|
|
206
|
+
error: 'Task not found'
|
|
207
|
+
}));
|
|
208
|
+
}
|
|
209
|
+
} catch (err) {
|
|
210
|
+
res.writeHead(400);
|
|
211
|
+
res.end(JSON.stringify({
|
|
212
|
+
error: 'Invalid JSON'
|
|
213
|
+
}));
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
async handleAutoExecute(res) {
|
|
218
|
+
const tasks = this.taskService.listTasks().filter((t)=>t.status === _tasktypes.TaskStatus.PENDING || t.status === _tasktypes.TaskStatus.FAILED);
|
|
219
|
+
if (tasks.length === 0) {
|
|
220
|
+
res.writeHead(200);
|
|
221
|
+
res.end(JSON.stringify({
|
|
222
|
+
message: 'No tasks to execute'
|
|
223
|
+
}));
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
res.writeHead(202);
|
|
227
|
+
res.end(JSON.stringify({
|
|
228
|
+
message: 'Auto-planning started'
|
|
229
|
+
}));
|
|
230
|
+
(async ()=>{
|
|
231
|
+
try {
|
|
232
|
+
const agent = await this.getDeepAgent();
|
|
233
|
+
const taskList = tasks.map((t)=>`- [${t.id}] ${t.subject}: ${t.description}`).join('\n');
|
|
234
|
+
const prompt = `Você é o Coordenador do Kanban. Existem as seguintes tarefas pendentes:\n\n${taskList}\n\n` + `Sua missão é executá-las. Para que o usuário veja seu progresso no Board, você DEVE seguir este protocolo rigidamente:\n` + `1. Escolha a tarefa mais prioritária.\n` + `2. Chame 'task_update' com status='in_progress' para o ID da tarefa ANTES de começar.\n` + `3. Execute o trabalho necessário.\n` + `4. Chame 'task_update' com status='completed' assim que terminar.\n` + `5. Repita para a próxima tarefa.\n\n` + `Pode começar agora.`;
|
|
235
|
+
process.stdout.write(`\n Kanban: Starting intelligent auto-planner for ${tasks.length} tasks...\r\n`);
|
|
236
|
+
for await (const chunk of agent.chat(prompt)){
|
|
237
|
+
process.stdout.write(chunk);
|
|
238
|
+
}
|
|
239
|
+
} catch (err) {
|
|
240
|
+
process.stdout.write(` Kanban: Auto-planner error: ${err}\r\n`);
|
|
241
|
+
}
|
|
242
|
+
})();
|
|
243
|
+
}
|
|
244
|
+
async handleExecuteTask(taskId, res) {
|
|
245
|
+
const task = this.taskService.getTask(taskId);
|
|
246
|
+
if (!task) {
|
|
247
|
+
res.writeHead(404);
|
|
248
|
+
res.end(JSON.stringify({
|
|
249
|
+
error: 'Task not found'
|
|
250
|
+
}));
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
if (task.status !== _tasktypes.TaskStatus.PENDING && task.status !== _tasktypes.TaskStatus.FAILED) {
|
|
254
|
+
res.writeHead(400);
|
|
255
|
+
res.end(JSON.stringify({
|
|
256
|
+
error: 'Task already in progress or completed'
|
|
257
|
+
}));
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
res.writeHead(202);
|
|
261
|
+
res.end(JSON.stringify({
|
|
262
|
+
message: 'Execution started'
|
|
263
|
+
}));
|
|
264
|
+
this.runAgentForTask(task);
|
|
265
|
+
}
|
|
266
|
+
async runAgentForTask(task) {
|
|
267
|
+
const taskId = task.id;
|
|
268
|
+
(async ()=>{
|
|
269
|
+
try {
|
|
270
|
+
process.stdout.write(`\n Kanban: Starting task ${taskId}: ${task.subject}\r\n`);
|
|
271
|
+
this.taskService.updateTask(taskId, {
|
|
272
|
+
status: _tasktypes.TaskStatus.IN_PROGRESS,
|
|
273
|
+
assignedAgent: 'deep-agent'
|
|
274
|
+
});
|
|
275
|
+
const agent = await this.getDeepAgent();
|
|
276
|
+
const result = await agent.executeTask(task);
|
|
277
|
+
if (result.success) {
|
|
278
|
+
this.taskService.updateTask(taskId, {
|
|
279
|
+
status: _tasktypes.TaskStatus.COMPLETED
|
|
280
|
+
});
|
|
281
|
+
process.stdout.write(` Kanban: Task ${taskId} completed\r\n`);
|
|
282
|
+
} else {
|
|
283
|
+
this.taskService.updateTask(taskId, {
|
|
284
|
+
status: _tasktypes.TaskStatus.FAILED
|
|
285
|
+
});
|
|
286
|
+
process.stdout.write(` Kanban: Task ${taskId} failed: ${result.error}\r\n`);
|
|
287
|
+
}
|
|
288
|
+
} catch (err) {
|
|
289
|
+
this.taskService.updateTask(taskId, {
|
|
290
|
+
status: _tasktypes.TaskStatus.FAILED
|
|
291
|
+
});
|
|
292
|
+
process.stdout.write(` Kanban: Error executing task ${taskId}: ${err}\r\n`);
|
|
293
|
+
}
|
|
294
|
+
})();
|
|
295
|
+
}
|
|
296
|
+
broadcast(event, data) {
|
|
297
|
+
const payload = `event: ${event}\ndata: ${JSON.stringify(data)}\n\n`;
|
|
298
|
+
for (const client of this.sseClients){
|
|
299
|
+
try {
|
|
300
|
+
client.write(payload);
|
|
301
|
+
} catch {}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
constructor(taskService, moduleRef){
|
|
305
|
+
this.taskService = taskService;
|
|
306
|
+
this.moduleRef = moduleRef;
|
|
307
|
+
this.server = null;
|
|
308
|
+
this.sseClients = [];
|
|
309
|
+
this.port = 3333;
|
|
310
|
+
this.deepAgent = null;
|
|
311
|
+
}
|
|
312
|
+
};
|
|
313
|
+
KanbanServerService = _ts_decorate([
|
|
314
|
+
(0, _common.Injectable)(),
|
|
315
|
+
_ts_metadata("design:type", Function),
|
|
316
|
+
_ts_metadata("design:paramtypes", [
|
|
317
|
+
typeof _taskmanagementservice.TaskManagementService === "undefined" ? Object : _taskmanagementservice.TaskManagementService,
|
|
318
|
+
typeof _core.ModuleRef === "undefined" ? Object : _core.ModuleRef
|
|
319
|
+
])
|
|
320
|
+
], KanbanServerService);
|
|
321
|
+
|
|
322
|
+
//# sourceMappingURL=kanban-server.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/modules/kanban/services/kanban-server.service.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { ModuleRef } from '@nestjs/core';\nimport * as http from 'http';\nimport { exec } from 'child_process';\nimport { TaskManagementService } from '../../tasks/services/task-management.service';\nimport { getKanbanHtml } from '../views/kanban-ui';\nimport { TaskStatus } from '../../tasks/types/task.types';\n\n@Injectable()\nexport class KanbanServerService {\n private server: http.Server | null = null;\n private sseClients: http.ServerResponse[] = [];\n private port = 3333;\n private deepAgent: any = null;\n\n constructor(\n private readonly taskService: TaskManagementService,\n private readonly moduleRef: ModuleRef\n ) {}\n\n private async getDeepAgent() {\n if (!this.deepAgent) {\n const { DeepAgentService } = await import('../../core/services/deep-agent.service');\n this.deepAgent = this.moduleRef.get(DeepAgentService, { strict: false });\n }\n return this.deepAgent;\n }\n\n start(): void {\n if (this.server) {\n process.stdout.write(` Kanban already running at http://localhost:${this.port}\\r\\n`);\n return;\n }\n\n this.server = http.createServer((req, res) => this.handleRequest(req, res));\n\n this.server.listen(this.port, () => {\n process.stdout.write(` Kanban: http://localhost:${this.port}\\r\\n`);\n exec(`xdg-open http://localhost:${this.port}`);\n });\n\n this.taskService.events.on('task:created', (task) => this.broadcast('task:created', task));\n this.taskService.events.on('task:updated', (task) => this.broadcast('task:updated', task));\n this.taskService.events.on('plan:created', (plan) => this.broadcast('plan:created', plan));\n\n process.on('exit', () => this.stop());\n }\n\n stop(): void {\n if (!this.server) return;\n for (const client of this.sseClients) {\n try { client.end(); } catch {}\n }\n this.sseClients = [];\n this.server.close();\n this.server = null;\n }\n\n isRunning(): boolean {\n return this.server !== null;\n }\n\n private async handleRequest(req: http.IncomingMessage, res: http.ServerResponse): Promise<void> {\n const url = req.url || '/';\n const method = req.method || 'GET';\n\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type');\n\n if (method === 'OPTIONS') {\n res.writeHead(204);\n res.end();\n return;\n }\n\n if (url === '/api/events') {\n this.handleSSE(res);\n } else if (url === '/api/state') {\n this.handleState(res);\n } else if (url === '/api/tasks' && method === 'POST') {\n await this.handleCreateTask(req, res);\n } else if (url === '/api/tasks/auto-execute' && method === 'POST') {\n await this.handleAutoExecute(res);\n } else if (url.startsWith('/api/tasks/') && method === 'PATCH') {\n const parts = url.split('/');\n const taskId = parts[parts.length - 1];\n await this.handleUpdateTask(taskId, req, res);\n } else if (url.startsWith('/api/tasks/') && url.endsWith('/execute') && method === 'POST') {\n const parts = url.split('/');\n const taskId = parts[parts.length - 2];\n await this.handleExecuteTask(taskId, res);\n } else {\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end(getKanbanHtml());\n }\n }\n\n private handleSSE(res: http.ServerResponse): void {\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Connection': 'keep-alive',\n });\n res.write(':\\n\\n');\n\n this.sseClients.push(res);\n\n res.on('close', () => {\n this.sseClients = this.sseClients.filter(c => c !== res);\n });\n }\n\n private handleState(res: http.ServerResponse): void {\n const tasks = this.taskService.listTasks();\n const plans = Array.from(this.taskService.getPlans().values());\n const body = JSON.stringify({ tasks, plans });\n\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(body);\n }\n\n private async handleCreateTask(req: http.IncomingMessage, res: http.ServerResponse): Promise<void> {\n let body = '';\n req.on('data', chunk => body += chunk);\n req.on('end', () => {\n try {\n const { subject, description } = JSON.parse(body);\n const task = this.taskService.createTask({ subject, description });\n res.writeHead(201, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify(task));\n } catch (err) {\n res.writeHead(400);\n res.end(JSON.stringify({ error: 'Invalid JSON' }));\n }\n });\n }\n\n private async handleUpdateTask(taskId: string, req: http.IncomingMessage, res: http.ServerResponse): Promise<void> {\n let body = '';\n req.on('data', chunk => body += chunk);\n req.on('end', async () => {\n try {\n const updates = JSON.parse(body);\n const oldTask = this.taskService.getTask(taskId);\n const task = this.taskService.updateTask(taskId, updates);\n \n if (task) {\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify(task));\n\n if (updates.status === TaskStatus.IN_PROGRESS && oldTask?.status !== TaskStatus.IN_PROGRESS) {\n this.runAgentForTask(task);\n }\n } else {\n res.writeHead(404);\n res.end(JSON.stringify({ error: 'Task not found' }));\n }\n } catch (err) {\n res.writeHead(400);\n res.end(JSON.stringify({ error: 'Invalid JSON' }));\n }\n });\n }\n\n private async handleAutoExecute(res: http.ServerResponse): Promise<void> {\n const tasks = this.taskService.listTasks().filter(t => t.status === TaskStatus.PENDING || t.status === TaskStatus.FAILED);\n \n if (tasks.length === 0) {\n res.writeHead(200);\n res.end(JSON.stringify({ message: 'No tasks to execute' }));\n return;\n }\n\n res.writeHead(202);\n res.end(JSON.stringify({ message: 'Auto-planning started' }));\n\n (async () => {\n try {\n const agent = await this.getDeepAgent();\n const taskList = tasks.map(t => `- [${t.id}] ${t.subject}: ${t.description}`).join('\\n');\n \n const prompt = `Você é o Coordenador do Kanban. Existem as seguintes tarefas pendentes:\\n\\n${taskList}\\n\\n` +\n `Sua missão é executá-las. Para que o usuário veja seu progresso no Board, você DEVE seguir este protocolo rigidamente:\\n` +\n `1. Escolha a tarefa mais prioritária.\\n` +\n `2. Chame 'task_update' com status='in_progress' para o ID da tarefa ANTES de começar.\\n` +\n `3. Execute o trabalho necessário.\\n` +\n `4. Chame 'task_update' com status='completed' assim que terminar.\\n` +\n `5. Repita para a próxima tarefa.\\n\\n` +\n `Pode começar agora.`;\n \n process.stdout.write(`\\n Kanban: Starting intelligent auto-planner for ${tasks.length} tasks...\\r\\n`);\n \n for await (const chunk of agent.chat(prompt)) {\n process.stdout.write(chunk);\n }\n } catch (err) {\n process.stdout.write(` Kanban: Auto-planner error: ${err}\\r\\n`);\n }\n })();\n }\n\n private async handleExecuteTask(taskId: string, res: http.ServerResponse): Promise<void> {\n const task = this.taskService.getTask(taskId);\n if (!task) {\n res.writeHead(404);\n res.end(JSON.stringify({ error: 'Task not found' }));\n return;\n }\n\n if (task.status !== TaskStatus.PENDING && task.status !== TaskStatus.FAILED) {\n res.writeHead(400);\n res.end(JSON.stringify({ error: 'Task already in progress or completed' }));\n return;\n }\n\n res.writeHead(202);\n res.end(JSON.stringify({ message: 'Execution started' }));\n\n this.runAgentForTask(task);\n }\n\n private async runAgentForTask(task: any): Promise<void> {\n const taskId = task.id;\n (async () => {\n try {\n process.stdout.write(`\\n Kanban: Starting task ${taskId}: ${task.subject}\\r\\n`);\n this.taskService.updateTask(taskId, { status: TaskStatus.IN_PROGRESS, assignedAgent: 'deep-agent' });\n \n const agent = await this.getDeepAgent();\n const result = await agent.executeTask(task);\n \n if (result.success) {\n this.taskService.updateTask(taskId, { status: TaskStatus.COMPLETED });\n process.stdout.write(` Kanban: Task ${taskId} completed\\r\\n`);\n } else {\n this.taskService.updateTask(taskId, { status: TaskStatus.FAILED });\n process.stdout.write(` Kanban: Task ${taskId} failed: ${result.error}\\r\\n`);\n }\n } catch (err) {\n this.taskService.updateTask(taskId, { status: TaskStatus.FAILED });\n process.stdout.write(` Kanban: Error executing task ${taskId}: ${err}\\r\\n`);\n }\n })();\n }\n\n private broadcast(event: string, data: unknown): void {\n const payload = `event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`;\n for (const client of this.sseClients) {\n try { client.write(payload); } catch {}\n }\n }\n}\n"],"names":["KanbanServerService","getDeepAgent","deepAgent","DeepAgentService","moduleRef","get","strict","start","server","process","stdout","write","port","http","createServer","req","res","handleRequest","listen","exec","taskService","events","on","task","broadcast","plan","stop","client","sseClients","end","close","isRunning","url","method","setHeader","writeHead","handleSSE","handleState","handleCreateTask","handleAutoExecute","startsWith","parts","split","taskId","length","handleUpdateTask","endsWith","handleExecuteTask","getKanbanHtml","push","filter","c","tasks","listTasks","plans","Array","from","getPlans","values","body","JSON","stringify","chunk","subject","description","parse","createTask","err","error","updates","oldTask","getTask","updateTask","status","TaskStatus","IN_PROGRESS","runAgentForTask","t","PENDING","FAILED","message","agent","taskList","map","id","join","prompt","chat","assignedAgent","result","executeTask","success","COMPLETED","event","data","payload"],"mappings":"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"}
|