aimux-cli 0.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.
- package/README.md +743 -0
- package/bin/aimux +2 -0
- package/dist/agent-events.d.ts +20 -0
- package/dist/agent-events.js +2 -0
- package/dist/agent-events.js.map +1 -0
- package/dist/agent-message-parts.d.ts +17 -0
- package/dist/agent-message-parts.js +31 -0
- package/dist/agent-message-parts.js.map +1 -0
- package/dist/agent-output-parser.d.ts +16 -0
- package/dist/agent-output-parser.js +229 -0
- package/dist/agent-output-parser.js.map +1 -0
- package/dist/agent-tracker.d.ts +9 -0
- package/dist/agent-tracker.js +144 -0
- package/dist/agent-tracker.js.map +1 -0
- package/dist/agent-watcher.d.ts +15 -0
- package/dist/agent-watcher.js +2 -0
- package/dist/agent-watcher.js.map +1 -0
- package/dist/attachment-store.d.ts +35 -0
- package/dist/attachment-store.js +129 -0
- package/dist/attachment-store.js.map +1 -0
- package/dist/builtin-metadata-watchers.d.ts +2 -0
- package/dist/builtin-metadata-watchers.js +275 -0
- package/dist/builtin-metadata-watchers.js.map +1 -0
- package/dist/claude-hooks.d.ts +29 -0
- package/dist/claude-hooks.js +106 -0
- package/dist/claude-hooks.js.map +1 -0
- package/dist/config.d.ts +78 -0
- package/dist/config.js +172 -0
- package/dist/config.js.map +1 -0
- package/dist/context/compactor.d.ts +20 -0
- package/dist/context/compactor.js +212 -0
- package/dist/context/compactor.js.map +1 -0
- package/dist/context/context-bridge.d.ts +67 -0
- package/dist/context/context-bridge.js +471 -0
- package/dist/context/context-bridge.js.map +1 -0
- package/dist/context/context-file.d.ts +11 -0
- package/dist/context/context-file.js +93 -0
- package/dist/context/context-file.js.map +1 -0
- package/dist/context/history.d.ts +40 -0
- package/dist/context/history.js +108 -0
- package/dist/context/history.js.map +1 -0
- package/dist/daemon.d.ts +39 -0
- package/dist/daemon.js +344 -0
- package/dist/daemon.js.map +1 -0
- package/dist/dashboard-session-registry.d.ts +47 -0
- package/dist/dashboard-session-registry.js +161 -0
- package/dist/dashboard-session-registry.js.map +1 -0
- package/dist/dashboard-state.d.ts +18 -0
- package/dist/dashboard-state.js +26 -0
- package/dist/dashboard-state.js.map +1 -0
- package/dist/dashboard.d.ts +118 -0
- package/dist/dashboard.js +91 -0
- package/dist/dashboard.js.map +1 -0
- package/dist/debug.d.ts +7 -0
- package/dist/debug.js +41 -0
- package/dist/debug.js.map +1 -0
- package/dist/fast-control.d.ts +45 -0
- package/dist/fast-control.js +174 -0
- package/dist/fast-control.js.map +1 -0
- package/dist/hotkeys.d.ts +44 -0
- package/dist/hotkeys.js +118 -0
- package/dist/hotkeys.js.map +1 -0
- package/dist/http-client.d.ts +10 -0
- package/dist/http-client.js +54 -0
- package/dist/http-client.js.map +1 -0
- package/dist/instance-directory.d.ts +32 -0
- package/dist/instance-directory.js +82 -0
- package/dist/instance-directory.js.map +1 -0
- package/dist/instance-registry.d.ts +38 -0
- package/dist/instance-registry.js +208 -0
- package/dist/instance-registry.js.map +1 -0
- package/dist/key-parser.d.ts +30 -0
- package/dist/key-parser.js +272 -0
- package/dist/key-parser.js.map +1 -0
- package/dist/last-used.d.ts +31 -0
- package/dist/last-used.js +93 -0
- package/dist/last-used.js.map +1 -0
- package/dist/main.d.ts +1 -0
- package/dist/main.js +2483 -0
- package/dist/main.js.map +1 -0
- package/dist/metadata-server.d.ts +268 -0
- package/dist/metadata-server.js +1379 -0
- package/dist/metadata-server.js.map +1 -0
- package/dist/metadata-store.d.ts +80 -0
- package/dist/metadata-store.js +87 -0
- package/dist/metadata-store.js.map +1 -0
- package/dist/multiplexer.d.ts +471 -0
- package/dist/multiplexer.js +5714 -0
- package/dist/multiplexer.js.map +1 -0
- package/dist/notification-context.d.ts +18 -0
- package/dist/notification-context.js +68 -0
- package/dist/notification-context.js.map +1 -0
- package/dist/notifications.d.ts +38 -0
- package/dist/notifications.js +111 -0
- package/dist/notifications.js.map +1 -0
- package/dist/notify.d.ts +10 -0
- package/dist/notify.js +62 -0
- package/dist/notify.js.map +1 -0
- package/dist/orchestration-actions.d.ts +76 -0
- package/dist/orchestration-actions.js +310 -0
- package/dist/orchestration-actions.js.map +1 -0
- package/dist/orchestration-dispatcher.d.ts +22 -0
- package/dist/orchestration-dispatcher.js +49 -0
- package/dist/orchestration-dispatcher.js.map +1 -0
- package/dist/orchestration-routing.d.ts +20 -0
- package/dist/orchestration-routing.js +78 -0
- package/dist/orchestration-routing.js.map +1 -0
- package/dist/orchestration.d.ts +26 -0
- package/dist/orchestration.js +110 -0
- package/dist/orchestration.js.map +1 -0
- package/dist/osc-notifications.d.ts +15 -0
- package/dist/osc-notifications.js +180 -0
- package/dist/osc-notifications.js.map +1 -0
- package/dist/paths.d.ts +55 -0
- package/dist/paths.js +259 -0
- package/dist/paths.js.map +1 -0
- package/dist/plugin-runtime.d.ts +46 -0
- package/dist/plugin-runtime.js +180 -0
- package/dist/plugin-runtime.js.map +1 -0
- package/dist/project-events.d.ts +36 -0
- package/dist/project-events.js +63 -0
- package/dist/project-events.js.map +1 -0
- package/dist/project-scanner.d.ts +38 -0
- package/dist/project-scanner.js +243 -0
- package/dist/project-scanner.js.map +1 -0
- package/dist/project-service-manifest.d.ts +18 -0
- package/dist/project-service-manifest.js +56 -0
- package/dist/project-service-manifest.js.map +1 -0
- package/dist/recency.d.ts +2 -0
- package/dist/recency.js +34 -0
- package/dist/recency.js.map +1 -0
- package/dist/recorder.d.ts +14 -0
- package/dist/recorder.js +130 -0
- package/dist/recorder.js.map +1 -0
- package/dist/session-bootstrap.d.ts +45 -0
- package/dist/session-bootstrap.js +436 -0
- package/dist/session-bootstrap.js.map +1 -0
- package/dist/session-message-history.d.ts +27 -0
- package/dist/session-message-history.js +105 -0
- package/dist/session-message-history.js.map +1 -0
- package/dist/session-runtime.d.ts +44 -0
- package/dist/session-runtime.js +56 -0
- package/dist/session-runtime.js.map +1 -0
- package/dist/session-semantics.d.ts +35 -0
- package/dist/session-semantics.js +110 -0
- package/dist/session-semantics.js.map +1 -0
- package/dist/status-detector.d.ts +17 -0
- package/dist/status-detector.js +67 -0
- package/dist/status-detector.js.map +1 -0
- package/dist/statusline-model.d.ts +103 -0
- package/dist/statusline-model.js +177 -0
- package/dist/statusline-model.js.map +1 -0
- package/dist/task-dispatcher.d.ts +63 -0
- package/dist/task-dispatcher.js +210 -0
- package/dist/task-dispatcher.js.map +1 -0
- package/dist/task-workflow.d.ts +13 -0
- package/dist/task-workflow.js +153 -0
- package/dist/task-workflow.js.map +1 -0
- package/dist/tasks.d.ts +60 -0
- package/dist/tasks.js +120 -0
- package/dist/tasks.js.map +1 -0
- package/dist/team.d.ts +28 -0
- package/dist/team.js +91 -0
- package/dist/team.js.map +1 -0
- package/dist/terminal-host.d.ts +10 -0
- package/dist/terminal-host.js +52 -0
- package/dist/terminal-host.js.map +1 -0
- package/dist/threads.d.ts +61 -0
- package/dist/threads.js +200 -0
- package/dist/threads.js.map +1 -0
- package/dist/tmux-doctor.d.ts +47 -0
- package/dist/tmux-doctor.js +112 -0
- package/dist/tmux-doctor.js.map +1 -0
- package/dist/tmux-runtime-manager.d.ts +164 -0
- package/dist/tmux-runtime-manager.js +794 -0
- package/dist/tmux-runtime-manager.js.map +1 -0
- package/dist/tmux-session-transport.d.ts +31 -0
- package/dist/tmux-session-transport.js +115 -0
- package/dist/tmux-session-transport.js.map +1 -0
- package/dist/tmux-statusline.d.ts +17 -0
- package/dist/tmux-statusline.js +166 -0
- package/dist/tmux-statusline.js.map +1 -0
- package/dist/tool-output-watchers.d.ts +10 -0
- package/dist/tool-output-watchers.js +190 -0
- package/dist/tool-output-watchers.js.map +1 -0
- package/dist/tui/render/box.d.ts +1 -0
- package/dist/tui/render/box.js +20 -0
- package/dist/tui/render/box.js.map +1 -0
- package/dist/tui/render/text.d.ts +8 -0
- package/dist/tui/render/text.js +92 -0
- package/dist/tui/render/text.js.map +1 -0
- package/dist/tui/screens/dashboard-renderers.d.ts +23 -0
- package/dist/tui/screens/dashboard-renderers.js +411 -0
- package/dist/tui/screens/dashboard-renderers.js.map +1 -0
- package/dist/tui/screens/overlay-renderers.d.ts +10 -0
- package/dist/tui/screens/overlay-renderers.js +274 -0
- package/dist/tui/screens/overlay-renderers.js.map +1 -0
- package/dist/tui/screens/subscreen-renderers.d.ts +9 -0
- package/dist/tui/screens/subscreen-renderers.js +327 -0
- package/dist/tui/screens/subscreen-renderers.js.map +1 -0
- package/dist/workflow.d.ts +19 -0
- package/dist/workflow.js +111 -0
- package/dist/workflow.js.map +1 -0
- package/dist/worktree.d.ts +23 -0
- package/dist/worktree.js +101 -0
- package/dist/worktree.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { readAllTasks, writeTask, cleanupTasks, hasActiveTask } from "./tasks.js";
|
|
2
|
+
import { loadTeamConfig } from "./team.js";
|
|
3
|
+
import { TaskWorkflow } from "./task-workflow.js";
|
|
4
|
+
export class TaskDispatcher {
|
|
5
|
+
getSession;
|
|
6
|
+
getSessionTool;
|
|
7
|
+
getSessionRole;
|
|
8
|
+
getSessionAvailability;
|
|
9
|
+
tickCount = 0;
|
|
10
|
+
lastCounts = { pending: 0, assigned: 0 };
|
|
11
|
+
workflow = new TaskWorkflow();
|
|
12
|
+
/** Per-session task info: sessionId → task description */
|
|
13
|
+
sessionTasks = new Map();
|
|
14
|
+
/** Recent events for flash notifications, drained by caller */
|
|
15
|
+
pendingEvents = [];
|
|
16
|
+
constructor(getSession, getSessionTool, getSessionRole, getSessionAvailability) {
|
|
17
|
+
this.getSession = getSession;
|
|
18
|
+
this.getSessionTool = getSessionTool;
|
|
19
|
+
this.getSessionRole = getSessionRole ?? (() => undefined);
|
|
20
|
+
this.getSessionAvailability = getSessionAvailability ?? (() => undefined);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Main dispatch loop, called every ~2s from the dashboard/status refresh loop.
|
|
24
|
+
*/
|
|
25
|
+
tick(localSessionIds) {
|
|
26
|
+
this.tickCount++;
|
|
27
|
+
const tasks = readAllTasks();
|
|
28
|
+
// Update cached counts + per-session task map
|
|
29
|
+
let pending = 0;
|
|
30
|
+
let assigned = 0;
|
|
31
|
+
this.sessionTasks.clear();
|
|
32
|
+
for (const task of tasks) {
|
|
33
|
+
if (task.status === "pending")
|
|
34
|
+
pending++;
|
|
35
|
+
else if (task.status === "assigned" || task.status === "in_progress" || task.status === "blocked") {
|
|
36
|
+
assigned++;
|
|
37
|
+
if (task.assignedTo) {
|
|
38
|
+
this.sessionTasks.set(task.assignedTo, task.description);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
this.lastCounts = { pending, assigned };
|
|
43
|
+
// 1. Dispatch pending tasks to idle local sessions
|
|
44
|
+
for (const task of tasks) {
|
|
45
|
+
if (task.status !== "pending")
|
|
46
|
+
continue;
|
|
47
|
+
const targetSession = this.findIdleSession(task, localSessionIds);
|
|
48
|
+
if (targetSession) {
|
|
49
|
+
this.inject(targetSession, task);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// 2. Notify assigners of completed tasks + handle review routing
|
|
53
|
+
for (const task of tasks) {
|
|
54
|
+
if ((task.status !== "done" && task.status !== "failed") || task.notifiedAt)
|
|
55
|
+
continue;
|
|
56
|
+
const assignerSession = this.getSession(task.assignedBy);
|
|
57
|
+
if (assignerSession && !assignerSession.exited && assignerSession.status === "idle") {
|
|
58
|
+
this.workflow.notifyAssigner(assignerSession, task);
|
|
59
|
+
this.pendingEvents.push({
|
|
60
|
+
type: task.status === "done" ? "completed" : "failed",
|
|
61
|
+
taskId: task.id,
|
|
62
|
+
sessionId: task.assignedTo ?? "",
|
|
63
|
+
description: task.description,
|
|
64
|
+
});
|
|
65
|
+
// Handle review workflow for completed tasks
|
|
66
|
+
if (task.status === "done") {
|
|
67
|
+
this.pendingEvents.push(...this.workflow.handleCompletion(task));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// 3. Mark tasks as failed if assigned session has exited
|
|
72
|
+
for (const task of tasks) {
|
|
73
|
+
if ((task.status !== "assigned" && task.status !== "in_progress" && task.status !== "blocked") ||
|
|
74
|
+
!task.assignedTo)
|
|
75
|
+
continue;
|
|
76
|
+
if (!localSessionIds.includes(task.assignedTo))
|
|
77
|
+
continue;
|
|
78
|
+
const session = this.getSession(task.assignedTo);
|
|
79
|
+
if (session && session.exited) {
|
|
80
|
+
task.status = "failed";
|
|
81
|
+
task.error = "agent exited before completing task";
|
|
82
|
+
writeTask(task);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// 4. Periodic cleanup (~every 200s)
|
|
86
|
+
if (this.tickCount % 100 === 0) {
|
|
87
|
+
cleanupTasks(3600000);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Find an idle local session matching the task's targeting criteria.
|
|
92
|
+
* Priority: assignedTo (specific session) > assignee (role) > tool > any idle.
|
|
93
|
+
*/
|
|
94
|
+
findIdleSession(task, localSessionIds) {
|
|
95
|
+
const isEligible = (id) => {
|
|
96
|
+
if (id === task.assignedBy)
|
|
97
|
+
return undefined; // don't delegate to self
|
|
98
|
+
if (hasActiveTask(id))
|
|
99
|
+
return undefined; // already working a task
|
|
100
|
+
const session = this.getSession(id);
|
|
101
|
+
const availability = this.getSessionAvailability(id);
|
|
102
|
+
if (session &&
|
|
103
|
+
!session.exited &&
|
|
104
|
+
(availability === "available" || (availability === undefined && session.status === "idle"))) {
|
|
105
|
+
return session;
|
|
106
|
+
}
|
|
107
|
+
return undefined;
|
|
108
|
+
};
|
|
109
|
+
// Check assignedTo first (specific session targeting)
|
|
110
|
+
if (task.assignedTo) {
|
|
111
|
+
if (!localSessionIds.includes(task.assignedTo))
|
|
112
|
+
return undefined;
|
|
113
|
+
return isEligible(task.assignedTo);
|
|
114
|
+
}
|
|
115
|
+
// Match by role name
|
|
116
|
+
if (task.assignee) {
|
|
117
|
+
for (const id of localSessionIds) {
|
|
118
|
+
if (this.getSessionRole(id) !== task.assignee)
|
|
119
|
+
continue;
|
|
120
|
+
const session = isEligible(id);
|
|
121
|
+
if (session)
|
|
122
|
+
return session;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Match by tool type
|
|
126
|
+
if (task.tool) {
|
|
127
|
+
for (const id of localSessionIds) {
|
|
128
|
+
if (this.getSessionTool(id) !== task.tool)
|
|
129
|
+
continue;
|
|
130
|
+
const session = isEligible(id);
|
|
131
|
+
if (session)
|
|
132
|
+
return session;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// Any idle session (only if no targeting specified)
|
|
136
|
+
if (!task.tool && !task.assignee) {
|
|
137
|
+
for (const id of localSessionIds) {
|
|
138
|
+
const session = isEligible(id);
|
|
139
|
+
if (session)
|
|
140
|
+
return session;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return undefined;
|
|
144
|
+
}
|
|
145
|
+
inject(session, task) {
|
|
146
|
+
this.pendingEvents.push(this.workflow.injectIntoSession(session, task));
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Notify the assigning session that a task has completed.
|
|
150
|
+
*/
|
|
151
|
+
notifyAssigner(session, task) {
|
|
152
|
+
this.workflow.notifyAssigner(session, task);
|
|
153
|
+
task.notifiedAt = new Date().toISOString();
|
|
154
|
+
writeTask(task);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Get cached counts from last tick.
|
|
158
|
+
*/
|
|
159
|
+
getTaskCounts() {
|
|
160
|
+
return this.lastCounts;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Get the task description assigned to a session, if any.
|
|
164
|
+
*/
|
|
165
|
+
getSessionTask(sessionId) {
|
|
166
|
+
return this.sessionTasks.get(sessionId);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Drain pending events (for flash notifications). Returns and clears the queue.
|
|
170
|
+
*/
|
|
171
|
+
drainEvents() {
|
|
172
|
+
const events = this.pendingEvents;
|
|
173
|
+
this.pendingEvents = [];
|
|
174
|
+
return events;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Create a review task for the active session's recent work.
|
|
179
|
+
* Called from the [v] hotkey handler.
|
|
180
|
+
*/
|
|
181
|
+
export function requestReview(agentSessionId, agentRole, diff, summary) {
|
|
182
|
+
const config = loadTeamConfig();
|
|
183
|
+
const roleConfig = config.roles[agentRole];
|
|
184
|
+
let reviewerRole = roleConfig?.reviewedBy;
|
|
185
|
+
if (!reviewerRole) {
|
|
186
|
+
// No reviewer configured — try to find any reviewer role
|
|
187
|
+
const fallback = Object.entries(config.roles).find(([_, rc]) => rc.canEdit || rc.description.toLowerCase().includes("review"));
|
|
188
|
+
if (!fallback)
|
|
189
|
+
return null;
|
|
190
|
+
reviewerRole = fallback[0];
|
|
191
|
+
}
|
|
192
|
+
const reviewTask = {
|
|
193
|
+
id: `review-manual-${Date.now().toString(36)}`,
|
|
194
|
+
status: "pending",
|
|
195
|
+
assignedBy: agentSessionId,
|
|
196
|
+
description: `Review: ${summary.slice(0, 100)}`,
|
|
197
|
+
prompt: summary,
|
|
198
|
+
createdAt: new Date().toISOString(),
|
|
199
|
+
updatedAt: new Date().toISOString(),
|
|
200
|
+
assignee: reviewerRole,
|
|
201
|
+
assigner: agentRole,
|
|
202
|
+
type: "review",
|
|
203
|
+
reviewStatus: "pending",
|
|
204
|
+
diff,
|
|
205
|
+
iteration: 1,
|
|
206
|
+
};
|
|
207
|
+
writeTask(reviewTask);
|
|
208
|
+
return reviewTask;
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=task-dispatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-dispatcher.js","sourceRoot":"","sources":["../src/task-dispatcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type Task } from "./tasks.js";
|
|
2
|
+
import type { TaskEvent } from "./task-dispatcher.js";
|
|
3
|
+
interface DispatchSession {
|
|
4
|
+
id: string;
|
|
5
|
+
write(data: string): void;
|
|
6
|
+
}
|
|
7
|
+
export declare class TaskWorkflow {
|
|
8
|
+
injectIntoSession(session: DispatchSession, task: Task): TaskEvent;
|
|
9
|
+
notifyAssigner(session: DispatchSession, task: Task): void;
|
|
10
|
+
handleCompletion(task: Task): TaskEvent[];
|
|
11
|
+
private handleReviewCompletion;
|
|
12
|
+
}
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { writeTask } from "./tasks.js";
|
|
2
|
+
import { loadTeamConfig } from "./team.js";
|
|
3
|
+
import { openTaskThread, updateThread } from "./threads.js";
|
|
4
|
+
import { sendThreadMessage } from "./orchestration.js";
|
|
5
|
+
export class TaskWorkflow {
|
|
6
|
+
injectIntoSession(session, task) {
|
|
7
|
+
const thread = openTaskThread(task.id, {
|
|
8
|
+
title: `${task.type === "review" ? "Review" : "Task"}: ${task.description}`,
|
|
9
|
+
createdBy: task.assignedBy,
|
|
10
|
+
participants: [task.assignedBy, session.id],
|
|
11
|
+
kind: task.type === "review" ? "review" : "task",
|
|
12
|
+
});
|
|
13
|
+
task.threadId = thread.id;
|
|
14
|
+
sendThreadMessage({
|
|
15
|
+
threadId: thread.id,
|
|
16
|
+
from: task.assignedBy,
|
|
17
|
+
to: [session.id],
|
|
18
|
+
kind: "request",
|
|
19
|
+
body: task.description,
|
|
20
|
+
metadata: { taskId: task.id },
|
|
21
|
+
});
|
|
22
|
+
const prefix = task.type === "review"
|
|
23
|
+
? `[AIMUX REVIEW ${task.id} from ${task.assignedBy}]`
|
|
24
|
+
: `[AIMUX TASK ${task.id} from ${task.assignedBy}]`;
|
|
25
|
+
let prompt = `${prefix} ${task.description}\n\n`;
|
|
26
|
+
if (task.type === "review" && task.diff) {
|
|
27
|
+
prompt += `Diff to review:\n${task.diff.slice(0, 3000)}\n\n`;
|
|
28
|
+
}
|
|
29
|
+
prompt +=
|
|
30
|
+
`Read .aimux/tasks/${task.id}.json for full details. When done, update that file: ` +
|
|
31
|
+
`set status to "done" and add a "result" field.`;
|
|
32
|
+
if (task.type === "review") {
|
|
33
|
+
prompt += ` Also set "reviewStatus" to "approved" or "changes_requested", and optionally add "reviewFeedback".`;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
prompt += ` If you can't complete it, set status to "failed" with an "error" field.`;
|
|
37
|
+
}
|
|
38
|
+
session.write(prompt + "\r");
|
|
39
|
+
task.status = "assigned";
|
|
40
|
+
task.assignedTo = session.id;
|
|
41
|
+
writeTask(task);
|
|
42
|
+
return {
|
|
43
|
+
type: "assigned",
|
|
44
|
+
taskId: task.id,
|
|
45
|
+
sessionId: session.id,
|
|
46
|
+
description: task.description,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
notifyAssigner(session, task) {
|
|
50
|
+
if (task.threadId) {
|
|
51
|
+
sendThreadMessage({
|
|
52
|
+
threadId: task.threadId,
|
|
53
|
+
from: task.assignedTo ?? task.assignedBy,
|
|
54
|
+
to: [task.assignedBy],
|
|
55
|
+
kind: task.status === "done" ? "status" : "reply",
|
|
56
|
+
body: task.status === "done"
|
|
57
|
+
? `Completed: ${task.description}${task.result ? `\n\n${task.result}` : ""}`
|
|
58
|
+
: `Failed: ${task.description}${task.error ? `\n\n${task.error}` : ""}`,
|
|
59
|
+
metadata: { taskId: task.id, status: task.status },
|
|
60
|
+
});
|
|
61
|
+
updateThread(task.threadId, (current) => ({
|
|
62
|
+
...current,
|
|
63
|
+
status: task.status === "done" ? "done" : "blocked",
|
|
64
|
+
owner: task.assignedBy,
|
|
65
|
+
waitingOn: [],
|
|
66
|
+
}));
|
|
67
|
+
}
|
|
68
|
+
session.write(`[AIMUX TASK COMPLETE ${task.id}] Agent ${task.assignedTo} finished: ${task.result ?? task.error ?? "no details"}\r`);
|
|
69
|
+
task.notifiedAt = new Date().toISOString();
|
|
70
|
+
writeTask(task);
|
|
71
|
+
}
|
|
72
|
+
handleCompletion(task) {
|
|
73
|
+
if (task.type === "review") {
|
|
74
|
+
return this.handleReviewCompletion(task);
|
|
75
|
+
}
|
|
76
|
+
const assignerRole = task.assigner;
|
|
77
|
+
if (!assignerRole)
|
|
78
|
+
return [];
|
|
79
|
+
const config = loadTeamConfig();
|
|
80
|
+
const roleConfig = config.roles[assignerRole];
|
|
81
|
+
if (!roleConfig?.reviewedBy)
|
|
82
|
+
return [];
|
|
83
|
+
const reviewerRole = roleConfig.reviewedBy;
|
|
84
|
+
const reviewTask = {
|
|
85
|
+
id: `review-${task.id}-${Date.now().toString(36)}`,
|
|
86
|
+
status: "pending",
|
|
87
|
+
assignedBy: task.assignedTo ?? task.assignedBy,
|
|
88
|
+
description: `Review: ${task.description}`,
|
|
89
|
+
prompt: `Review the changes from task "${task.description}".\n\nResult: ${task.result ?? "(no result)"}`,
|
|
90
|
+
createdAt: new Date().toISOString(),
|
|
91
|
+
updatedAt: new Date().toISOString(),
|
|
92
|
+
assignee: reviewerRole,
|
|
93
|
+
assigner: task.assignee,
|
|
94
|
+
type: "review",
|
|
95
|
+
reviewStatus: "pending",
|
|
96
|
+
diff: task.diff,
|
|
97
|
+
iteration: 1,
|
|
98
|
+
reviewOf: task.id,
|
|
99
|
+
};
|
|
100
|
+
writeTask(reviewTask);
|
|
101
|
+
return [
|
|
102
|
+
{
|
|
103
|
+
type: "review_created",
|
|
104
|
+
taskId: reviewTask.id,
|
|
105
|
+
sessionId: "",
|
|
106
|
+
description: reviewTask.description,
|
|
107
|
+
},
|
|
108
|
+
];
|
|
109
|
+
}
|
|
110
|
+
handleReviewCompletion(reviewTask) {
|
|
111
|
+
if (reviewTask.reviewStatus === "approved") {
|
|
112
|
+
return [
|
|
113
|
+
{
|
|
114
|
+
type: "review_approved",
|
|
115
|
+
taskId: reviewTask.id,
|
|
116
|
+
sessionId: reviewTask.assignedTo ?? "",
|
|
117
|
+
description: reviewTask.description,
|
|
118
|
+
},
|
|
119
|
+
];
|
|
120
|
+
}
|
|
121
|
+
if (reviewTask.reviewStatus !== "changes_requested") {
|
|
122
|
+
return [];
|
|
123
|
+
}
|
|
124
|
+
const iteration = (reviewTask.iteration ?? 1) + 1;
|
|
125
|
+
if (iteration > 5)
|
|
126
|
+
return [];
|
|
127
|
+
const followUp = {
|
|
128
|
+
id: `revision-${reviewTask.reviewOf ?? "unknown"}-${Date.now().toString(36)}`,
|
|
129
|
+
status: "pending",
|
|
130
|
+
assignedBy: reviewTask.assignedTo ?? reviewTask.assignedBy,
|
|
131
|
+
description: `Revision ${iteration}: ${reviewTask.description.replace(/^Review: /, "")}`,
|
|
132
|
+
prompt: `Changes requested by reviewer:\n\n${reviewTask.reviewFeedback ?? "(no feedback)"}\n\n` +
|
|
133
|
+
`Original task: ${reviewTask.description}`,
|
|
134
|
+
createdAt: new Date().toISOString(),
|
|
135
|
+
updatedAt: new Date().toISOString(),
|
|
136
|
+
assignee: reviewTask.assigner ?? "coder",
|
|
137
|
+
assigner: reviewTask.assignee,
|
|
138
|
+
type: "task",
|
|
139
|
+
iteration,
|
|
140
|
+
reviewOf: reviewTask.reviewOf,
|
|
141
|
+
};
|
|
142
|
+
writeTask(followUp);
|
|
143
|
+
return [
|
|
144
|
+
{
|
|
145
|
+
type: "changes_requested",
|
|
146
|
+
taskId: followUp.id,
|
|
147
|
+
sessionId: "",
|
|
148
|
+
description: followUp.description,
|
|
149
|
+
},
|
|
150
|
+
];
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=task-workflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-workflow.js","sourceRoot":"","sources":["../src/task-workflow.ts"],"names":[],"mappings":"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"}
|
package/dist/tasks.d.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export type TaskStatus = "pending" | "assigned" | "in_progress" | "blocked" | "done" | "failed";
|
|
2
|
+
export interface Task {
|
|
3
|
+
id: string;
|
|
4
|
+
status: TaskStatus;
|
|
5
|
+
assignedBy: string;
|
|
6
|
+
assignedTo?: string;
|
|
7
|
+
threadId?: string;
|
|
8
|
+
tool?: string;
|
|
9
|
+
description: string;
|
|
10
|
+
prompt: string;
|
|
11
|
+
result?: string;
|
|
12
|
+
error?: string;
|
|
13
|
+
createdAt: string;
|
|
14
|
+
updatedAt: string;
|
|
15
|
+
notifiedAt?: string;
|
|
16
|
+
/** Role name of the intended assignee (e.g. "coder", "reviewer") */
|
|
17
|
+
assignee?: string;
|
|
18
|
+
/** Role name of the task creator */
|
|
19
|
+
assigner?: string;
|
|
20
|
+
/** Task type: regular task or code review */
|
|
21
|
+
type?: "task" | "review";
|
|
22
|
+
/** Review verdict */
|
|
23
|
+
reviewStatus?: "pending" | "approved" | "changes_requested";
|
|
24
|
+
/** Reviewer feedback text */
|
|
25
|
+
reviewFeedback?: string;
|
|
26
|
+
/** Git diff associated with the task */
|
|
27
|
+
diff?: string;
|
|
28
|
+
/** Revision iteration count (incremented on each review round-trip) */
|
|
29
|
+
iteration?: number;
|
|
30
|
+
/** ID of the task this review refers to */
|
|
31
|
+
reviewOf?: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Read a single task by ID.
|
|
35
|
+
*/
|
|
36
|
+
export declare function readTask(id: string): Task | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* Read all tasks from the tasks directory.
|
|
39
|
+
*/
|
|
40
|
+
export declare function readAllTasks(): Task[];
|
|
41
|
+
/**
|
|
42
|
+
* Write a task to disk with file locking.
|
|
43
|
+
*/
|
|
44
|
+
export declare function writeTask(task: Task): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Returns true if the session has an active (assigned) task.
|
|
47
|
+
*/
|
|
48
|
+
export declare function hasActiveTask(sessionId: string): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Remove done/failed tasks older than maxAgeMs.
|
|
51
|
+
*/
|
|
52
|
+
export declare function cleanupTasks(maxAgeMs: number): void;
|
|
53
|
+
/**
|
|
54
|
+
* List pending review tasks assigned to a given role.
|
|
55
|
+
*/
|
|
56
|
+
export declare function listPendingReviews(role: string): Task[];
|
|
57
|
+
/**
|
|
58
|
+
* List active tasks assigned to a given role (pending or assigned, not done/failed).
|
|
59
|
+
*/
|
|
60
|
+
export declare function listTasksForRole(role: string): Task[];
|
package/dist/tasks.js
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, unlinkSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import * as lockfile from "proper-lockfile";
|
|
4
|
+
import { getTasksDir } from "./paths.js";
|
|
5
|
+
const LOCK_RETRIES = { retries: 5, minTimeout: 50 };
|
|
6
|
+
/**
|
|
7
|
+
* Get the tasks directory path, creating it if needed.
|
|
8
|
+
*/
|
|
9
|
+
function ensureTasksDir() {
|
|
10
|
+
const dir = getTasksDir();
|
|
11
|
+
if (!existsSync(dir)) {
|
|
12
|
+
mkdirSync(dir, { recursive: true });
|
|
13
|
+
}
|
|
14
|
+
return dir;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Read a single task by ID.
|
|
18
|
+
*/
|
|
19
|
+
export function readTask(id) {
|
|
20
|
+
const filePath = join(ensureTasksDir(), `${id}.json`);
|
|
21
|
+
if (!existsSync(filePath))
|
|
22
|
+
return undefined;
|
|
23
|
+
try {
|
|
24
|
+
return JSON.parse(readFileSync(filePath, "utf-8"));
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Read all tasks from the tasks directory.
|
|
32
|
+
*/
|
|
33
|
+
export function readAllTasks() {
|
|
34
|
+
const dir = ensureTasksDir();
|
|
35
|
+
const tasks = [];
|
|
36
|
+
let files;
|
|
37
|
+
try {
|
|
38
|
+
files = readdirSync(dir).filter((f) => f.endsWith(".json"));
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return tasks;
|
|
42
|
+
}
|
|
43
|
+
for (const file of files) {
|
|
44
|
+
try {
|
|
45
|
+
const data = readFileSync(join(dir, file), "utf-8");
|
|
46
|
+
tasks.push(JSON.parse(data));
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// skip corrupt files
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return tasks;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Write a task to disk with file locking.
|
|
56
|
+
*/
|
|
57
|
+
export async function writeTask(task) {
|
|
58
|
+
const dir = ensureTasksDir();
|
|
59
|
+
const filePath = join(dir, `${task.id}.json`);
|
|
60
|
+
// Ensure the file exists for proper-lockfile (it locks existing files)
|
|
61
|
+
if (!existsSync(filePath)) {
|
|
62
|
+
writeFileSync(filePath, "{}");
|
|
63
|
+
}
|
|
64
|
+
let release;
|
|
65
|
+
try {
|
|
66
|
+
release = await lockfile.lock(filePath, { retries: LOCK_RETRIES });
|
|
67
|
+
task.updatedAt = new Date().toISOString();
|
|
68
|
+
writeFileSync(filePath, JSON.stringify(task, null, 2) + "\n");
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
if (release)
|
|
72
|
+
await release();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Returns true if the session has an active (assigned) task.
|
|
77
|
+
*/
|
|
78
|
+
export function hasActiveTask(sessionId) {
|
|
79
|
+
const all = readAllTasks();
|
|
80
|
+
return all.some((t) => ["assigned", "in_progress", "blocked"].includes(t.status) && t.assignedTo === sessionId);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Remove done/failed tasks older than maxAgeMs.
|
|
84
|
+
*/
|
|
85
|
+
export function cleanupTasks(maxAgeMs) {
|
|
86
|
+
const dir = ensureTasksDir();
|
|
87
|
+
const now = Date.now();
|
|
88
|
+
let files;
|
|
89
|
+
try {
|
|
90
|
+
files = readdirSync(dir).filter((f) => f.endsWith(".json"));
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
for (const file of files) {
|
|
96
|
+
try {
|
|
97
|
+
const data = readFileSync(join(dir, file), "utf-8");
|
|
98
|
+
const task = JSON.parse(data);
|
|
99
|
+
if ((task.status === "done" || task.status === "failed") && now - new Date(task.updatedAt).getTime() > maxAgeMs) {
|
|
100
|
+
unlinkSync(join(dir, file));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// skip
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* List pending review tasks assigned to a given role.
|
|
110
|
+
*/
|
|
111
|
+
export function listPendingReviews(role) {
|
|
112
|
+
return readAllTasks().filter((t) => t.type === "review" && t.assignee === role && t.status === "pending" && t.reviewStatus === "pending");
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* List active tasks assigned to a given role (pending or assigned, not done/failed).
|
|
116
|
+
*/
|
|
117
|
+
export function listTasksForRole(role) {
|
|
118
|
+
return readAllTasks().filter((t) => t.assignee === role && t.status !== "done" && t.status !== "failed");
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=tasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../src/tasks.ts"],"names":[],"mappings":"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"}
|
package/dist/team.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface RoleConfig {
|
|
2
|
+
description: string;
|
|
3
|
+
/** Role that reviews this role's work */
|
|
4
|
+
reviewedBy?: string;
|
|
5
|
+
/** Whether this role can directly edit code */
|
|
6
|
+
canEdit?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface TeamConfig {
|
|
9
|
+
roles: Record<string, RoleConfig>;
|
|
10
|
+
defaultRole: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function getDefaultTeamConfig(): TeamConfig;
|
|
13
|
+
/**
|
|
14
|
+
* Load team config: project .aimux/team.json → global ~/.aimux/team.json → built-in defaults.
|
|
15
|
+
*/
|
|
16
|
+
export declare function loadTeamConfig(): TeamConfig;
|
|
17
|
+
/**
|
|
18
|
+
* Save team config at the project level.
|
|
19
|
+
*/
|
|
20
|
+
export declare function saveTeamConfig(config: TeamConfig): void;
|
|
21
|
+
/**
|
|
22
|
+
* Save team config at the global level (~/.aimux/team.json).
|
|
23
|
+
*/
|
|
24
|
+
export declare function saveGlobalTeamConfig(config: TeamConfig): void;
|
|
25
|
+
/**
|
|
26
|
+
* Build a role-specific preamble string for injection into an agent's system prompt.
|
|
27
|
+
*/
|
|
28
|
+
export declare function buildRolePreamble(role: string, config: TeamConfig): string;
|