@blackms/aistack 1.0.12 → 1.1.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 (91) hide show
  1. package/README.md +16 -0
  2. package/dist/cli/commands/index.d.ts +1 -0
  3. package/dist/cli/commands/index.d.ts.map +1 -1
  4. package/dist/cli/commands/index.js +1 -0
  5. package/dist/cli/commands/index.js.map +1 -1
  6. package/dist/cli/commands/web.d.ts +6 -0
  7. package/dist/cli/commands/web.d.ts.map +1 -0
  8. package/dist/cli/commands/web.js +79 -0
  9. package/dist/cli/commands/web.js.map +1 -0
  10. package/dist/cli/index.js +2 -1
  11. package/dist/cli/index.js.map +1 -1
  12. package/dist/index.d.ts +1 -0
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +2 -0
  15. package/dist/index.js.map +1 -1
  16. package/dist/providers/cli-providers.d.ts.map +1 -1
  17. package/dist/providers/cli-providers.js +17 -2
  18. package/dist/providers/cli-providers.js.map +1 -1
  19. package/dist/web/index.d.ts +8 -0
  20. package/dist/web/index.d.ts.map +1 -0
  21. package/dist/web/index.js +8 -0
  22. package/dist/web/index.js.map +1 -0
  23. package/dist/web/middleware/auth.d.ts +21 -0
  24. package/dist/web/middleware/auth.d.ts.map +1 -0
  25. package/dist/web/middleware/auth.js +31 -0
  26. package/dist/web/middleware/auth.js.map +1 -0
  27. package/dist/web/middleware/cors.d.ts +7 -0
  28. package/dist/web/middleware/cors.d.ts.map +1 -0
  29. package/dist/web/middleware/cors.js +28 -0
  30. package/dist/web/middleware/cors.js.map +1 -0
  31. package/dist/web/middleware/error.d.ts +16 -0
  32. package/dist/web/middleware/error.d.ts.map +1 -0
  33. package/dist/web/middleware/error.js +51 -0
  34. package/dist/web/middleware/error.js.map +1 -0
  35. package/dist/web/middleware/index.d.ts +7 -0
  36. package/dist/web/middleware/index.d.ts.map +1 -0
  37. package/dist/web/middleware/index.js +7 -0
  38. package/dist/web/middleware/index.js.map +1 -0
  39. package/dist/web/router.d.ts +40 -0
  40. package/dist/web/router.d.ts.map +1 -0
  41. package/dist/web/router.js +162 -0
  42. package/dist/web/router.js.map +1 -0
  43. package/dist/web/routes/agents.d.ts +7 -0
  44. package/dist/web/routes/agents.d.ts.map +1 -0
  45. package/dist/web/routes/agents.js +182 -0
  46. package/dist/web/routes/agents.js.map +1 -0
  47. package/dist/web/routes/index.d.ts +10 -0
  48. package/dist/web/routes/index.d.ts.map +1 -0
  49. package/dist/web/routes/index.js +10 -0
  50. package/dist/web/routes/index.js.map +1 -0
  51. package/dist/web/routes/memory.d.ts +7 -0
  52. package/dist/web/routes/memory.d.ts.map +1 -0
  53. package/dist/web/routes/memory.js +146 -0
  54. package/dist/web/routes/memory.js.map +1 -0
  55. package/dist/web/routes/sessions.d.ts +7 -0
  56. package/dist/web/routes/sessions.d.ts.map +1 -0
  57. package/dist/web/routes/sessions.js +75 -0
  58. package/dist/web/routes/sessions.js.map +1 -0
  59. package/dist/web/routes/system.d.ts +7 -0
  60. package/dist/web/routes/system.d.ts.map +1 -0
  61. package/dist/web/routes/system.js +147 -0
  62. package/dist/web/routes/system.js.map +1 -0
  63. package/dist/web/routes/tasks.d.ts +7 -0
  64. package/dist/web/routes/tasks.d.ts.map +1 -0
  65. package/dist/web/routes/tasks.js +188 -0
  66. package/dist/web/routes/tasks.js.map +1 -0
  67. package/dist/web/routes/workflows.d.ts +7 -0
  68. package/dist/web/routes/workflows.d.ts.map +1 -0
  69. package/dist/web/routes/workflows.js +132 -0
  70. package/dist/web/routes/workflows.js.map +1 -0
  71. package/dist/web/server.d.ts +49 -0
  72. package/dist/web/server.d.ts.map +1 -0
  73. package/dist/web/server.js +230 -0
  74. package/dist/web/server.js.map +1 -0
  75. package/dist/web/types.d.ts +127 -0
  76. package/dist/web/types.d.ts.map +1 -0
  77. package/dist/web/types.js +5 -0
  78. package/dist/web/types.js.map +1 -0
  79. package/dist/web/websocket/event-bridge.d.ts +78 -0
  80. package/dist/web/websocket/event-bridge.d.ts.map +1 -0
  81. package/dist/web/websocket/event-bridge.js +131 -0
  82. package/dist/web/websocket/event-bridge.js.map +1 -0
  83. package/dist/web/websocket/handler.d.ts +23 -0
  84. package/dist/web/websocket/handler.d.ts.map +1 -0
  85. package/dist/web/websocket/handler.js +282 -0
  86. package/dist/web/websocket/handler.js.map +1 -0
  87. package/dist/web/websocket/index.d.ts +6 -0
  88. package/dist/web/websocket/index.d.ts.map +1 -0
  89. package/dist/web/websocket/index.js +6 -0
  90. package/dist/web/websocket/index.js.map +1 -0
  91. package/package.json +6 -2
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Session routes
3
+ */
4
+ import { sendJson } from '../router.js';
5
+ import { badRequest, notFound } from '../middleware/error.js';
6
+ import { getMemoryManager } from '../../memory/index.js';
7
+ export function registerSessionRoutes(router, config) {
8
+ const getManager = () => getMemoryManager(config);
9
+ // GET /api/v1/sessions/active - Get active session
10
+ router.get('/api/v1/sessions/active', (_req, res) => {
11
+ const manager = getManager();
12
+ const session = manager.getActiveSession();
13
+ if (!session) {
14
+ sendJson(res, null);
15
+ return;
16
+ }
17
+ sendJson(res, {
18
+ ...session,
19
+ startedAt: session.startedAt.toISOString(),
20
+ endedAt: session.endedAt?.toISOString(),
21
+ });
22
+ });
23
+ // POST /api/v1/sessions - Create new session
24
+ router.post('/api/v1/sessions', (_req, res, params) => {
25
+ const body = params.body;
26
+ const manager = getManager();
27
+ // End any existing active session first
28
+ const activeSession = manager.getActiveSession();
29
+ if (activeSession) {
30
+ manager.endSession(activeSession.id);
31
+ }
32
+ const session = manager.createSession(body?.metadata);
33
+ sendJson(res, {
34
+ ...session,
35
+ startedAt: session.startedAt.toISOString(),
36
+ endedAt: session.endedAt?.toISOString(),
37
+ }, 201);
38
+ });
39
+ // GET /api/v1/sessions/:id - Get session by ID
40
+ router.get('/api/v1/sessions/:id', (_req, res, params) => {
41
+ const sessionId = params.path[0];
42
+ if (!sessionId) {
43
+ throw badRequest('Session ID is required');
44
+ }
45
+ const manager = getManager();
46
+ const session = manager.getSession(sessionId);
47
+ if (!session) {
48
+ throw notFound('Session');
49
+ }
50
+ sendJson(res, {
51
+ ...session,
52
+ startedAt: session.startedAt.toISOString(),
53
+ endedAt: session.endedAt?.toISOString(),
54
+ });
55
+ });
56
+ // PUT /api/v1/sessions/:id/end - End session
57
+ router.put('/api/v1/sessions/:id/end', (_req, res, params) => {
58
+ const sessionId = params.path[0];
59
+ if (!sessionId) {
60
+ throw badRequest('Session ID is required');
61
+ }
62
+ const manager = getManager();
63
+ const success = manager.endSession(sessionId);
64
+ if (!success) {
65
+ throw notFound('Session');
66
+ }
67
+ const session = manager.getSession(sessionId);
68
+ sendJson(res, {
69
+ ...session,
70
+ startedAt: session?.startedAt.toISOString(),
71
+ endedAt: session?.endedAt?.toISOString(),
72
+ });
73
+ });
74
+ }
75
+ //# sourceMappingURL=sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../../src/web/routes/sessions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * System routes
3
+ */
4
+ import type { AgentStackConfig } from '../../types.js';
5
+ import type { Router } from '../router.js';
6
+ export declare function registerSystemRoutes(router: Router, config: AgentStackConfig): void;
7
+ //# sourceMappingURL=system.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../../src/web/routes/system.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAS3C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAsJnF"}
@@ -0,0 +1,147 @@
1
+ /**
2
+ * System routes
3
+ */
4
+ import { sendJson } from '../router.js';
5
+ import { listAgents } from '../../agents/index.js';
6
+ import { getMemoryManager } from '../../memory/index.js';
7
+ // Server start time for uptime calculation
8
+ const serverStartTime = Date.now();
9
+ export function registerSystemRoutes(router, config) {
10
+ // GET /api/v1/system/status - Get system status
11
+ router.get('/api/v1/system/status', (_req, res) => {
12
+ const agents = listAgents();
13
+ const byStatus = {};
14
+ for (const agent of agents) {
15
+ byStatus[agent.status] = (byStatus[agent.status] || 0) + 1;
16
+ }
17
+ // Get task queue status (simplified)
18
+ let tasksQueued = 0;
19
+ let tasksProcessing = 0;
20
+ try {
21
+ const manager = getMemoryManager(config);
22
+ const pendingTasks = manager.listTasks(undefined, 'pending');
23
+ const runningTasks = manager.listTasks(undefined, 'running');
24
+ tasksQueued = pendingTasks.length;
25
+ tasksProcessing = runningTasks.length;
26
+ }
27
+ catch {
28
+ // Memory manager might not be initialized
29
+ }
30
+ // Get active sessions
31
+ let activeSessions = 0;
32
+ try {
33
+ const manager = getMemoryManager(config);
34
+ const activeSession = manager.getActiveSession();
35
+ activeSessions = activeSession ? 1 : 0;
36
+ }
37
+ catch {
38
+ // Memory manager might not be initialized
39
+ }
40
+ const memUsage = process.memoryUsage();
41
+ const status = {
42
+ version: '1.0.0',
43
+ uptime: Math.floor((Date.now() - serverStartTime) / 1000),
44
+ memory: {
45
+ heapUsed: memUsage.heapUsed,
46
+ heapTotal: memUsage.heapTotal,
47
+ external: memUsage.external,
48
+ },
49
+ agents: {
50
+ active: agents.length,
51
+ byStatus,
52
+ },
53
+ tasks: {
54
+ queued: tasksQueued,
55
+ processing: tasksProcessing,
56
+ },
57
+ sessions: {
58
+ active: activeSessions,
59
+ },
60
+ };
61
+ sendJson(res, status);
62
+ });
63
+ // GET /api/v1/system/health - Health check
64
+ router.get('/api/v1/system/health', (_req, res) => {
65
+ let databaseOk = false;
66
+ let memoryOk = false;
67
+ const providersOk = true; // Assume OK for now
68
+ try {
69
+ const manager = getMemoryManager(config);
70
+ // Try a simple operation
71
+ manager.count();
72
+ databaseOk = true;
73
+ memoryOk = true;
74
+ }
75
+ catch {
76
+ // Database/memory not working
77
+ }
78
+ const allOk = databaseOk && memoryOk && providersOk;
79
+ const someOk = databaseOk || memoryOk || providersOk;
80
+ const health = {
81
+ status: allOk ? 'healthy' : someOk ? 'degraded' : 'unhealthy',
82
+ checks: {
83
+ database: databaseOk,
84
+ memory: memoryOk,
85
+ providers: providersOk,
86
+ },
87
+ };
88
+ sendJson(res, health);
89
+ });
90
+ // GET /api/v1/system/config - Get current configuration (sanitized)
91
+ router.get('/api/v1/system/config', (_req, res) => {
92
+ // Return sanitized config (no API keys)
93
+ const sanitizedConfig = {
94
+ version: config.version,
95
+ memory: {
96
+ path: config.memory.path,
97
+ defaultNamespace: config.memory.defaultNamespace,
98
+ vectorSearch: {
99
+ enabled: config.memory.vectorSearch.enabled,
100
+ provider: config.memory.vectorSearch.provider,
101
+ model: config.memory.vectorSearch.model,
102
+ },
103
+ },
104
+ providers: {
105
+ default: config.providers.default,
106
+ // List configured providers without keys
107
+ configured: Object.keys(config.providers).filter(k => k !== 'default'),
108
+ },
109
+ agents: config.agents,
110
+ github: {
111
+ enabled: config.github.enabled,
112
+ useGhCli: config.github.useGhCli,
113
+ },
114
+ plugins: config.plugins,
115
+ mcp: config.mcp,
116
+ hooks: config.hooks,
117
+ };
118
+ sendJson(res, sanitizedConfig);
119
+ });
120
+ // GET /api/v1/system/metrics - Get system metrics
121
+ router.get('/api/v1/system/metrics', (_req, res) => {
122
+ const memUsage = process.memoryUsage();
123
+ const cpuUsage = process.cpuUsage();
124
+ const metrics = {
125
+ timestamp: new Date().toISOString(),
126
+ uptime: Math.floor((Date.now() - serverStartTime) / 1000),
127
+ memory: {
128
+ rss: memUsage.rss,
129
+ heapTotal: memUsage.heapTotal,
130
+ heapUsed: memUsage.heapUsed,
131
+ external: memUsage.external,
132
+ arrayBuffers: memUsage.arrayBuffers,
133
+ },
134
+ cpu: {
135
+ user: cpuUsage.user,
136
+ system: cpuUsage.system,
137
+ },
138
+ node: {
139
+ version: process.version,
140
+ platform: process.platform,
141
+ arch: process.arch,
142
+ },
143
+ };
144
+ sendJson(res, metrics);
145
+ });
146
+ }
147
+ //# sourceMappingURL=system.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system.js","sourceRoot":"","sources":["../../../src/web/routes/system.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,2CAA2C;AAC3C,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAEnC,MAAM,UAAU,oBAAoB,CAAC,MAAc,EAAE,MAAwB;IAC3E,gDAAgD;IAChD,MAAM,CAAC,GAAG,CAAC,uBAAuB,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QAChD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAA2B,EAAE,CAAC;QAE5C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC7D,CAAC;QAED,qCAAqC;QACrC,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;YACzC,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAC7D,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAC7D,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC;YAClC,eAAe,GAAG,YAAY,CAAC,MAAM,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,0CAA0C;QAC5C,CAAC;QAED,sBAAsB;QACtB,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;YACzC,MAAM,aAAa,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;YACjD,cAAc,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,0CAA0C;QAC5C,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAEvC,MAAM,MAAM,GAAiB;YAC3B,OAAO,EAAE,OAAO;YAChB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,CAAC,GAAG,IAAI,CAAC;YACzD,MAAM,EAAE;gBACN,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;aAC5B;YACD,MAAM,EAAE;gBACN,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,QAAQ;aACT;YACD,KAAK,EAAE;gBACL,MAAM,EAAE,WAAW;gBACnB,UAAU,EAAE,eAAe;aAC5B;YACD,QAAQ,EAAE;gBACR,MAAM,EAAE,cAAc;aACvB;SACF,CAAC;QAEF,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,2CAA2C;IAC3C,MAAM,CAAC,GAAG,CAAC,uBAAuB,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QAChD,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,oBAAoB;QAE9C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;YACzC,yBAAyB;YACzB,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,UAAU,GAAG,IAAI,CAAC;YAClB,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,8BAA8B;QAChC,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,IAAI,QAAQ,IAAI,WAAW,CAAC;QACpD,MAAM,MAAM,GAAG,UAAU,IAAI,QAAQ,IAAI,WAAW,CAAC;QAErD,MAAM,MAAM,GAAgB;YAC1B,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW;YAC7D,MAAM,EAAE;gBACN,QAAQ,EAAE,UAAU;gBACpB,MAAM,EAAE,QAAQ;gBAChB,SAAS,EAAE,WAAW;aACvB;SACF,CAAC;QAEF,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,oEAAoE;IACpE,MAAM,CAAC,GAAG,CAAC,uBAAuB,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QAChD,wCAAwC;QACxC,MAAM,eAAe,GAAG;YACtB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE;gBACN,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI;gBACxB,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,gBAAgB;gBAChD,YAAY,EAAE;oBACZ,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO;oBAC3C,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ;oBAC7C,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK;iBACxC;aACF;YACD,SAAS,EAAE;gBACT,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO;gBACjC,yCAAyC;gBACzC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC;aACvE;YACD,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE;gBACN,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO;gBAC9B,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ;aACjC;YACD,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAC;QAEF,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,kDAAkD;IAClD,MAAM,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;QAEpC,MAAM,OAAO,GAAG;YACd,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,CAAC,GAAG,IAAI,CAAC;YACzD,MAAM,EAAE;gBACN,GAAG,EAAE,QAAQ,CAAC,GAAG;gBACjB,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,YAAY,EAAE,QAAQ,CAAC,YAAY;aACpC;YACD,GAAG,EAAE;gBACH,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,MAAM,EAAE,QAAQ,CAAC,MAAM;aACxB;YACD,IAAI,EAAE;gBACJ,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;aACnB;SACF,CAAC;QAEF,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Task routes
3
+ */
4
+ import type { AgentStackConfig } from '../../types.js';
5
+ import type { Router } from '../router.js';
6
+ export declare function registerTaskRoutes(router: Router, config: AgentStackConfig): void;
7
+ //# sourceMappingURL=tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../../src/web/routes/tasks.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAoC3C,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CA+LjF"}
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Task routes
3
+ */
4
+ import { sendJson, sendPaginated } from '../router.js';
5
+ import { badRequest, notFound } from '../middleware/error.js';
6
+ import { getMemoryManager } from '../../memory/index.js';
7
+ import { TaskQueue } from '../../coordination/task-queue.js';
8
+ import { agentEvents } from '../websocket/event-bridge.js';
9
+ // Global task queue instance
10
+ let taskQueue = null;
11
+ function getTaskQueue() {
12
+ if (!taskQueue) {
13
+ taskQueue = new TaskQueue();
14
+ // Wire up events to WebSocket
15
+ taskQueue.on('task:added', (queuedTask) => {
16
+ agentEvents.emit('task:created', { task: queuedTask.task });
17
+ });
18
+ taskQueue.on('task:assigned', (queuedTask, agentId) => {
19
+ agentEvents.emit('task:assigned', {
20
+ taskId: queuedTask.task.id,
21
+ agentId,
22
+ });
23
+ });
24
+ taskQueue.on('task:completed', (queuedTask) => {
25
+ agentEvents.emit('task:completed', {
26
+ taskId: queuedTask.task.id,
27
+ });
28
+ });
29
+ }
30
+ return taskQueue;
31
+ }
32
+ export function registerTaskRoutes(router, config) {
33
+ const getManager = () => getMemoryManager(config);
34
+ // GET /api/v1/tasks - List tasks
35
+ router.get('/api/v1/tasks', (_req, res, params) => {
36
+ const sessionId = params.query.sessionId;
37
+ const status = params.query.status;
38
+ const limit = parseInt(params.query.limit || '50', 10);
39
+ const offset = parseInt(params.query.offset || '0', 10);
40
+ const manager = getManager();
41
+ const allTasks = manager.listTasks(sessionId, status);
42
+ const tasks = allTasks.slice(offset, offset + limit);
43
+ sendPaginated(res, tasks.map(task => ({
44
+ ...task,
45
+ createdAt: task.createdAt.toISOString(),
46
+ completedAt: task.completedAt?.toISOString(),
47
+ })), { limit, offset, total: allTasks.length });
48
+ });
49
+ // POST /api/v1/tasks - Create task
50
+ router.post('/api/v1/tasks', (_req, res, params) => {
51
+ const body = params.body;
52
+ if (!body?.agentType) {
53
+ throw badRequest('Agent type is required');
54
+ }
55
+ const manager = getManager();
56
+ const task = manager.createTask(body.agentType, body.input, body.sessionId);
57
+ // Add to queue if priority is specified
58
+ if (body.priority !== undefined) {
59
+ const queue = getTaskQueue();
60
+ queue.enqueue(task, body.priority);
61
+ }
62
+ sendJson(res, {
63
+ ...task,
64
+ createdAt: task.createdAt.toISOString(),
65
+ completedAt: task.completedAt?.toISOString(),
66
+ }, 201);
67
+ });
68
+ // GET /api/v1/tasks/queue - Get queue status
69
+ router.get('/api/v1/tasks/queue', (_req, res) => {
70
+ const queue = getTaskQueue();
71
+ const status = queue.getStatus();
72
+ const pending = queue.peek(10);
73
+ const processing = queue.getProcessing();
74
+ sendJson(res, {
75
+ status,
76
+ pending: pending.map(qt => ({
77
+ task: {
78
+ ...qt.task,
79
+ createdAt: qt.task.createdAt.toISOString(),
80
+ completedAt: qt.task.completedAt?.toISOString(),
81
+ },
82
+ priority: qt.priority,
83
+ addedAt: qt.addedAt.toISOString(),
84
+ assignedTo: qt.assignedTo,
85
+ })),
86
+ processing: processing.map(qt => ({
87
+ task: {
88
+ ...qt.task,
89
+ createdAt: qt.task.createdAt.toISOString(),
90
+ completedAt: qt.task.completedAt?.toISOString(),
91
+ },
92
+ priority: qt.priority,
93
+ addedAt: qt.addedAt.toISOString(),
94
+ assignedTo: qt.assignedTo,
95
+ })),
96
+ });
97
+ });
98
+ // GET /api/v1/tasks/:id - Get task by ID
99
+ router.get('/api/v1/tasks/:id', (_req, res, params) => {
100
+ const taskId = params.path[0];
101
+ if (!taskId) {
102
+ throw badRequest('Task ID is required');
103
+ }
104
+ const manager = getManager();
105
+ const task = manager.getTask(taskId);
106
+ if (!task) {
107
+ throw notFound('Task');
108
+ }
109
+ sendJson(res, {
110
+ ...task,
111
+ createdAt: task.createdAt.toISOString(),
112
+ completedAt: task.completedAt?.toISOString(),
113
+ });
114
+ });
115
+ // PUT /api/v1/tasks/:id/assign - Assign task to agent
116
+ router.put('/api/v1/tasks/:id/assign', (_req, res, params) => {
117
+ const taskId = params.path[0];
118
+ if (!taskId) {
119
+ throw badRequest('Task ID is required');
120
+ }
121
+ const body = params.body;
122
+ if (!body?.agentId) {
123
+ throw badRequest('Agent ID is required');
124
+ }
125
+ const queue = getTaskQueue();
126
+ const success = queue.assign(taskId, body.agentId);
127
+ if (!success) {
128
+ throw notFound('Task in queue');
129
+ }
130
+ const manager = getManager();
131
+ manager.updateTaskStatus(taskId, 'running');
132
+ const task = manager.getTask(taskId);
133
+ sendJson(res, {
134
+ ...task,
135
+ createdAt: task?.createdAt.toISOString(),
136
+ completedAt: task?.completedAt?.toISOString(),
137
+ assignedTo: body.agentId,
138
+ });
139
+ });
140
+ // PUT /api/v1/tasks/:id/complete - Complete task
141
+ router.put('/api/v1/tasks/:id/complete', (_req, res, params) => {
142
+ const taskId = params.path[0];
143
+ if (!taskId) {
144
+ throw badRequest('Task ID is required');
145
+ }
146
+ const body = params.body;
147
+ const manager = getManager();
148
+ const success = manager.updateTaskStatus(taskId, 'completed', body?.output);
149
+ if (!success) {
150
+ throw notFound('Task');
151
+ }
152
+ // Remove from queue
153
+ const queue = getTaskQueue();
154
+ queue.complete(taskId);
155
+ const task = manager.getTask(taskId);
156
+ sendJson(res, {
157
+ ...task,
158
+ createdAt: task?.createdAt.toISOString(),
159
+ completedAt: task?.completedAt?.toISOString(),
160
+ });
161
+ });
162
+ // PUT /api/v1/tasks/:id/fail - Mark task as failed
163
+ router.put('/api/v1/tasks/:id/fail', (_req, res, params) => {
164
+ const taskId = params.path[0];
165
+ if (!taskId) {
166
+ throw badRequest('Task ID is required');
167
+ }
168
+ const body = params.body;
169
+ const manager = getManager();
170
+ const success = manager.updateTaskStatus(taskId, 'failed', body?.error);
171
+ if (!success) {
172
+ throw notFound('Task');
173
+ }
174
+ // Requeue if desired
175
+ const requeue = params.query.requeue === 'true';
176
+ if (requeue) {
177
+ const queue = getTaskQueue();
178
+ queue.requeue(taskId);
179
+ }
180
+ const task = manager.getTask(taskId);
181
+ sendJson(res, {
182
+ ...task,
183
+ createdAt: task?.createdAt.toISOString(),
184
+ completedAt: task?.completedAt?.toISOString(),
185
+ });
186
+ });
187
+ }
188
+ //# sourceMappingURL=tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../../src/web/routes/tasks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Workflow routes
3
+ */
4
+ import type { AgentStackConfig } from '../../types.js';
5
+ import type { Router } from '../router.js';
6
+ export declare function registerWorkflowRoutes(router: Router, _config: AgentStackConfig): void;
7
+ //# sourceMappingURL=workflows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflows.d.ts","sourceRoot":"","sources":["../../../src/web/routes/workflows.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAgB3C,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI,CA8ItF"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Workflow routes
3
+ */
4
+ import { sendJson } from '../router.js';
5
+ import { badRequest, notFound } from '../middleware/error.js';
6
+ import { getWorkflowRunner, docSyncConfig } from '../../workflows/index.js';
7
+ import { agentEvents } from '../websocket/event-bridge.js';
8
+ // Track running workflows
9
+ const runningWorkflows = new Map();
10
+ export function registerWorkflowRoutes(router, _config) {
11
+ // GET /api/v1/workflows - List available workflows
12
+ router.get('/api/v1/workflows', (_req, res) => {
13
+ // List built-in workflows
14
+ const workflows = [
15
+ {
16
+ id: 'doc-sync',
17
+ name: 'Documentation Sync',
18
+ description: 'Synchronize documentation with codebase implementation',
19
+ phases: docSyncConfig.phases,
20
+ },
21
+ ];
22
+ sendJson(res, workflows);
23
+ });
24
+ // POST /api/v1/workflows - Launch workflow
25
+ router.post('/api/v1/workflows', async (_req, res, params) => {
26
+ const body = params.body;
27
+ if (!body?.workflow) {
28
+ throw badRequest('Workflow name is required');
29
+ }
30
+ const runner = getWorkflowRunner();
31
+ // Prepare workflow config based on name
32
+ let workflowConfig;
33
+ switch (body.workflow) {
34
+ case 'doc-sync':
35
+ workflowConfig = {
36
+ ...docSyncConfig,
37
+ ...body.config,
38
+ };
39
+ break;
40
+ default:
41
+ throw badRequest(`Unknown workflow: ${body.workflow}`);
42
+ }
43
+ const workflowId = `wf-${Date.now()}`;
44
+ // Track the workflow
45
+ runningWorkflows.set(workflowId, {
46
+ id: workflowId,
47
+ workflow: body.workflow,
48
+ startedAt: new Date(),
49
+ status: 'running',
50
+ });
51
+ // Emit start event
52
+ agentEvents.emit('workflow:start', {
53
+ workflowId,
54
+ config: workflowConfig,
55
+ });
56
+ // Wire up event handlers
57
+ runner.on('phase:start', (phase) => {
58
+ agentEvents.emit('workflow:phase', {
59
+ workflowId,
60
+ phase,
61
+ status: 'started',
62
+ });
63
+ });
64
+ runner.on('phase:complete', (result) => {
65
+ agentEvents.emit('workflow:phase', {
66
+ workflowId,
67
+ phase: result.phase,
68
+ status: 'completed',
69
+ });
70
+ });
71
+ runner.on('finding', (finding) => {
72
+ agentEvents.emit('workflow:finding', {
73
+ workflowId,
74
+ finding,
75
+ });
76
+ });
77
+ // Run workflow asynchronously
78
+ runner.run(workflowConfig)
79
+ .then((report) => {
80
+ const workflow = runningWorkflows.get(workflowId);
81
+ if (workflow) {
82
+ workflow.status = 'completed';
83
+ workflow.report = report;
84
+ }
85
+ agentEvents.emit('workflow:complete', {
86
+ workflowId,
87
+ report,
88
+ });
89
+ })
90
+ .catch((error) => {
91
+ const workflow = runningWorkflows.get(workflowId);
92
+ if (workflow) {
93
+ workflow.status = 'failed';
94
+ workflow.report = { error: error instanceof Error ? error.message : 'Unknown error' };
95
+ }
96
+ agentEvents.emit('workflow:error', {
97
+ workflowId,
98
+ error: error instanceof Error ? error.message : 'Unknown error',
99
+ });
100
+ });
101
+ sendJson(res, {
102
+ workflowId,
103
+ workflow: body.workflow,
104
+ status: 'running',
105
+ startedAt: new Date().toISOString(),
106
+ }, 202);
107
+ });
108
+ // GET /api/v1/workflows/running - List running workflows
109
+ router.get('/api/v1/workflows/running', (_req, res) => {
110
+ const workflows = Array.from(runningWorkflows.values()).map(w => ({
111
+ ...w,
112
+ startedAt: w.startedAt.toISOString(),
113
+ }));
114
+ sendJson(res, workflows);
115
+ });
116
+ // GET /api/v1/workflows/:id - Get workflow status/report
117
+ router.get('/api/v1/workflows/:id', (_req, res, params) => {
118
+ const workflowId = params.path[0];
119
+ if (!workflowId) {
120
+ throw badRequest('Workflow ID is required');
121
+ }
122
+ const workflow = runningWorkflows.get(workflowId);
123
+ if (!workflow) {
124
+ throw notFound('Workflow');
125
+ }
126
+ sendJson(res, {
127
+ ...workflow,
128
+ startedAt: workflow.startedAt.toISOString(),
129
+ });
130
+ });
131
+ }
132
+ //# sourceMappingURL=workflows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../../src/web/routes/workflows.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAA2C,MAAM,0BAA0B,CAAC;AACrH,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAG3D,0BAA0B;AAC1B,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAM5B,CAAC;AAEL,MAAM,UAAU,sBAAsB,CAAC,MAAc,EAAE,OAAyB;IAC9E,mDAAmD;IACnD,MAAM,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QAC5C,0BAA0B;QAC1B,MAAM,SAAS,GAAG;YAChB;gBACE,EAAE,EAAE,UAAU;gBACd,IAAI,EAAE,oBAAoB;gBAC1B,WAAW,EAAE,wDAAwD;gBACrE,MAAM,EAAE,aAAa,CAAC,MAAM;aAC7B;SACF,CAAC;QAEF,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,2CAA2C;IAC3C,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;QAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAyC,CAAC;QAE9D,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;YACpB,MAAM,UAAU,CAAC,2BAA2B,CAAC,CAAC;QAChD,CAAC;QAED,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;QAEnC,wCAAwC;QACxC,IAAI,cAA8B,CAAC;QAEnC,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtB,KAAK,UAAU;gBACb,cAAc,GAAG;oBACf,GAAG,aAAa;oBAChB,GAAG,IAAI,CAAC,MAAM;iBACG,CAAC;gBACpB,MAAM;YACR;gBACE,MAAM,UAAU,CAAC,qBAAqB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAEtC,qBAAqB;QACrB,gBAAgB,CAAC,GAAG,CAAC,UAAU,EAAE;YAC/B,EAAE,EAAE,UAAU;YACd,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC;QAEH,mBAAmB;QACnB,WAAW,CAAC,IAAI,CAAC,gBAAgB,EAAE;YACjC,UAAU;YACV,MAAM,EAAE,cAAc;SACvB,CAAC,CAAC;QAEH,yBAAyB;QACzB,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,KAAoB,EAAE,EAAE;YAChD,WAAW,CAAC,IAAI,CAAC,gBAAgB,EAAE;gBACjC,UAAU;gBACV,KAAK;gBACL,MAAM,EAAE,SAAS;aAClB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,MAAM,EAAE,EAAE;YACrC,WAAW,CAAC,IAAI,CAAC,gBAAgB,EAAE;gBACjC,UAAU;gBACV,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,MAAM,EAAE,WAAW;aACpB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE;YAC/B,WAAW,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBACnC,UAAU;gBACV,OAAO;aACR,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,8BAA8B;QAC9B,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC;aACvB,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACf,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAClD,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,MAAM,GAAG,WAAW,CAAC;gBAC9B,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC;YAC3B,CAAC;YAED,WAAW,CAAC,IAAI,CAAC,mBAAmB,EAAE;gBACpC,UAAU;gBACV,MAAM;aACP,CAAC,CAAC;QACL,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACf,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAClD,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC;gBAC3B,QAAQ,CAAC,MAAM,GAAG,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;YACxF,CAAC;YAED,WAAW,CAAC,IAAI,CAAC,gBAAgB,EAAE;gBACjC,UAAU;gBACV,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;aAChE,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEL,QAAQ,CAAC,GAAG,EAAE;YACZ,UAAU;YACV,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC,CAAC,CAAC;IAEH,yDAAyD;IACzD,MAAM,CAAC,GAAG,CAAC,2BAA2B,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACpD,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAChE,GAAG,CAAC;YACJ,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE;SACrC,CAAC,CAAC,CAAC;QAEJ,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,yDAAyD;IACzD,MAAM,CAAC,GAAG,CAAC,uBAAuB,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;QACxD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,UAAU,CAAC,yBAAyB,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC7B,CAAC;QAED,QAAQ,CAAC,GAAG,EAAE;YACZ,GAAG,QAAQ;YACX,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE;SAC5C,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}