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
package/dist/paths.js
ADDED
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Central path resolution for aimux.
|
|
3
|
+
*
|
|
4
|
+
* Two locations:
|
|
5
|
+
* - In-repo: {repoRoot}/.aimux/ → agent-facing shared artifacts
|
|
6
|
+
* (config, team, plans, context, history, tasks, status, threads, sessions.json)
|
|
7
|
+
* - Global: ~/.aimux/projects/<project-id>/ → runtime-private state
|
|
8
|
+
* (recordings, metadata, instance ownership, statusline internals, offline state)
|
|
9
|
+
*
|
|
10
|
+
* Must call `await initPaths(cwd)` once at startup before using sync path functions.
|
|
11
|
+
*/
|
|
12
|
+
import { createHash } from "node:crypto";
|
|
13
|
+
import { execSync } from "node:child_process";
|
|
14
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, cpSync, readdirSync } from "node:fs";
|
|
15
|
+
import { join, basename, resolve, dirname } from "node:path";
|
|
16
|
+
import { homedir } from "node:os";
|
|
17
|
+
// ── Cached state (populated by initPaths) ──────────────────────────
|
|
18
|
+
let _repoRoot = null;
|
|
19
|
+
let _projectId = null;
|
|
20
|
+
function assertInitialized() {
|
|
21
|
+
if (!_repoRoot || !_projectId) {
|
|
22
|
+
throw new Error("paths not initialized — call initPaths() first");
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
// ── Project ID resolution ──────────────────────────────────────────
|
|
26
|
+
function resolveRepoRoot(cwd) {
|
|
27
|
+
try {
|
|
28
|
+
const gitCommonDir = execSync("git rev-parse --git-common-dir", {
|
|
29
|
+
cwd,
|
|
30
|
+
encoding: "utf-8",
|
|
31
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
32
|
+
}).trim();
|
|
33
|
+
// gitCommonDir is either ".git" (main worktree) or an absolute path
|
|
34
|
+
const absGitDir = resolve(cwd, gitCommonDir);
|
|
35
|
+
return dirname(absGitDir);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// Not a git repo — use cwd
|
|
39
|
+
return resolve(cwd);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function computeProjectId(repoRoot) {
|
|
43
|
+
const hash = createHash("sha256").update(repoRoot).digest("hex").slice(0, 12);
|
|
44
|
+
const name = basename(repoRoot);
|
|
45
|
+
return `${name}-${hash}`;
|
|
46
|
+
}
|
|
47
|
+
export async function initPaths(cwd) {
|
|
48
|
+
const dir = cwd ?? process.cwd();
|
|
49
|
+
_repoRoot = resolveRepoRoot(dir);
|
|
50
|
+
_projectId = computeProjectId(_repoRoot);
|
|
51
|
+
// Ensure global project dir exists
|
|
52
|
+
const projectDir = getProjectStateDir();
|
|
53
|
+
if (!existsSync(projectDir)) {
|
|
54
|
+
mkdirSync(projectDir, { recursive: true });
|
|
55
|
+
}
|
|
56
|
+
writeFileSync(join(projectDir, "project-root.txt"), `${_repoRoot}\n`);
|
|
57
|
+
ensureLocalSharedDirs();
|
|
58
|
+
migrateAgentFacingStateToLocal();
|
|
59
|
+
registerProject();
|
|
60
|
+
}
|
|
61
|
+
export function getRepoRoot() {
|
|
62
|
+
assertInitialized();
|
|
63
|
+
return _repoRoot;
|
|
64
|
+
}
|
|
65
|
+
export function getProjectId() {
|
|
66
|
+
assertInitialized();
|
|
67
|
+
return _projectId;
|
|
68
|
+
}
|
|
69
|
+
export function getProjectIdFor(cwd) {
|
|
70
|
+
return computeProjectId(resolveRepoRoot(cwd));
|
|
71
|
+
}
|
|
72
|
+
export function getProjectStateDirFor(cwd) {
|
|
73
|
+
return join(getGlobalAimuxDir(), "projects", getProjectIdFor(cwd));
|
|
74
|
+
}
|
|
75
|
+
export function getProjectStateDirById(projectId) {
|
|
76
|
+
return join(getGlobalAimuxDir(), "projects", projectId);
|
|
77
|
+
}
|
|
78
|
+
// ── Global paths (~/.aimux/...) ────────────────────────────────────
|
|
79
|
+
const HOME = homedir();
|
|
80
|
+
export function getGlobalAimuxDir() {
|
|
81
|
+
return join(HOME, ".aimux");
|
|
82
|
+
}
|
|
83
|
+
export function getDaemonDir() {
|
|
84
|
+
return join(getGlobalAimuxDir(), "daemon");
|
|
85
|
+
}
|
|
86
|
+
export function getDaemonInfoPath() {
|
|
87
|
+
return join(getDaemonDir(), "daemon.json");
|
|
88
|
+
}
|
|
89
|
+
export function getDaemonStatePath() {
|
|
90
|
+
return join(getDaemonDir(), "state.json");
|
|
91
|
+
}
|
|
92
|
+
export function getProjectStateDir() {
|
|
93
|
+
assertInitialized();
|
|
94
|
+
return join(getGlobalAimuxDir(), "projects", _projectId);
|
|
95
|
+
}
|
|
96
|
+
export function getStatePath() {
|
|
97
|
+
return join(getProjectStateDir(), "state.json");
|
|
98
|
+
}
|
|
99
|
+
export function getGraveyardPath() {
|
|
100
|
+
return join(getProjectStateDir(), "graveyard.json");
|
|
101
|
+
}
|
|
102
|
+
export function getContextDir() {
|
|
103
|
+
return join(getLocalAimuxDir(), "context");
|
|
104
|
+
}
|
|
105
|
+
export function getContextPathForDate(date) {
|
|
106
|
+
const yyyy = date.getFullYear();
|
|
107
|
+
const mm = String(date.getMonth() + 1).padStart(2, "0");
|
|
108
|
+
const dd = String(date.getDate()).padStart(2, "0");
|
|
109
|
+
return join(getContextDir(), `${yyyy}-${mm}-${dd}.md`);
|
|
110
|
+
}
|
|
111
|
+
export function getHistoryDir() {
|
|
112
|
+
return join(getLocalAimuxDir(), "history");
|
|
113
|
+
}
|
|
114
|
+
export function getRecordingsDir() {
|
|
115
|
+
return join(getProjectStateDir(), "recordings");
|
|
116
|
+
}
|
|
117
|
+
export function getTasksDir() {
|
|
118
|
+
return join(getLocalAimuxDir(), "tasks");
|
|
119
|
+
}
|
|
120
|
+
export function getStatusDir() {
|
|
121
|
+
return join(getLocalAimuxDir(), "status");
|
|
122
|
+
}
|
|
123
|
+
export function getInstancesPath() {
|
|
124
|
+
return join(getProjectStateDir(), "instances.json");
|
|
125
|
+
}
|
|
126
|
+
export function getMetadataPath() {
|
|
127
|
+
return join(getProjectStateDir(), "metadata.json");
|
|
128
|
+
}
|
|
129
|
+
export function getNotificationsPath() {
|
|
130
|
+
return join(getProjectStateDir(), "notifications.json");
|
|
131
|
+
}
|
|
132
|
+
export function getNotificationContextPath() {
|
|
133
|
+
return join(getProjectStateDir(), "notification-context.json");
|
|
134
|
+
}
|
|
135
|
+
export function getMetadataEndpointPath() {
|
|
136
|
+
return join(getProjectStateDir(), "metadata-api.json");
|
|
137
|
+
}
|
|
138
|
+
// ── In-repo paths ({repoRoot}/.aimux/...) ──────────────────────────
|
|
139
|
+
export function getLocalAimuxDir() {
|
|
140
|
+
assertInitialized();
|
|
141
|
+
return join(_repoRoot, ".aimux");
|
|
142
|
+
}
|
|
143
|
+
export function getConfigPath() {
|
|
144
|
+
return join(getLocalAimuxDir(), "config.json");
|
|
145
|
+
}
|
|
146
|
+
export function getProjectTeamPath() {
|
|
147
|
+
return join(getLocalAimuxDir(), "team.json");
|
|
148
|
+
}
|
|
149
|
+
export function getPlansDir() {
|
|
150
|
+
return join(getLocalAimuxDir(), "plans");
|
|
151
|
+
}
|
|
152
|
+
export function getThreadsDir() {
|
|
153
|
+
return join(getLocalAimuxDir(), "threads");
|
|
154
|
+
}
|
|
155
|
+
export function getAttachmentsDir() {
|
|
156
|
+
return join(getLocalAimuxDir(), "attachments");
|
|
157
|
+
}
|
|
158
|
+
export function getSessionMessagesDir() {
|
|
159
|
+
return join(getLocalAimuxDir(), "session-messages");
|
|
160
|
+
}
|
|
161
|
+
/** Escape hatch for cross-worktree operations. Prefer the no-arg variants above. */
|
|
162
|
+
export function getAimuxDirFor(cwd) {
|
|
163
|
+
return join(resolveRepoRoot(cwd), ".aimux");
|
|
164
|
+
}
|
|
165
|
+
function ensureLocalSharedDirs() {
|
|
166
|
+
const localDir = getLocalAimuxDir();
|
|
167
|
+
mkdirSync(localDir, { recursive: true });
|
|
168
|
+
for (const subdir of [
|
|
169
|
+
"plans",
|
|
170
|
+
"context",
|
|
171
|
+
"history",
|
|
172
|
+
"tasks",
|
|
173
|
+
"status",
|
|
174
|
+
"threads",
|
|
175
|
+
"attachments",
|
|
176
|
+
"session-messages",
|
|
177
|
+
]) {
|
|
178
|
+
mkdirSync(join(localDir, subdir), { recursive: true });
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
function migrateDirIfNeeded(globalSubdir, localDir) {
|
|
182
|
+
const source = join(getProjectStateDir(), globalSubdir);
|
|
183
|
+
if (!existsSync(source) || !existsSync(localDir))
|
|
184
|
+
return;
|
|
185
|
+
const hasLocalEntries = (() => {
|
|
186
|
+
try {
|
|
187
|
+
return readdirSync(localDir).length > 0;
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
})();
|
|
193
|
+
if (hasLocalEntries)
|
|
194
|
+
return;
|
|
195
|
+
try {
|
|
196
|
+
cpSync(source, localDir, { recursive: true, force: false });
|
|
197
|
+
}
|
|
198
|
+
catch { }
|
|
199
|
+
}
|
|
200
|
+
function migrateAgentFacingStateToLocal() {
|
|
201
|
+
migrateDirIfNeeded("context", getContextDir());
|
|
202
|
+
migrateDirIfNeeded("history", getHistoryDir());
|
|
203
|
+
migrateDirIfNeeded("tasks", getTasksDir());
|
|
204
|
+
migrateDirIfNeeded("status", getStatusDir());
|
|
205
|
+
}
|
|
206
|
+
// ── Global non-project paths ───────────────────────────────────────
|
|
207
|
+
export function getGlobalConfigPath() {
|
|
208
|
+
return join(getGlobalAimuxDir(), "config.json");
|
|
209
|
+
}
|
|
210
|
+
export function getGlobalTeamPath() {
|
|
211
|
+
return join(getGlobalAimuxDir(), "team.json");
|
|
212
|
+
}
|
|
213
|
+
export function getProjectsRegistryPath() {
|
|
214
|
+
return join(getGlobalAimuxDir(), "projects.json");
|
|
215
|
+
}
|
|
216
|
+
function loadRegistry() {
|
|
217
|
+
const path = getProjectsRegistryPath();
|
|
218
|
+
if (!existsSync(path))
|
|
219
|
+
return { version: 1, projects: [] };
|
|
220
|
+
try {
|
|
221
|
+
return JSON.parse(readFileSync(path, "utf-8"));
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
return { version: 1, projects: [] };
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
function saveRegistry(registry) {
|
|
228
|
+
const dir = getGlobalAimuxDir();
|
|
229
|
+
if (!existsSync(dir))
|
|
230
|
+
mkdirSync(dir, { recursive: true });
|
|
231
|
+
writeFileSync(getProjectsRegistryPath(), JSON.stringify(registry, null, 2) + "\n");
|
|
232
|
+
}
|
|
233
|
+
function registerProject() {
|
|
234
|
+
assertInitialized();
|
|
235
|
+
const registry = loadRegistry();
|
|
236
|
+
const idx = registry.projects.findIndex((p) => p.id === _projectId);
|
|
237
|
+
const entry = {
|
|
238
|
+
id: _projectId,
|
|
239
|
+
name: basename(_repoRoot),
|
|
240
|
+
repoRoot: _repoRoot,
|
|
241
|
+
lastSeen: new Date().toISOString(),
|
|
242
|
+
};
|
|
243
|
+
if (idx >= 0) {
|
|
244
|
+
registry.projects[idx] = entry;
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
registry.projects.push(entry);
|
|
248
|
+
}
|
|
249
|
+
saveRegistry(registry);
|
|
250
|
+
}
|
|
251
|
+
export function listProjects() {
|
|
252
|
+
return loadRegistry().projects;
|
|
253
|
+
}
|
|
254
|
+
export function removeProject(id) {
|
|
255
|
+
const registry = loadRegistry();
|
|
256
|
+
registry.projects = registry.projects.filter((p) => p.id !== id);
|
|
257
|
+
saveRegistry(registry);
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type MetadataTone, type MetadataApiEndpoint, type SessionContextMetadata, type SessionServiceMetadata } from "./metadata-store.js";
|
|
2
|
+
import type { AgentActivityState, AgentAttentionState, AgentEvent } from "./agent-events.js";
|
|
3
|
+
import { type AlertKind, type ProjectEventBus } from "./project-events.js";
|
|
4
|
+
export interface AimuxMetadataAPI {
|
|
5
|
+
setStatus(session: string, text: string, tone?: MetadataTone): void;
|
|
6
|
+
setProgress(session: string, current: number, total: number, label?: string): void;
|
|
7
|
+
log(session: string, message: string, opts?: {
|
|
8
|
+
source?: string;
|
|
9
|
+
tone?: MetadataTone;
|
|
10
|
+
}): void;
|
|
11
|
+
clearLog(session: string): void;
|
|
12
|
+
setContext(session: string, context: SessionContextMetadata): void;
|
|
13
|
+
setServices(session: string, services: SessionServiceMetadata[]): void;
|
|
14
|
+
emitEvent(session: string, event: AgentEvent): void;
|
|
15
|
+
markSeen(session: string): void;
|
|
16
|
+
setActivity(session: string, activity: AgentActivityState): void;
|
|
17
|
+
setAttention(session: string, attention: AgentAttentionState): void;
|
|
18
|
+
}
|
|
19
|
+
export interface AimuxPluginAPI {
|
|
20
|
+
projectRoot: string;
|
|
21
|
+
projectId: string;
|
|
22
|
+
serverHost: string;
|
|
23
|
+
serverPort: number;
|
|
24
|
+
metadata: AimuxMetadataAPI;
|
|
25
|
+
}
|
|
26
|
+
export interface AimuxPluginInstance {
|
|
27
|
+
start?(): void | Promise<void>;
|
|
28
|
+
stop?(): void | Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
export declare class PluginRuntime {
|
|
31
|
+
private readonly endpoint;
|
|
32
|
+
private readonly eventBus?;
|
|
33
|
+
private instances;
|
|
34
|
+
constructor(endpoint: MetadataApiEndpoint, eventBus?: ProjectEventBus | undefined);
|
|
35
|
+
private publishEventAlert;
|
|
36
|
+
start(): Promise<void>;
|
|
37
|
+
stop(): Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
export declare function deriveAlertFromAgentEvent(sessionId: string, event: AgentEvent): {
|
|
40
|
+
kind: AlertKind;
|
|
41
|
+
sessionId: string;
|
|
42
|
+
title: string;
|
|
43
|
+
message: string;
|
|
44
|
+
dedupeKey: string;
|
|
45
|
+
cooldownMs: number;
|
|
46
|
+
} | undefined;
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { existsSync, readdirSync, statSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { pathToFileURL } from "node:url";
|
|
4
|
+
import { getGlobalAimuxDir, getLocalAimuxDir, getProjectId, getRepoRoot } from "./paths.js";
|
|
5
|
+
import { updateSessionMetadata, clearSessionLogs, } from "./metadata-store.js";
|
|
6
|
+
import { debug } from "./debug.js";
|
|
7
|
+
import { createBuiltinMetadataWatchers } from "./builtin-metadata-watchers.js";
|
|
8
|
+
import { AgentTracker } from "./agent-tracker.js";
|
|
9
|
+
import { createToolOutputWatcher } from "./tool-output-watchers.js";
|
|
10
|
+
function listPluginFiles(dir) {
|
|
11
|
+
if (!existsSync(dir))
|
|
12
|
+
return [];
|
|
13
|
+
return readdirSync(dir)
|
|
14
|
+
.filter((entry) => entry.endsWith(".js") || entry.endsWith(".mjs"))
|
|
15
|
+
.map((entry) => join(dir, entry))
|
|
16
|
+
.filter((path) => statSync(path).isFile());
|
|
17
|
+
}
|
|
18
|
+
export class PluginRuntime {
|
|
19
|
+
endpoint;
|
|
20
|
+
eventBus;
|
|
21
|
+
instances = [];
|
|
22
|
+
constructor(endpoint, eventBus) {
|
|
23
|
+
this.endpoint = endpoint;
|
|
24
|
+
this.eventBus = eventBus;
|
|
25
|
+
}
|
|
26
|
+
publishEventAlert(sessionId, event) {
|
|
27
|
+
if (!this.eventBus)
|
|
28
|
+
return;
|
|
29
|
+
const alert = deriveAlertFromAgentEvent(sessionId, event);
|
|
30
|
+
if (!alert)
|
|
31
|
+
return;
|
|
32
|
+
this.eventBus.publishAlert(alert);
|
|
33
|
+
}
|
|
34
|
+
async start() {
|
|
35
|
+
const tracker = new AgentTracker();
|
|
36
|
+
const api = {
|
|
37
|
+
projectRoot: getRepoRoot(),
|
|
38
|
+
projectId: getProjectId(),
|
|
39
|
+
serverHost: this.endpoint.host,
|
|
40
|
+
serverPort: this.endpoint.port,
|
|
41
|
+
metadata: {
|
|
42
|
+
setStatus: (session, text, tone) => {
|
|
43
|
+
updateSessionMetadata(session, (current) => ({
|
|
44
|
+
...current,
|
|
45
|
+
status: { text, tone },
|
|
46
|
+
}));
|
|
47
|
+
},
|
|
48
|
+
setProgress: (session, current, total, label) => {
|
|
49
|
+
updateSessionMetadata(session, (existing) => ({
|
|
50
|
+
...existing,
|
|
51
|
+
progress: { current, total, label },
|
|
52
|
+
}));
|
|
53
|
+
},
|
|
54
|
+
log: (session, message, opts) => {
|
|
55
|
+
updateSessionMetadata(session, (existing) => ({
|
|
56
|
+
...existing,
|
|
57
|
+
logs: [
|
|
58
|
+
...(existing.logs ?? []).slice(-19),
|
|
59
|
+
{ message, source: opts?.source, tone: opts?.tone, ts: new Date().toISOString() },
|
|
60
|
+
],
|
|
61
|
+
}));
|
|
62
|
+
},
|
|
63
|
+
clearLog: (session) => {
|
|
64
|
+
clearSessionLogs(session);
|
|
65
|
+
},
|
|
66
|
+
setContext: (session, context) => {
|
|
67
|
+
updateSessionMetadata(session, (existing) => ({
|
|
68
|
+
...existing,
|
|
69
|
+
context: {
|
|
70
|
+
...(existing.context ?? {}),
|
|
71
|
+
...context,
|
|
72
|
+
},
|
|
73
|
+
}));
|
|
74
|
+
},
|
|
75
|
+
setServices: (session, services) => {
|
|
76
|
+
updateSessionMetadata(session, (existing) => ({
|
|
77
|
+
...existing,
|
|
78
|
+
derived: {
|
|
79
|
+
...(existing.derived ?? {}),
|
|
80
|
+
services,
|
|
81
|
+
},
|
|
82
|
+
}));
|
|
83
|
+
},
|
|
84
|
+
emitEvent: (session, event) => {
|
|
85
|
+
tracker.emit(session, event);
|
|
86
|
+
this.publishEventAlert(session, event);
|
|
87
|
+
},
|
|
88
|
+
markSeen: (session) => {
|
|
89
|
+
tracker.markSeen(session);
|
|
90
|
+
},
|
|
91
|
+
setActivity: (session, activity) => {
|
|
92
|
+
tracker.setActivity(session, activity);
|
|
93
|
+
},
|
|
94
|
+
setAttention: (session, attention) => {
|
|
95
|
+
tracker.setAttention(session, attention);
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
for (const watcher of createBuiltinMetadataWatchers(api)) {
|
|
100
|
+
if (watcher.start)
|
|
101
|
+
await watcher.start();
|
|
102
|
+
this.instances.push(watcher);
|
|
103
|
+
}
|
|
104
|
+
const outputWatcher = createToolOutputWatcher({ api });
|
|
105
|
+
if (outputWatcher.start)
|
|
106
|
+
await outputWatcher.start();
|
|
107
|
+
this.instances.push(outputWatcher);
|
|
108
|
+
const pluginFiles = [
|
|
109
|
+
...listPluginFiles(join(getGlobalAimuxDir(), "plugins")),
|
|
110
|
+
...listPluginFiles(join(getLocalAimuxDir(), "plugins")),
|
|
111
|
+
];
|
|
112
|
+
for (const file of pluginFiles) {
|
|
113
|
+
try {
|
|
114
|
+
const mod = (await import(pathToFileURL(file).href));
|
|
115
|
+
if (typeof mod.default !== "function")
|
|
116
|
+
continue;
|
|
117
|
+
const instance = await mod.default(api);
|
|
118
|
+
if (instance?.start)
|
|
119
|
+
await instance.start();
|
|
120
|
+
if (instance)
|
|
121
|
+
this.instances.push(instance);
|
|
122
|
+
debug(`loaded plugin ${file}`, "plugin");
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
debug(`failed plugin ${file}: ${error instanceof Error ? error.message : String(error)}`, "plugin");
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
async stop() {
|
|
130
|
+
for (const instance of this.instances.reverse()) {
|
|
131
|
+
try {
|
|
132
|
+
await instance.stop?.();
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
debug(`plugin stop failed: ${error instanceof Error ? error.message : String(error)}`, "plugin");
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
this.instances = [];
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
export function deriveAlertFromAgentEvent(sessionId, event) {
|
|
142
|
+
let kind = null;
|
|
143
|
+
if (event.kind === "needs_input")
|
|
144
|
+
kind = "needs_input";
|
|
145
|
+
else if (event.kind === "blocked")
|
|
146
|
+
kind = "blocked";
|
|
147
|
+
else if (event.kind === "task_done")
|
|
148
|
+
kind = "task_done";
|
|
149
|
+
else if (event.kind === "task_failed")
|
|
150
|
+
kind = "task_failed";
|
|
151
|
+
else if (event.kind === "notify" && event.tone === "error")
|
|
152
|
+
kind = "task_failed";
|
|
153
|
+
if (!kind)
|
|
154
|
+
return undefined;
|
|
155
|
+
const sessionLabel = sessionId.trim() || "agent";
|
|
156
|
+
const title = kind === "needs_input"
|
|
157
|
+
? `${sessionLabel} needs input`
|
|
158
|
+
: kind === "blocked"
|
|
159
|
+
? `${sessionLabel} is blocked`
|
|
160
|
+
: kind === "task_done"
|
|
161
|
+
? `${sessionLabel} finished`
|
|
162
|
+
: `${sessionLabel} failed`;
|
|
163
|
+
const message = event.message?.trim() ||
|
|
164
|
+
(kind === "needs_input"
|
|
165
|
+
? "Agent is ready for your input."
|
|
166
|
+
: kind === "blocked"
|
|
167
|
+
? "Agent is blocked."
|
|
168
|
+
: kind === "task_done"
|
|
169
|
+
? "Agent completed its work."
|
|
170
|
+
: "Agent hit an error.");
|
|
171
|
+
return {
|
|
172
|
+
kind,
|
|
173
|
+
sessionId,
|
|
174
|
+
title,
|
|
175
|
+
message,
|
|
176
|
+
dedupeKey: `${kind}:${sessionId}`,
|
|
177
|
+
cooldownMs: kind === "task_done" ? 10_000 : 15_000,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=plugin-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-runtime.js","sourceRoot":"","sources":["../src/plugin-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export type AlertKind = "notification" | "needs_input" | "task_done" | "task_failed" | "blocked" | "message_waiting" | "handoff_waiting" | "task_assigned" | "review_waiting";
|
|
2
|
+
export interface AlertEvent {
|
|
3
|
+
type: "alert";
|
|
4
|
+
kind: AlertKind;
|
|
5
|
+
projectId: string;
|
|
6
|
+
sessionId?: string;
|
|
7
|
+
title: string;
|
|
8
|
+
message: string;
|
|
9
|
+
ts: string;
|
|
10
|
+
threadId?: string;
|
|
11
|
+
taskId?: string;
|
|
12
|
+
worktreePath?: string;
|
|
13
|
+
dedupeKey?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface HistoryUpdateEvent {
|
|
16
|
+
type: "history_update";
|
|
17
|
+
projectId: string;
|
|
18
|
+
sessionId: string;
|
|
19
|
+
ts: string;
|
|
20
|
+
messages: unknown[];
|
|
21
|
+
lastN?: number;
|
|
22
|
+
}
|
|
23
|
+
export type ProjectStreamEvent = AlertEvent | HistoryUpdateEvent;
|
|
24
|
+
type ProjectEventListener = (event: ProjectStreamEvent) => void;
|
|
25
|
+
export declare class ProjectEventBus {
|
|
26
|
+
private listeners;
|
|
27
|
+
private alertCooldowns;
|
|
28
|
+
subscribe(listener: ProjectEventListener): () => void;
|
|
29
|
+
publish(event: ProjectStreamEvent): void;
|
|
30
|
+
publishHistoryUpdate(input: Omit<HistoryUpdateEvent, "type" | "projectId" | "ts">): void;
|
|
31
|
+
publishAlert(alert: Omit<AlertEvent, "type" | "projectId" | "ts"> & {
|
|
32
|
+
dedupeKey?: string;
|
|
33
|
+
cooldownMs?: number;
|
|
34
|
+
}): boolean;
|
|
35
|
+
}
|
|
36
|
+
export {};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { getProjectId } from "./paths.js";
|
|
2
|
+
import { addNotification } from "./notifications.js";
|
|
3
|
+
export class ProjectEventBus {
|
|
4
|
+
listeners = new Set();
|
|
5
|
+
alertCooldowns = new Map();
|
|
6
|
+
subscribe(listener) {
|
|
7
|
+
this.listeners.add(listener);
|
|
8
|
+
return () => {
|
|
9
|
+
this.listeners.delete(listener);
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
publish(event) {
|
|
13
|
+
for (const listener of this.listeners) {
|
|
14
|
+
listener(event);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
publishHistoryUpdate(input) {
|
|
18
|
+
this.publish({
|
|
19
|
+
type: "history_update",
|
|
20
|
+
projectId: getProjectId(),
|
|
21
|
+
ts: new Date().toISOString(),
|
|
22
|
+
sessionId: input.sessionId,
|
|
23
|
+
messages: input.messages,
|
|
24
|
+
lastN: input.lastN,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
publishAlert(alert) {
|
|
28
|
+
const cooldownMs = alert.cooldownMs ?? 15_000;
|
|
29
|
+
const dedupeKey = alert.dedupeKey?.trim() || undefined;
|
|
30
|
+
if (dedupeKey) {
|
|
31
|
+
const now = Date.now();
|
|
32
|
+
const until = this.alertCooldowns.get(dedupeKey) ?? 0;
|
|
33
|
+
if (until > now) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
this.alertCooldowns.set(dedupeKey, now + cooldownMs);
|
|
37
|
+
}
|
|
38
|
+
const event = {
|
|
39
|
+
type: "alert",
|
|
40
|
+
projectId: getProjectId(),
|
|
41
|
+
ts: new Date().toISOString(),
|
|
42
|
+
kind: alert.kind,
|
|
43
|
+
sessionId: alert.sessionId,
|
|
44
|
+
title: alert.title,
|
|
45
|
+
message: alert.message,
|
|
46
|
+
threadId: alert.threadId,
|
|
47
|
+
taskId: alert.taskId,
|
|
48
|
+
worktreePath: alert.worktreePath,
|
|
49
|
+
dedupeKey,
|
|
50
|
+
};
|
|
51
|
+
addNotification({
|
|
52
|
+
title: event.title,
|
|
53
|
+
body: event.message,
|
|
54
|
+
sessionId: event.sessionId,
|
|
55
|
+
kind: event.kind,
|
|
56
|
+
dedupeKey: event.dedupeKey,
|
|
57
|
+
createdAt: event.ts,
|
|
58
|
+
});
|
|
59
|
+
this.publish(event);
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=project-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-events.js","sourceRoot":"","sources":["../src/project-events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAwCrD,MAAM,OAAO,eAAe;IAClB,SAAS,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC5C,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEnD,SAAS,CAAC,QAA8B;QACtC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,KAAyB;QAC/B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,oBAAoB,CAAC,KAA4D;QAC/E,IAAI,CAAC,OAAO,CAAC;YACX,IAAI,EAAE,gBAAgB;YACtB,SAAS,EAAE,YAAY,EAAE;YACzB,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,KAAK,EAAE,KAAK,CAAC,KAAK;SACnB,CAAC,CAAC;IACL,CAAC;IAED,YAAY,CACV,KAGC;QAED,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,MAAM,CAAC;QAC9C,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;QACvD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACtD,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;gBAChB,OAAO,KAAK,CAAC;YACf,CAAC;YACD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,GAAG,UAAU,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,KAAK,GAAG;YACZ,IAAI,EAAE,OAAO;YACb,SAAS,EAAE,YAAY,EAAE;YACzB,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,SAAS;SACW,CAAC;QAEvB,eAAe,CAAC;YACd,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,IAAI,EAAE,KAAK,CAAC,OAAO;YACnB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,SAAS,EAAE,KAAK,CAAC,EAAE;SACpB,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { TmuxRuntimeManager } from "./tmux-runtime-manager.js";
|
|
2
|
+
export interface GlobalSession {
|
|
3
|
+
id: string;
|
|
4
|
+
tool: string;
|
|
5
|
+
status: "running" | "idle" | "waiting" | "offline";
|
|
6
|
+
label?: string;
|
|
7
|
+
headline?: string;
|
|
8
|
+
role?: string;
|
|
9
|
+
worktreePath?: string;
|
|
10
|
+
ownerPid?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface ProjectInfo {
|
|
13
|
+
name: string;
|
|
14
|
+
path: string;
|
|
15
|
+
sessions: GlobalSession[];
|
|
16
|
+
}
|
|
17
|
+
export interface DesktopProjectInfo {
|
|
18
|
+
id: string;
|
|
19
|
+
name: string;
|
|
20
|
+
path: string;
|
|
21
|
+
lastSeen?: string;
|
|
22
|
+
dashboardSessionName: string;
|
|
23
|
+
sessions: GlobalSession[];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Discover local projects with aimux state.
|
|
27
|
+
* Uses the global projects registry plus filesystem scanning as fallback.
|
|
28
|
+
*/
|
|
29
|
+
export declare function discoverProjects(): string[];
|
|
30
|
+
/**
|
|
31
|
+
* Scan a single project for all sessions (running + offline).
|
|
32
|
+
*/
|
|
33
|
+
export declare function scanProject(projectPath: string): ProjectInfo;
|
|
34
|
+
/**
|
|
35
|
+
* Scan all discovered projects and return global state.
|
|
36
|
+
*/
|
|
37
|
+
export declare function scanAllProjects(): ProjectInfo[];
|
|
38
|
+
export declare function listDesktopProjects(tmux?: TmuxRuntimeManager): DesktopProjectInfo[];
|