@blackms/aistack 1.1.0 → 1.3.0

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 (67) hide show
  1. package/README.md +152 -11
  2. package/dist/agents/definitions/adversarial.d.ts +6 -0
  3. package/dist/agents/definitions/adversarial.d.ts.map +1 -0
  4. package/dist/agents/definitions/adversarial.js +34 -0
  5. package/dist/agents/definitions/adversarial.js.map +1 -0
  6. package/dist/agents/definitions/index.d.ts +1 -0
  7. package/dist/agents/definitions/index.d.ts.map +1 -1
  8. package/dist/agents/definitions/index.js +1 -0
  9. package/dist/agents/definitions/index.js.map +1 -1
  10. package/dist/agents/registry.d.ts.map +1 -1
  11. package/dist/agents/registry.js +2 -1
  12. package/dist/agents/registry.js.map +1 -1
  13. package/dist/coordination/index.d.ts +1 -0
  14. package/dist/coordination/index.d.ts.map +1 -1
  15. package/dist/coordination/index.js +1 -0
  16. package/dist/coordination/index.js.map +1 -1
  17. package/dist/coordination/review-loop.d.ts +85 -0
  18. package/dist/coordination/review-loop.d.ts.map +1 -0
  19. package/dist/coordination/review-loop.js +306 -0
  20. package/dist/coordination/review-loop.js.map +1 -0
  21. package/dist/mcp/tools/index.d.ts +1 -0
  22. package/dist/mcp/tools/index.d.ts.map +1 -1
  23. package/dist/mcp/tools/index.js +1 -0
  24. package/dist/mcp/tools/index.js.map +1 -1
  25. package/dist/mcp/tools/review-loop-tools.d.ts +210 -0
  26. package/dist/mcp/tools/review-loop-tools.d.ts.map +1 -0
  27. package/dist/mcp/tools/review-loop-tools.js +213 -0
  28. package/dist/mcp/tools/review-loop-tools.js.map +1 -0
  29. package/dist/memory/index.d.ts +23 -1
  30. package/dist/memory/index.d.ts.map +1 -1
  31. package/dist/memory/index.js +54 -0
  32. package/dist/memory/index.js.map +1 -1
  33. package/dist/memory/sqlite-store.d.ts +26 -1
  34. package/dist/memory/sqlite-store.d.ts.map +1 -1
  35. package/dist/memory/sqlite-store.js +356 -0
  36. package/dist/memory/sqlite-store.js.map +1 -1
  37. package/dist/types.d.ts +91 -1
  38. package/dist/types.d.ts.map +1 -1
  39. package/dist/types.js +9 -0
  40. package/dist/types.js.map +1 -1
  41. package/dist/utils/validation.d.ts +2 -2
  42. package/dist/web/routes/filesystem.d.ts +7 -0
  43. package/dist/web/routes/filesystem.d.ts.map +1 -0
  44. package/dist/web/routes/filesystem.js +212 -0
  45. package/dist/web/routes/filesystem.js.map +1 -0
  46. package/dist/web/routes/index.d.ts +3 -0
  47. package/dist/web/routes/index.d.ts.map +1 -1
  48. package/dist/web/routes/index.js +3 -0
  49. package/dist/web/routes/index.js.map +1 -1
  50. package/dist/web/routes/projects.d.ts +7 -0
  51. package/dist/web/routes/projects.d.ts.map +1 -0
  52. package/dist/web/routes/projects.js +296 -0
  53. package/dist/web/routes/projects.js.map +1 -0
  54. package/dist/web/routes/specifications.d.ts +7 -0
  55. package/dist/web/routes/specifications.d.ts.map +1 -0
  56. package/dist/web/routes/specifications.js +267 -0
  57. package/dist/web/routes/specifications.js.map +1 -0
  58. package/dist/web/server.d.ts.map +1 -1
  59. package/dist/web/server.js +7 -1
  60. package/dist/web/server.js.map +1 -1
  61. package/dist/web/types.d.ts +64 -0
  62. package/dist/web/types.d.ts.map +1 -1
  63. package/dist/web/websocket/event-bridge.d.ts +38 -1
  64. package/dist/web/websocket/event-bridge.d.ts.map +1 -1
  65. package/dist/web/websocket/event-bridge.js +7 -0
  66. package/dist/web/websocket/event-bridge.js.map +1 -1
  67. package/package.json +1 -1
@@ -0,0 +1,212 @@
1
+ /**
2
+ * Filesystem routes for folder browsing
3
+ */
4
+ import { readdirSync, statSync, existsSync, accessSync, constants } from 'node:fs';
5
+ import { homedir } from 'node:os';
6
+ import { join, resolve, dirname, basename } from 'node:path';
7
+ import { sendJson } from '../router.js';
8
+ import { badRequest } from '../middleware/error.js';
9
+ export function registerFilesystemRoutes(router, _config) {
10
+ // GET /api/v1/filesystem/roots - Get root directories
11
+ router.get('/api/v1/filesystem/roots', (_req, res) => {
12
+ const home = homedir();
13
+ const roots = [
14
+ {
15
+ name: 'Home',
16
+ path: home,
17
+ type: 'directory',
18
+ },
19
+ ];
20
+ // Add common development directories if they exist
21
+ const commonDirs = [
22
+ { name: 'Documents', path: join(home, 'Documents') },
23
+ { name: 'Projects', path: join(home, 'Projects') },
24
+ { name: 'Code', path: join(home, 'Code') },
25
+ { name: 'Development', path: join(home, 'Development') },
26
+ { name: 'Workspace', path: join(home, 'Workspace') },
27
+ { name: 'Desktop', path: join(home, 'Desktop') },
28
+ ];
29
+ for (const dir of commonDirs) {
30
+ if (existsSync(dir.path)) {
31
+ try {
32
+ accessSync(dir.path, constants.R_OK);
33
+ roots.push({
34
+ name: dir.name,
35
+ path: dir.path,
36
+ type: 'directory',
37
+ });
38
+ }
39
+ catch {
40
+ // Skip directories we can't access
41
+ }
42
+ }
43
+ }
44
+ sendJson(res, roots);
45
+ });
46
+ // GET /api/v1/filesystem/browse - Browse directory contents
47
+ router.get('/api/v1/filesystem/browse', (_req, res, params) => {
48
+ let path = params.query.path;
49
+ const showHidden = params.query.showHidden === 'true';
50
+ const showFiles = params.query.showFiles !== 'false';
51
+ // Default to home directory if no path provided
52
+ if (!path) {
53
+ path = homedir();
54
+ }
55
+ // Resolve the path
56
+ const resolvedPath = resolve(path);
57
+ // Check if path exists
58
+ if (!existsSync(resolvedPath)) {
59
+ throw badRequest(`Path does not exist: ${path}`);
60
+ }
61
+ // Check if it's a directory
62
+ const stat = statSync(resolvedPath);
63
+ if (!stat.isDirectory()) {
64
+ throw badRequest(`Path is not a directory: ${path}`);
65
+ }
66
+ // Check read access
67
+ try {
68
+ accessSync(resolvedPath, constants.R_OK);
69
+ }
70
+ catch {
71
+ throw badRequest(`Cannot access directory: ${path}`);
72
+ }
73
+ // Read directory contents
74
+ const entries = [];
75
+ try {
76
+ const items = readdirSync(resolvedPath);
77
+ for (const item of items) {
78
+ // Skip hidden files unless explicitly requested
79
+ if (!showHidden && item.startsWith('.')) {
80
+ continue;
81
+ }
82
+ const itemPath = join(resolvedPath, item);
83
+ try {
84
+ const itemStat = statSync(itemPath);
85
+ const isDirectory = itemStat.isDirectory();
86
+ // Skip files if only directories are requested
87
+ if (!showFiles && !isDirectory) {
88
+ continue;
89
+ }
90
+ entries.push({
91
+ name: item,
92
+ path: itemPath,
93
+ type: isDirectory ? 'directory' : 'file',
94
+ });
95
+ }
96
+ catch {
97
+ // Skip items we can't stat (permissions, broken symlinks, etc.)
98
+ }
99
+ }
100
+ }
101
+ catch {
102
+ throw badRequest(`Cannot read directory: ${path}`);
103
+ }
104
+ // Sort: directories first, then alphabetically
105
+ entries.sort((a, b) => {
106
+ if (a.type === 'directory' && b.type !== 'directory')
107
+ return -1;
108
+ if (a.type !== 'directory' && b.type === 'directory')
109
+ return 1;
110
+ return a.name.toLowerCase().localeCompare(b.name.toLowerCase());
111
+ });
112
+ sendJson(res, {
113
+ path: resolvedPath,
114
+ parent: dirname(resolvedPath) !== resolvedPath ? dirname(resolvedPath) : null,
115
+ name: basename(resolvedPath),
116
+ entries,
117
+ });
118
+ });
119
+ // POST /api/v1/filesystem/validate - Validate a path
120
+ router.post('/api/v1/filesystem/validate', (_req, res, params) => {
121
+ const body = params.body;
122
+ if (!body?.path) {
123
+ throw badRequest('Path is required');
124
+ }
125
+ const resolvedPath = resolve(body.path);
126
+ const validation = {
127
+ valid: true,
128
+ path: resolvedPath,
129
+ exists: false,
130
+ isDirectory: false,
131
+ readable: false,
132
+ writable: false,
133
+ errors: [],
134
+ };
135
+ // Check if path exists
136
+ if (!existsSync(resolvedPath)) {
137
+ validation.valid = false;
138
+ validation.errors.push('Path does not exist');
139
+ sendJson(res, validation);
140
+ return;
141
+ }
142
+ validation.exists = true;
143
+ // Check if it's a directory
144
+ try {
145
+ const stat = statSync(resolvedPath);
146
+ validation.isDirectory = stat.isDirectory();
147
+ if (!validation.isDirectory) {
148
+ validation.valid = false;
149
+ validation.errors.push('Path is not a directory');
150
+ }
151
+ }
152
+ catch (error) {
153
+ validation.valid = false;
154
+ validation.errors.push(`Cannot stat path: ${error instanceof Error ? error.message : 'unknown error'}`);
155
+ sendJson(res, validation);
156
+ return;
157
+ }
158
+ // Check read access
159
+ try {
160
+ accessSync(resolvedPath, constants.R_OK);
161
+ validation.readable = true;
162
+ }
163
+ catch {
164
+ validation.valid = false;
165
+ validation.errors.push('Directory is not readable');
166
+ }
167
+ // Check write access
168
+ try {
169
+ accessSync(resolvedPath, constants.W_OK);
170
+ validation.writable = true;
171
+ }
172
+ catch {
173
+ validation.valid = false;
174
+ validation.errors.push('Directory is not writable');
175
+ }
176
+ sendJson(res, validation);
177
+ });
178
+ // GET /api/v1/filesystem/parent - Get parent directory
179
+ router.get('/api/v1/filesystem/parent', (_req, res, params) => {
180
+ const path = params.query.path;
181
+ if (!path) {
182
+ throw badRequest('Path is required');
183
+ }
184
+ const resolvedPath = resolve(path);
185
+ const parentPath = dirname(resolvedPath);
186
+ // Check if we're at the root
187
+ if (parentPath === resolvedPath) {
188
+ sendJson(res, {
189
+ path: resolvedPath,
190
+ parent: null,
191
+ isRoot: true,
192
+ });
193
+ return;
194
+ }
195
+ // Check if parent exists and is accessible
196
+ if (!existsSync(parentPath)) {
197
+ throw badRequest('Parent directory does not exist');
198
+ }
199
+ try {
200
+ accessSync(parentPath, constants.R_OK);
201
+ }
202
+ catch {
203
+ throw badRequest('Parent directory is not accessible');
204
+ }
205
+ sendJson(res, {
206
+ path: resolvedPath,
207
+ parent: parentPath,
208
+ isRoot: false,
209
+ });
210
+ });
211
+ }
212
+ //# sourceMappingURL=filesystem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../../src/web/routes/filesystem.ts"],"names":[],"mappings":"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"}
@@ -7,4 +7,7 @@ export { registerTaskRoutes } from './tasks.js';
7
7
  export { registerSessionRoutes } from './sessions.js';
8
8
  export { registerWorkflowRoutes } from './workflows.js';
9
9
  export { registerSystemRoutes } from './system.js';
10
+ export { registerProjectRoutes } from './projects.js';
11
+ export { registerSpecificationRoutes } from './specifications.js';
12
+ export { registerFilesystemRoutes } from './filesystem.js';
10
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/web/routes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/web/routes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -7,4 +7,7 @@ export { registerTaskRoutes } from './tasks.js';
7
7
  export { registerSessionRoutes } from './sessions.js';
8
8
  export { registerWorkflowRoutes } from './workflows.js';
9
9
  export { registerSystemRoutes } from './system.js';
10
+ export { registerProjectRoutes } from './projects.js';
11
+ export { registerSpecificationRoutes } from './specifications.js';
12
+ export { registerFilesystemRoutes } from './filesystem.js';
10
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/web/routes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/web/routes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Project routes
3
+ */
4
+ import type { AgentStackConfig } from '../../types.js';
5
+ import type { Router } from '../router.js';
6
+ export declare function registerProjectRoutes(router: Router, config: AgentStackConfig): void;
7
+ //# sourceMappingURL=projects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../../src/web/routes/projects.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAc3C,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CA8VpF"}
@@ -0,0 +1,296 @@
1
+ /**
2
+ * Project routes
3
+ */
4
+ import { PHASE_TRANSITIONS } from '../../types.js';
5
+ import { sendJson } from '../router.js';
6
+ import { badRequest, notFound } from '../middleware/error.js';
7
+ import { getMemoryManager } from '../../memory/index.js';
8
+ import { agentEvents } from '../websocket/event-bridge.js';
9
+ export function registerProjectRoutes(router, config) {
10
+ const getManager = () => getMemoryManager(config);
11
+ // GET /api/v1/projects - List projects
12
+ router.get('/api/v1/projects', (_req, res, params) => {
13
+ const status = params.query.status;
14
+ const manager = getManager();
15
+ const projects = manager.listProjects(status);
16
+ sendJson(res, projects.map(project => ({
17
+ ...project,
18
+ createdAt: project.createdAt.toISOString(),
19
+ updatedAt: project.updatedAt.toISOString(),
20
+ })));
21
+ });
22
+ // POST /api/v1/projects - Create project
23
+ router.post('/api/v1/projects', (_req, res, params) => {
24
+ const body = params.body;
25
+ if (!body?.name) {
26
+ throw badRequest('Project name is required');
27
+ }
28
+ if (!body?.path) {
29
+ throw badRequest('Project path is required');
30
+ }
31
+ const manager = getManager();
32
+ const project = manager.createProject(body.name, body.path, body.description, body.metadata);
33
+ // Emit event for WebSocket clients
34
+ agentEvents.emit('project:created', {
35
+ id: project.id,
36
+ name: project.name,
37
+ path: project.path,
38
+ });
39
+ sendJson(res, {
40
+ ...project,
41
+ createdAt: project.createdAt.toISOString(),
42
+ updatedAt: project.updatedAt.toISOString(),
43
+ }, 201);
44
+ });
45
+ // GET /api/v1/projects/:id - Get project by ID
46
+ router.get('/api/v1/projects/:id', (_req, res, params) => {
47
+ const projectId = params.path[0];
48
+ if (!projectId) {
49
+ throw badRequest('Project ID is required');
50
+ }
51
+ const manager = getManager();
52
+ const project = manager.getProject(projectId);
53
+ if (!project) {
54
+ throw notFound('Project');
55
+ }
56
+ sendJson(res, {
57
+ ...project,
58
+ createdAt: project.createdAt.toISOString(),
59
+ updatedAt: project.updatedAt.toISOString(),
60
+ });
61
+ });
62
+ // PUT /api/v1/projects/:id - Update project
63
+ router.put('/api/v1/projects/:id', (_req, res, params) => {
64
+ const projectId = params.path[0];
65
+ if (!projectId) {
66
+ throw badRequest('Project ID is required');
67
+ }
68
+ const body = params.body;
69
+ if (!body) {
70
+ throw badRequest('Request body is required');
71
+ }
72
+ const manager = getManager();
73
+ const project = manager.getProject(projectId);
74
+ if (!project) {
75
+ throw notFound('Project');
76
+ }
77
+ const success = manager.updateProject(projectId, body);
78
+ if (!success) {
79
+ throw notFound('Project');
80
+ }
81
+ const updated = manager.getProject(projectId);
82
+ // Emit event for WebSocket clients
83
+ agentEvents.emit('project:updated', {
84
+ id: projectId,
85
+ changes: body,
86
+ });
87
+ sendJson(res, {
88
+ ...updated,
89
+ createdAt: updated?.createdAt.toISOString(),
90
+ updatedAt: updated?.updatedAt.toISOString(),
91
+ });
92
+ });
93
+ // DELETE /api/v1/projects/:id - Delete project
94
+ router.delete('/api/v1/projects/:id', (_req, res, params) => {
95
+ const projectId = params.path[0];
96
+ if (!projectId) {
97
+ throw badRequest('Project ID is required');
98
+ }
99
+ const manager = getManager();
100
+ const success = manager.deleteProject(projectId);
101
+ if (!success) {
102
+ throw notFound('Project');
103
+ }
104
+ sendJson(res, { deleted: true });
105
+ });
106
+ // GET /api/v1/projects/:id/tasks - List project tasks
107
+ router.get('/api/v1/projects/:id/tasks', (_req, res, params) => {
108
+ const projectId = params.path[0];
109
+ if (!projectId) {
110
+ throw badRequest('Project ID is required');
111
+ }
112
+ const phase = params.query.phase;
113
+ const manager = getManager();
114
+ const project = manager.getProject(projectId);
115
+ if (!project) {
116
+ throw notFound('Project');
117
+ }
118
+ const tasks = manager.listProjectTasks(projectId, phase);
119
+ sendJson(res, tasks.map(task => ({
120
+ ...task,
121
+ createdAt: task.createdAt.toISOString(),
122
+ updatedAt: task.updatedAt.toISOString(),
123
+ completedAt: task.completedAt?.toISOString(),
124
+ })));
125
+ });
126
+ // POST /api/v1/projects/:id/tasks - Create project task
127
+ router.post('/api/v1/projects/:id/tasks', (_req, res, params) => {
128
+ const projectId = params.path[0];
129
+ if (!projectId) {
130
+ throw badRequest('Project ID is required');
131
+ }
132
+ const body = params.body;
133
+ if (!body?.title) {
134
+ throw badRequest('Task title is required');
135
+ }
136
+ const manager = getManager();
137
+ const project = manager.getProject(projectId);
138
+ if (!project) {
139
+ throw notFound('Project');
140
+ }
141
+ const task = manager.createProjectTask(projectId, body.title, {
142
+ description: body.description,
143
+ priority: body.priority,
144
+ assignedAgents: body.assignedAgents,
145
+ });
146
+ // Emit event for WebSocket clients
147
+ agentEvents.emit('project:task:created', {
148
+ projectId,
149
+ taskId: task.id,
150
+ title: task.title,
151
+ });
152
+ sendJson(res, {
153
+ ...task,
154
+ createdAt: task.createdAt.toISOString(),
155
+ updatedAt: task.updatedAt.toISOString(),
156
+ }, 201);
157
+ });
158
+ // GET /api/v1/projects/:id/tasks/:taskId - Get project task
159
+ router.get('/api/v1/projects/:id/tasks/:taskId', (_req, res, params) => {
160
+ const projectId = params.path[0];
161
+ const taskId = params.path[1];
162
+ if (!projectId || !taskId) {
163
+ throw badRequest('Project ID and Task ID are required');
164
+ }
165
+ const manager = getManager();
166
+ const task = manager.getProjectTask(taskId);
167
+ if (!task || task.projectId !== projectId) {
168
+ throw notFound('Project task');
169
+ }
170
+ sendJson(res, {
171
+ ...task,
172
+ createdAt: task.createdAt.toISOString(),
173
+ updatedAt: task.updatedAt.toISOString(),
174
+ completedAt: task.completedAt?.toISOString(),
175
+ });
176
+ });
177
+ // PUT /api/v1/projects/:id/tasks/:taskId - Update project task
178
+ router.put('/api/v1/projects/:id/tasks/:taskId', (_req, res, params) => {
179
+ const projectId = params.path[0];
180
+ const taskId = params.path[1];
181
+ if (!projectId || !taskId) {
182
+ throw badRequest('Project ID and Task ID are required');
183
+ }
184
+ const body = params.body;
185
+ if (!body) {
186
+ throw badRequest('Request body is required');
187
+ }
188
+ const manager = getManager();
189
+ const task = manager.getProjectTask(taskId);
190
+ if (!task || task.projectId !== projectId) {
191
+ throw notFound('Project task');
192
+ }
193
+ const success = manager.updateProjectTask(taskId, body);
194
+ if (!success) {
195
+ throw notFound('Project task');
196
+ }
197
+ const updated = manager.getProjectTask(taskId);
198
+ sendJson(res, {
199
+ ...updated,
200
+ createdAt: updated?.createdAt.toISOString(),
201
+ updatedAt: updated?.updatedAt.toISOString(),
202
+ completedAt: updated?.completedAt?.toISOString(),
203
+ });
204
+ });
205
+ // DELETE /api/v1/projects/:id/tasks/:taskId - Delete project task
206
+ router.delete('/api/v1/projects/:id/tasks/:taskId', (_req, res, params) => {
207
+ const projectId = params.path[0];
208
+ const taskId = params.path[1];
209
+ if (!projectId || !taskId) {
210
+ throw badRequest('Project ID and Task ID are required');
211
+ }
212
+ const manager = getManager();
213
+ const task = manager.getProjectTask(taskId);
214
+ if (!task || task.projectId !== projectId) {
215
+ throw notFound('Project task');
216
+ }
217
+ const success = manager.deleteProjectTask(taskId);
218
+ if (!success) {
219
+ throw notFound('Project task');
220
+ }
221
+ sendJson(res, { deleted: true });
222
+ });
223
+ // PUT /api/v1/projects/:id/tasks/:taskId/phase - Transition task phase
224
+ router.put('/api/v1/projects/:id/tasks/:taskId/phase', (_req, res, params) => {
225
+ const projectId = params.path[0];
226
+ const taskId = params.path[1];
227
+ if (!projectId || !taskId) {
228
+ throw badRequest('Project ID and Task ID are required');
229
+ }
230
+ const body = params.body;
231
+ if (!body?.phase) {
232
+ throw badRequest('Phase is required');
233
+ }
234
+ const validPhases = ['draft', 'specification', 'review', 'development', 'completed', 'cancelled'];
235
+ if (!validPhases.includes(body.phase)) {
236
+ throw badRequest(`Invalid phase. Must be one of: ${validPhases.join(', ')}`);
237
+ }
238
+ const manager = getManager();
239
+ const task = manager.getProjectTask(taskId);
240
+ if (!task || task.projectId !== projectId) {
241
+ throw notFound('Project task');
242
+ }
243
+ // Check if transition is valid
244
+ const allowedTransitions = PHASE_TRANSITIONS[task.phase];
245
+ if (!allowedTransitions.includes(body.phase)) {
246
+ throw badRequest(`Cannot transition from ${task.phase} to ${body.phase}. Allowed: ${allowedTransitions.join(', ')}`);
247
+ }
248
+ const success = manager.updateProjectTaskPhase(taskId, body.phase);
249
+ if (!success) {
250
+ throw notFound('Project task');
251
+ }
252
+ const updated = manager.getProjectTask(taskId);
253
+ // Emit event for WebSocket clients
254
+ agentEvents.emit('project:task:phase', {
255
+ projectId,
256
+ taskId,
257
+ fromPhase: task.phase,
258
+ toPhase: body.phase,
259
+ });
260
+ sendJson(res, {
261
+ ...updated,
262
+ createdAt: updated?.createdAt.toISOString(),
263
+ updatedAt: updated?.updatedAt.toISOString(),
264
+ completedAt: updated?.completedAt?.toISOString(),
265
+ });
266
+ });
267
+ // PUT /api/v1/projects/:id/tasks/:taskId/assign - Assign agents to task
268
+ router.put('/api/v1/projects/:id/tasks/:taskId/assign', (_req, res, params) => {
269
+ const projectId = params.path[0];
270
+ const taskId = params.path[1];
271
+ if (!projectId || !taskId) {
272
+ throw badRequest('Project ID and Task ID are required');
273
+ }
274
+ const body = params.body;
275
+ if (!body?.agents || !Array.isArray(body.agents)) {
276
+ throw badRequest('Agents array is required');
277
+ }
278
+ const manager = getManager();
279
+ const task = manager.getProjectTask(taskId);
280
+ if (!task || task.projectId !== projectId) {
281
+ throw notFound('Project task');
282
+ }
283
+ const success = manager.updateProjectTask(taskId, { assignedAgents: body.agents });
284
+ if (!success) {
285
+ throw notFound('Project task');
286
+ }
287
+ const updated = manager.getProjectTask(taskId);
288
+ sendJson(res, {
289
+ ...updated,
290
+ createdAt: updated?.createdAt.toISOString(),
291
+ updatedAt: updated?.updatedAt.toISOString(),
292
+ completedAt: updated?.completedAt?.toISOString(),
293
+ });
294
+ });
295
+ }
296
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../../src/web/routes/projects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Specification routes
3
+ */
4
+ import type { AgentStackConfig } from '../../types.js';
5
+ import type { Router } from '../router.js';
6
+ export declare function registerSpecificationRoutes(router: Router, config: AgentStackConfig): void;
7
+ //# sourceMappingURL=specifications.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specifications.d.ts","sourceRoot":"","sources":["../../../src/web/routes/specifications.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAyD,MAAM,gBAAgB,CAAC;AAC9G,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAY3C,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CA4T1F"}