@blackms/aistack 1.0.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.
- package/README.md +244 -0
- package/dist/agents/definitions/analyst.d.ts +6 -0
- package/dist/agents/definitions/analyst.d.ts.map +1 -0
- package/dist/agents/definitions/analyst.js +53 -0
- package/dist/agents/definitions/analyst.js.map +1 -0
- package/dist/agents/definitions/architect.d.ts +6 -0
- package/dist/agents/definitions/architect.d.ts.map +1 -0
- package/dist/agents/definitions/architect.js +46 -0
- package/dist/agents/definitions/architect.js.map +1 -0
- package/dist/agents/definitions/coder.d.ts +6 -0
- package/dist/agents/definitions/coder.d.ts.map +1 -0
- package/dist/agents/definitions/coder.js +39 -0
- package/dist/agents/definitions/coder.js.map +1 -0
- package/dist/agents/definitions/coordinator.d.ts +6 -0
- package/dist/agents/definitions/coordinator.d.ts.map +1 -0
- package/dist/agents/definitions/coordinator.js +54 -0
- package/dist/agents/definitions/coordinator.js.map +1 -0
- package/dist/agents/definitions/index.d.ts +11 -0
- package/dist/agents/definitions/index.d.ts.map +1 -0
- package/dist/agents/definitions/index.js +11 -0
- package/dist/agents/definitions/index.js.map +1 -0
- package/dist/agents/definitions/researcher.d.ts +6 -0
- package/dist/agents/definitions/researcher.d.ts.map +1 -0
- package/dist/agents/definitions/researcher.js +39 -0
- package/dist/agents/definitions/researcher.js.map +1 -0
- package/dist/agents/definitions/reviewer.d.ts +6 -0
- package/dist/agents/definitions/reviewer.d.ts.map +1 -0
- package/dist/agents/definitions/reviewer.js +46 -0
- package/dist/agents/definitions/reviewer.js.map +1 -0
- package/dist/agents/definitions/tester.d.ts +6 -0
- package/dist/agents/definitions/tester.d.ts.map +1 -0
- package/dist/agents/definitions/tester.js +44 -0
- package/dist/agents/definitions/tester.js.map +1 -0
- package/dist/agents/index.d.ts +7 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +7 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/registry.d.ts +41 -0
- package/dist/agents/registry.d.ts.map +1 -0
- package/dist/agents/registry.js +107 -0
- package/dist/agents/registry.js.map +1 -0
- package/dist/agents/spawner.d.ts +62 -0
- package/dist/agents/spawner.d.ts.map +1 -0
- package/dist/agents/spawner.js +169 -0
- package/dist/agents/spawner.js.map +1 -0
- package/dist/cli/commands/agent.d.ts +6 -0
- package/dist/cli/commands/agent.d.ts.map +1 -0
- package/dist/cli/commands/agent.js +144 -0
- package/dist/cli/commands/agent.js.map +1 -0
- package/dist/cli/commands/index.d.ts +10 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +10 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/init.d.ts +6 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +50 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +6 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -0
- package/dist/cli/commands/mcp.js +82 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/memory.d.ts +6 -0
- package/dist/cli/commands/memory.d.ts.map +1 -0
- package/dist/cli/commands/memory.js +157 -0
- package/dist/cli/commands/memory.js.map +1 -0
- package/dist/cli/commands/plugin.d.ts +6 -0
- package/dist/cli/commands/plugin.d.ts.map +1 -0
- package/dist/cli/commands/plugin.js +146 -0
- package/dist/cli/commands/plugin.js.map +1 -0
- package/dist/cli/commands/status.d.ts +6 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +115 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +41 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/coordination/index.d.ts +7 -0
- package/dist/coordination/index.d.ts.map +1 -0
- package/dist/coordination/index.js +7 -0
- package/dist/coordination/index.js.map +1 -0
- package/dist/coordination/message-bus.d.ts +64 -0
- package/dist/coordination/message-bus.d.ts.map +1 -0
- package/dist/coordination/message-bus.js +148 -0
- package/dist/coordination/message-bus.js.map +1 -0
- package/dist/coordination/task-queue.d.ts +71 -0
- package/dist/coordination/task-queue.d.ts.map +1 -0
- package/dist/coordination/task-queue.js +140 -0
- package/dist/coordination/task-queue.js.map +1 -0
- package/dist/coordination/topology.d.ts +68 -0
- package/dist/coordination/topology.d.ts.map +1 -0
- package/dist/coordination/topology.js +195 -0
- package/dist/coordination/topology.js.map +1 -0
- package/dist/github/client.d.ts +56 -0
- package/dist/github/client.d.ts.map +1 -0
- package/dist/github/client.js +179 -0
- package/dist/github/client.js.map +1 -0
- package/dist/github/index.d.ts +5 -0
- package/dist/github/index.d.ts.map +1 -0
- package/dist/github/index.js +5 -0
- package/dist/github/index.js.map +1 -0
- package/dist/hooks/index.d.ts +29 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +112 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/session.d.ts +16 -0
- package/dist/hooks/session.d.ts.map +1 -0
- package/dist/hooks/session.js +60 -0
- package/dist/hooks/session.js.map +1 -0
- package/dist/hooks/task.d.ts +16 -0
- package/dist/hooks/task.d.ts.map +1 -0
- package/dist/hooks/task.js +82 -0
- package/dist/hooks/task.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/index.d.ts +6 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +6 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +22 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +128 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/agent-tools.d.ts +174 -0
- package/dist/mcp/tools/agent-tools.d.ts.map +1 -0
- package/dist/mcp/tools/agent-tools.js +214 -0
- package/dist/mcp/tools/agent-tools.js.map +1 -0
- package/dist/mcp/tools/github-tools.d.ts +229 -0
- package/dist/mcp/tools/github-tools.d.ts.map +1 -0
- package/dist/mcp/tools/github-tools.js +286 -0
- package/dist/mcp/tools/github-tools.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +10 -0
- package/dist/mcp/tools/index.d.ts.map +1 -0
- package/dist/mcp/tools/index.js +10 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/memory-tools.d.ts +190 -0
- package/dist/mcp/tools/memory-tools.d.ts.map +1 -0
- package/dist/mcp/tools/memory-tools.js +207 -0
- package/dist/mcp/tools/memory-tools.js.map +1 -0
- package/dist/mcp/tools/session-tools.d.ts +116 -0
- package/dist/mcp/tools/session-tools.d.ts.map +1 -0
- package/dist/mcp/tools/session-tools.js +151 -0
- package/dist/mcp/tools/session-tools.js.map +1 -0
- package/dist/mcp/tools/system-tools.d.ts +98 -0
- package/dist/mcp/tools/system-tools.d.ts.map +1 -0
- package/dist/mcp/tools/system-tools.js +165 -0
- package/dist/mcp/tools/system-tools.js.map +1 -0
- package/dist/mcp/tools/task-tools.d.ts +170 -0
- package/dist/mcp/tools/task-tools.d.ts.map +1 -0
- package/dist/mcp/tools/task-tools.js +188 -0
- package/dist/mcp/tools/task-tools.js.map +1 -0
- package/dist/memory/fts-search.d.ts +46 -0
- package/dist/memory/fts-search.d.ts.map +1 -0
- package/dist/memory/fts-search.js +136 -0
- package/dist/memory/fts-search.js.map +1 -0
- package/dist/memory/index.d.ts +77 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +203 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/sqlite-store.d.ts +36 -0
- package/dist/memory/sqlite-store.d.ts.map +1 -0
- package/dist/memory/sqlite-store.js +371 -0
- package/dist/memory/sqlite-store.js.map +1 -0
- package/dist/memory/vector-search.d.ts +43 -0
- package/dist/memory/vector-search.d.ts.map +1 -0
- package/dist/memory/vector-search.js +179 -0
- package/dist/memory/vector-search.js.map +1 -0
- package/dist/plugins/index.d.ts +7 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +7 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/loader.d.ts +33 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +147 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/registry.d.ts +48 -0
- package/dist/plugins/registry.d.ts.map +1 -0
- package/dist/plugins/registry.js +72 -0
- package/dist/plugins/registry.js.map +1 -0
- package/dist/plugins/types.d.ts +5 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +5 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/providers/index.d.ts +49 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +254 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/types.d.ts +189 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/config.d.ts +32 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +194 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/embeddings.d.ts +23 -0
- package/dist/utils/embeddings.d.ts.map +1 -0
- package/dist/utils/embeddings.js +151 -0
- package/dist/utils/embeddings.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +24 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +96 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/validation.d.ts +264 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +144 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Topology - hierarchical coordinator pattern
|
|
3
|
+
*/
|
|
4
|
+
import type { SpawnedAgent, Task } from '../types.js';
|
|
5
|
+
export interface CoordinatorOptions {
|
|
6
|
+
maxWorkers?: number;
|
|
7
|
+
sessionId?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Hierarchical coordinator - one coordinator managing multiple workers
|
|
11
|
+
*/
|
|
12
|
+
export declare class HierarchicalCoordinator {
|
|
13
|
+
private coordinator;
|
|
14
|
+
private workers;
|
|
15
|
+
private taskQueue;
|
|
16
|
+
private maxWorkers;
|
|
17
|
+
private sessionId?;
|
|
18
|
+
private unsubscribe?;
|
|
19
|
+
constructor(options?: CoordinatorOptions);
|
|
20
|
+
/**
|
|
21
|
+
* Initialize the coordinator
|
|
22
|
+
*/
|
|
23
|
+
initialize(): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Handle incoming messages
|
|
26
|
+
*/
|
|
27
|
+
private handleMessage;
|
|
28
|
+
/**
|
|
29
|
+
* Submit a task for coordination
|
|
30
|
+
*/
|
|
31
|
+
submitTask(task: Task, priority?: number): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Try to assign pending tasks to available workers
|
|
34
|
+
*/
|
|
35
|
+
private assignPendingTasks;
|
|
36
|
+
/**
|
|
37
|
+
* Get an available worker or spawn a new one
|
|
38
|
+
*/
|
|
39
|
+
private getAvailableWorker;
|
|
40
|
+
/**
|
|
41
|
+
* Handle task completion
|
|
42
|
+
*/
|
|
43
|
+
private handleTaskCompleted;
|
|
44
|
+
/**
|
|
45
|
+
* Handle task failure
|
|
46
|
+
*/
|
|
47
|
+
private handleTaskFailed;
|
|
48
|
+
/**
|
|
49
|
+
* Handle worker ready notification
|
|
50
|
+
*/
|
|
51
|
+
private handleWorkerReady;
|
|
52
|
+
/**
|
|
53
|
+
* Get status of the coordination
|
|
54
|
+
*/
|
|
55
|
+
getStatus(): {
|
|
56
|
+
coordinator: SpawnedAgent | null;
|
|
57
|
+
workers: SpawnedAgent[];
|
|
58
|
+
queue: {
|
|
59
|
+
queued: number;
|
|
60
|
+
processing: number;
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Shutdown the coordinator
|
|
65
|
+
*/
|
|
66
|
+
shutdown(): Promise<void>;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=topology.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"topology.d.ts","sourceRoot":"","sources":["../../src/coordination/topology.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAQtD,MAAM,WAAW,kBAAkB;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,OAAO,CAAwC;IACvD,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAC,CAAa;gBAErB,OAAO,GAAE,kBAAuB;IAM5C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBjC;;OAEG;IACH,OAAO,CAAC,aAAa;IAmBrB;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,GAAE,MAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjE;;OAEG;YACW,kBAAkB;IAgChC;;OAEG;YACW,kBAAkB;IA2BhC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAc3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAgBxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;OAEG;IACH,SAAS,IAAI;QACX,WAAW,EAAE,YAAY,GAAG,IAAI,CAAC;QACjC,OAAO,EAAE,YAAY,EAAE,CAAC;QACxB,KAAK,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAA;SAAE,CAAC;KAC/C;IAQD;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAuBhC"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Topology - hierarchical coordinator pattern
|
|
3
|
+
*/
|
|
4
|
+
import { spawnAgent, updateAgentStatus, stopAgent } from '../agents/spawner.js';
|
|
5
|
+
import { TaskQueue } from './task-queue.js';
|
|
6
|
+
import { getMessageBus } from './message-bus.js';
|
|
7
|
+
import { logger } from '../utils/logger.js';
|
|
8
|
+
const log = logger.child('topology');
|
|
9
|
+
/**
|
|
10
|
+
* Hierarchical coordinator - one coordinator managing multiple workers
|
|
11
|
+
*/
|
|
12
|
+
export class HierarchicalCoordinator {
|
|
13
|
+
coordinator = null;
|
|
14
|
+
workers = new Map();
|
|
15
|
+
taskQueue;
|
|
16
|
+
maxWorkers;
|
|
17
|
+
sessionId;
|
|
18
|
+
unsubscribe;
|
|
19
|
+
constructor(options = {}) {
|
|
20
|
+
this.maxWorkers = options.maxWorkers ?? 5;
|
|
21
|
+
this.sessionId = options.sessionId;
|
|
22
|
+
this.taskQueue = new TaskQueue();
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Initialize the coordinator
|
|
26
|
+
*/
|
|
27
|
+
async initialize() {
|
|
28
|
+
// Spawn coordinator agent
|
|
29
|
+
this.coordinator = spawnAgent('coordinator', {
|
|
30
|
+
name: 'main-coordinator',
|
|
31
|
+
sessionId: this.sessionId,
|
|
32
|
+
});
|
|
33
|
+
updateAgentStatus(this.coordinator.id, 'running');
|
|
34
|
+
// Subscribe to messages
|
|
35
|
+
const bus = getMessageBus();
|
|
36
|
+
this.unsubscribe = bus.subscribe(this.coordinator.id, this.handleMessage.bind(this));
|
|
37
|
+
// Set up task queue events
|
|
38
|
+
this.taskQueue.on('task:added', () => this.assignPendingTasks());
|
|
39
|
+
log.info('Coordinator initialized', { id: this.coordinator.id });
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Handle incoming messages
|
|
43
|
+
*/
|
|
44
|
+
handleMessage(message) {
|
|
45
|
+
log.debug('Coordinator received message', {
|
|
46
|
+
type: message.type,
|
|
47
|
+
from: message.from,
|
|
48
|
+
});
|
|
49
|
+
switch (message.type) {
|
|
50
|
+
case 'task:completed':
|
|
51
|
+
this.handleTaskCompleted(message);
|
|
52
|
+
break;
|
|
53
|
+
case 'task:failed':
|
|
54
|
+
this.handleTaskFailed(message);
|
|
55
|
+
break;
|
|
56
|
+
case 'worker:ready':
|
|
57
|
+
this.handleWorkerReady(message);
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Submit a task for coordination
|
|
63
|
+
*/
|
|
64
|
+
async submitTask(task, priority = 5) {
|
|
65
|
+
this.taskQueue.enqueue(task, priority);
|
|
66
|
+
log.debug('Task submitted', { taskId: task.id, priority });
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Try to assign pending tasks to available workers
|
|
70
|
+
*/
|
|
71
|
+
async assignPendingTasks() {
|
|
72
|
+
while (!this.taskQueue.isEmpty) {
|
|
73
|
+
// Find available worker or spawn new one
|
|
74
|
+
const worker = await this.getAvailableWorker();
|
|
75
|
+
if (!worker) {
|
|
76
|
+
log.debug('No available workers, waiting');
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
// Get next task
|
|
80
|
+
const queuedTask = this.taskQueue.dequeue(worker.type);
|
|
81
|
+
if (!queuedTask) {
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
// Assign task to worker
|
|
85
|
+
this.taskQueue.assign(queuedTask.task.id, worker.id);
|
|
86
|
+
updateAgentStatus(worker.id, 'running');
|
|
87
|
+
// Send task to worker via message bus
|
|
88
|
+
const bus = getMessageBus();
|
|
89
|
+
bus.send(this.coordinator.id, worker.id, 'task:assign', {
|
|
90
|
+
task: queuedTask.task,
|
|
91
|
+
});
|
|
92
|
+
log.debug('Task assigned to worker', {
|
|
93
|
+
taskId: queuedTask.task.id,
|
|
94
|
+
workerId: worker.id,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Get an available worker or spawn a new one
|
|
100
|
+
*/
|
|
101
|
+
async getAvailableWorker() {
|
|
102
|
+
// Find idle worker
|
|
103
|
+
for (const worker of this.workers.values()) {
|
|
104
|
+
if (worker.status === 'idle') {
|
|
105
|
+
return worker;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Spawn new worker if under limit
|
|
109
|
+
if (this.workers.size < this.maxWorkers) {
|
|
110
|
+
// Get next task type from queue to spawn appropriate worker
|
|
111
|
+
const nextTask = this.taskQueue.peek(1)[0];
|
|
112
|
+
if (!nextTask)
|
|
113
|
+
return null;
|
|
114
|
+
const worker = spawnAgent(nextTask.task.agentType, {
|
|
115
|
+
sessionId: this.sessionId,
|
|
116
|
+
});
|
|
117
|
+
this.workers.set(worker.id, worker);
|
|
118
|
+
log.info('Spawned new worker', { id: worker.id, type: worker.type });
|
|
119
|
+
return worker;
|
|
120
|
+
}
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Handle task completion
|
|
125
|
+
*/
|
|
126
|
+
handleTaskCompleted(message) {
|
|
127
|
+
const { taskId } = message.payload;
|
|
128
|
+
this.taskQueue.complete(taskId);
|
|
129
|
+
// Mark worker as idle
|
|
130
|
+
const worker = this.workers.get(message.from);
|
|
131
|
+
if (worker) {
|
|
132
|
+
updateAgentStatus(worker.id, 'idle');
|
|
133
|
+
}
|
|
134
|
+
// Try to assign more tasks
|
|
135
|
+
void this.assignPendingTasks();
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Handle task failure
|
|
139
|
+
*/
|
|
140
|
+
handleTaskFailed(message) {
|
|
141
|
+
const { taskId } = message.payload;
|
|
142
|
+
// Requeue the task
|
|
143
|
+
this.taskQueue.requeue(taskId);
|
|
144
|
+
// Mark worker as idle (or failed if repeated failures)
|
|
145
|
+
const worker = this.workers.get(message.from);
|
|
146
|
+
if (worker) {
|
|
147
|
+
updateAgentStatus(worker.id, 'idle');
|
|
148
|
+
}
|
|
149
|
+
// Try to assign more tasks
|
|
150
|
+
void this.assignPendingTasks();
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Handle worker ready notification
|
|
154
|
+
*/
|
|
155
|
+
handleWorkerReady(message) {
|
|
156
|
+
const worker = this.workers.get(message.from);
|
|
157
|
+
if (worker) {
|
|
158
|
+
updateAgentStatus(worker.id, 'idle');
|
|
159
|
+
void this.assignPendingTasks();
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Get status of the coordination
|
|
164
|
+
*/
|
|
165
|
+
getStatus() {
|
|
166
|
+
return {
|
|
167
|
+
coordinator: this.coordinator,
|
|
168
|
+
workers: Array.from(this.workers.values()),
|
|
169
|
+
queue: this.taskQueue.getStatus(),
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Shutdown the coordinator
|
|
174
|
+
*/
|
|
175
|
+
async shutdown() {
|
|
176
|
+
// Unsubscribe from messages
|
|
177
|
+
if (this.unsubscribe) {
|
|
178
|
+
this.unsubscribe();
|
|
179
|
+
}
|
|
180
|
+
// Stop all workers
|
|
181
|
+
for (const worker of this.workers.values()) {
|
|
182
|
+
stopAgent(worker.id);
|
|
183
|
+
}
|
|
184
|
+
this.workers.clear();
|
|
185
|
+
// Stop coordinator
|
|
186
|
+
if (this.coordinator) {
|
|
187
|
+
stopAgent(this.coordinator.id);
|
|
188
|
+
this.coordinator = null;
|
|
189
|
+
}
|
|
190
|
+
// Clear queue
|
|
191
|
+
this.taskQueue.clear();
|
|
192
|
+
log.info('Coordinator shutdown');
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=topology.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"topology.js","sourceRoot":"","sources":["../../src/coordination/topology.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub client - wraps gh CLI for GitHub operations
|
|
3
|
+
*/
|
|
4
|
+
import type { AgentStackConfig } from '../types.js';
|
|
5
|
+
export interface GitHubClientOptions {
|
|
6
|
+
token?: string;
|
|
7
|
+
useGhCli?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare class GitHubClient {
|
|
10
|
+
private token?;
|
|
11
|
+
private useGhCli;
|
|
12
|
+
constructor(options?: GitHubClientOptions);
|
|
13
|
+
/**
|
|
14
|
+
* Execute a gh CLI command
|
|
15
|
+
*/
|
|
16
|
+
private executeGh;
|
|
17
|
+
/**
|
|
18
|
+
* Execute a gh CLI command synchronously
|
|
19
|
+
*/
|
|
20
|
+
private executeGhSync;
|
|
21
|
+
/**
|
|
22
|
+
* Check if gh CLI is available
|
|
23
|
+
*/
|
|
24
|
+
isAvailable(): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Check if authenticated
|
|
27
|
+
*/
|
|
28
|
+
isAuthenticated(): Promise<boolean>;
|
|
29
|
+
createIssue(owner: string, repo: string, title: string, body?: string, options?: {
|
|
30
|
+
labels?: string[];
|
|
31
|
+
assignees?: string[];
|
|
32
|
+
}): Promise<{
|
|
33
|
+
number: number;
|
|
34
|
+
url: string;
|
|
35
|
+
}>;
|
|
36
|
+
listIssues(owner: string, repo: string, options?: {
|
|
37
|
+
state?: 'open' | 'closed' | 'all';
|
|
38
|
+
limit?: number;
|
|
39
|
+
}): Promise<unknown[]>;
|
|
40
|
+
getIssue(owner: string, repo: string, number: number): Promise<unknown>;
|
|
41
|
+
createPR(owner: string, repo: string, title: string, head: string, base: string, body?: string, draft?: boolean): Promise<{
|
|
42
|
+
number: number;
|
|
43
|
+
url: string;
|
|
44
|
+
}>;
|
|
45
|
+
listPRs(owner: string, repo: string, options?: {
|
|
46
|
+
state?: 'open' | 'closed' | 'merged' | 'all';
|
|
47
|
+
limit?: number;
|
|
48
|
+
}): Promise<unknown[]>;
|
|
49
|
+
getPR(owner: string, repo: string, number: number): Promise<unknown>;
|
|
50
|
+
getRepo(owner: string, repo: string): Promise<unknown>;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Create GitHub client from config
|
|
54
|
+
*/
|
|
55
|
+
export declare function createGitHubClient(config: AgentStackConfig): GitHubClient | null;
|
|
56
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/github/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAKpD,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAC,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAU;gBAEd,OAAO,GAAE,mBAAwB;IAK7C;;OAEG;YACW,SAAS;IA2BvB;;OAEG;IACH,OAAO,CAAC,aAAa;IAoBrB;;OAEG;IACH,WAAW,IAAI,OAAO;IAStB;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAWnC,WAAW,CACf,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GACpD,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAerC,UAAU,CACd,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAC9D,OAAO,CAAC,OAAO,EAAE,CAAC;IAaf,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAavE,QAAQ,CACZ,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,OAAO,GACd,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAgBrC,OAAO,CACX,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GACzE,OAAO,CAAC,OAAO,EAAE,CAAC;IAaf,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAapE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAS7D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,gBAAgB,GAAG,YAAY,GAAG,IAAI,CAUhF"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub client - wraps gh CLI for GitHub operations
|
|
3
|
+
*/
|
|
4
|
+
import { execSync, exec } from 'node:child_process';
|
|
5
|
+
import { logger } from '../utils/logger.js';
|
|
6
|
+
const log = logger.child('github');
|
|
7
|
+
export class GitHubClient {
|
|
8
|
+
token;
|
|
9
|
+
useGhCli;
|
|
10
|
+
constructor(options = {}) {
|
|
11
|
+
this.token = options.token;
|
|
12
|
+
this.useGhCli = options.useGhCli ?? true;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Execute a gh CLI command
|
|
16
|
+
*/
|
|
17
|
+
async executeGh(args) {
|
|
18
|
+
return new Promise((resolve, reject) => {
|
|
19
|
+
const env = { ...process.env };
|
|
20
|
+
if (this.token && !this.useGhCli) {
|
|
21
|
+
env['GH_TOKEN'] = this.token;
|
|
22
|
+
}
|
|
23
|
+
const command = `gh ${args.join(' ')}`;
|
|
24
|
+
log.debug('Executing gh command', { args });
|
|
25
|
+
exec(command, { env, timeout: 30000 }, (error, stdout, stderr) => {
|
|
26
|
+
if (error) {
|
|
27
|
+
log.error('gh command failed', { error: error.message, stderr });
|
|
28
|
+
reject(new Error(`GitHub command failed: ${error.message}`));
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
resolve(JSON.parse(stdout));
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
resolve(stdout.trim());
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Execute a gh CLI command synchronously
|
|
42
|
+
*/
|
|
43
|
+
executeGhSync(args) {
|
|
44
|
+
const env = { ...process.env };
|
|
45
|
+
if (this.token && !this.useGhCli) {
|
|
46
|
+
env['GH_TOKEN'] = this.token;
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
const result = execSync(`gh ${args.join(' ')}`, {
|
|
50
|
+
encoding: 'utf-8',
|
|
51
|
+
env,
|
|
52
|
+
timeout: 30000,
|
|
53
|
+
});
|
|
54
|
+
return JSON.parse(result);
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
throw new Error(`GitHub command failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Check if gh CLI is available
|
|
62
|
+
*/
|
|
63
|
+
isAvailable() {
|
|
64
|
+
try {
|
|
65
|
+
execSync('gh --version', { encoding: 'utf-8', timeout: 5000 });
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Check if authenticated
|
|
74
|
+
*/
|
|
75
|
+
async isAuthenticated() {
|
|
76
|
+
try {
|
|
77
|
+
await this.executeGh(['auth', 'status']);
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Issue operations
|
|
85
|
+
async createIssue(owner, repo, title, body, options) {
|
|
86
|
+
const args = [
|
|
87
|
+
'issue', 'create',
|
|
88
|
+
'-R', `${owner}/${repo}`,
|
|
89
|
+
'--title', JSON.stringify(title),
|
|
90
|
+
'--json', 'number,url',
|
|
91
|
+
];
|
|
92
|
+
if (body)
|
|
93
|
+
args.push('--body', JSON.stringify(body));
|
|
94
|
+
if (options?.labels?.length)
|
|
95
|
+
args.push('--label', options.labels.join(','));
|
|
96
|
+
if (options?.assignees?.length)
|
|
97
|
+
args.push('--assignee', options.assignees.join(','));
|
|
98
|
+
return await this.executeGh(args);
|
|
99
|
+
}
|
|
100
|
+
async listIssues(owner, repo, options) {
|
|
101
|
+
const args = [
|
|
102
|
+
'issue', 'list',
|
|
103
|
+
'-R', `${owner}/${repo}`,
|
|
104
|
+
'--json', 'number,title,state,author,labels,createdAt',
|
|
105
|
+
'--limit', String(options?.limit ?? 30),
|
|
106
|
+
];
|
|
107
|
+
if (options?.state)
|
|
108
|
+
args.push('--state', options.state);
|
|
109
|
+
return await this.executeGh(args);
|
|
110
|
+
}
|
|
111
|
+
async getIssue(owner, repo, number) {
|
|
112
|
+
const args = [
|
|
113
|
+
'issue', 'view',
|
|
114
|
+
'-R', `${owner}/${repo}`,
|
|
115
|
+
String(number),
|
|
116
|
+
'--json', 'number,title,body,state,author,labels,assignees,createdAt,closedAt',
|
|
117
|
+
];
|
|
118
|
+
return await this.executeGh(args);
|
|
119
|
+
}
|
|
120
|
+
// PR operations
|
|
121
|
+
async createPR(owner, repo, title, head, base, body, draft) {
|
|
122
|
+
const args = [
|
|
123
|
+
'pr', 'create',
|
|
124
|
+
'-R', `${owner}/${repo}`,
|
|
125
|
+
'--title', JSON.stringify(title),
|
|
126
|
+
'--head', head,
|
|
127
|
+
'--base', base,
|
|
128
|
+
'--json', 'number,url',
|
|
129
|
+
];
|
|
130
|
+
if (body)
|
|
131
|
+
args.push('--body', JSON.stringify(body));
|
|
132
|
+
if (draft)
|
|
133
|
+
args.push('--draft');
|
|
134
|
+
return await this.executeGh(args);
|
|
135
|
+
}
|
|
136
|
+
async listPRs(owner, repo, options) {
|
|
137
|
+
const args = [
|
|
138
|
+
'pr', 'list',
|
|
139
|
+
'-R', `${owner}/${repo}`,
|
|
140
|
+
'--json', 'number,title,state,author,headRefName,baseRefName,createdAt',
|
|
141
|
+
'--limit', String(options?.limit ?? 30),
|
|
142
|
+
];
|
|
143
|
+
if (options?.state)
|
|
144
|
+
args.push('--state', options.state);
|
|
145
|
+
return await this.executeGh(args);
|
|
146
|
+
}
|
|
147
|
+
async getPR(owner, repo, number) {
|
|
148
|
+
const args = [
|
|
149
|
+
'pr', 'view',
|
|
150
|
+
'-R', `${owner}/${repo}`,
|
|
151
|
+
String(number),
|
|
152
|
+
'--json', 'number,title,body,state,author,headRefName,baseRefName,isDraft,mergeable,createdAt,closedAt,mergedAt',
|
|
153
|
+
];
|
|
154
|
+
return await this.executeGh(args);
|
|
155
|
+
}
|
|
156
|
+
// Repo operations
|
|
157
|
+
async getRepo(owner, repo) {
|
|
158
|
+
const args = [
|
|
159
|
+
'repo', 'view',
|
|
160
|
+
`${owner}/${repo}`,
|
|
161
|
+
'--json', 'name,description,owner,url,defaultBranchRef,stargazerCount,forkCount,isPrivate,createdAt,pushedAt',
|
|
162
|
+
];
|
|
163
|
+
return await this.executeGh(args);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Create GitHub client from config
|
|
168
|
+
*/
|
|
169
|
+
export function createGitHubClient(config) {
|
|
170
|
+
if (!config.github.enabled) {
|
|
171
|
+
log.debug('GitHub integration disabled');
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
return new GitHubClient({
|
|
175
|
+
token: config.github.token,
|
|
176
|
+
useGhCli: config.github.useGhCli,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/github/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/github/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/github/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAA4B,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hooks module - event-driven extensibility
|
|
3
|
+
*/
|
|
4
|
+
import type { HookEvent, HookContext, AgentStackConfig } from '../types.js';
|
|
5
|
+
import { MemoryManager } from '../memory/index.js';
|
|
6
|
+
type HookHandler = (context: HookContext, memory: MemoryManager, config: AgentStackConfig) => Promise<void>;
|
|
7
|
+
/**
|
|
8
|
+
* Execute hooks for an event
|
|
9
|
+
*/
|
|
10
|
+
export declare function executeHooks(event: HookEvent, context: HookContext, memory: MemoryManager, config: AgentStackConfig): Promise<void>;
|
|
11
|
+
/**
|
|
12
|
+
* Register a custom hook handler
|
|
13
|
+
*/
|
|
14
|
+
export declare function registerHook(event: HookEvent, handler: HookHandler): void;
|
|
15
|
+
/**
|
|
16
|
+
* Unregister all custom hooks for an event
|
|
17
|
+
*/
|
|
18
|
+
export declare function unregisterHooks(event: HookEvent): void;
|
|
19
|
+
/**
|
|
20
|
+
* Clear all custom hooks
|
|
21
|
+
*/
|
|
22
|
+
export declare function clearCustomHooks(): void;
|
|
23
|
+
/**
|
|
24
|
+
* Get registered hook count
|
|
25
|
+
*/
|
|
26
|
+
export declare function getHookCount(event?: HookEvent): number;
|
|
27
|
+
export { sessionStartHook, sessionEndHook } from './session.js';
|
|
28
|
+
export { preTaskHook, postTaskHook } from './task.js';
|
|
29
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAQnD,KAAK,WAAW,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAG5G;;GAEG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,IAAI,CAAC,CA+Cf;AAoBD;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,CAKzE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAEtD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,CAUtD;AAGD,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC"}
|