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.
Files changed (207) hide show
  1. package/README.md +743 -0
  2. package/bin/aimux +2 -0
  3. package/dist/agent-events.d.ts +20 -0
  4. package/dist/agent-events.js +2 -0
  5. package/dist/agent-events.js.map +1 -0
  6. package/dist/agent-message-parts.d.ts +17 -0
  7. package/dist/agent-message-parts.js +31 -0
  8. package/dist/agent-message-parts.js.map +1 -0
  9. package/dist/agent-output-parser.d.ts +16 -0
  10. package/dist/agent-output-parser.js +229 -0
  11. package/dist/agent-output-parser.js.map +1 -0
  12. package/dist/agent-tracker.d.ts +9 -0
  13. package/dist/agent-tracker.js +144 -0
  14. package/dist/agent-tracker.js.map +1 -0
  15. package/dist/agent-watcher.d.ts +15 -0
  16. package/dist/agent-watcher.js +2 -0
  17. package/dist/agent-watcher.js.map +1 -0
  18. package/dist/attachment-store.d.ts +35 -0
  19. package/dist/attachment-store.js +129 -0
  20. package/dist/attachment-store.js.map +1 -0
  21. package/dist/builtin-metadata-watchers.d.ts +2 -0
  22. package/dist/builtin-metadata-watchers.js +275 -0
  23. package/dist/builtin-metadata-watchers.js.map +1 -0
  24. package/dist/claude-hooks.d.ts +29 -0
  25. package/dist/claude-hooks.js +106 -0
  26. package/dist/claude-hooks.js.map +1 -0
  27. package/dist/config.d.ts +78 -0
  28. package/dist/config.js +172 -0
  29. package/dist/config.js.map +1 -0
  30. package/dist/context/compactor.d.ts +20 -0
  31. package/dist/context/compactor.js +212 -0
  32. package/dist/context/compactor.js.map +1 -0
  33. package/dist/context/context-bridge.d.ts +67 -0
  34. package/dist/context/context-bridge.js +471 -0
  35. package/dist/context/context-bridge.js.map +1 -0
  36. package/dist/context/context-file.d.ts +11 -0
  37. package/dist/context/context-file.js +93 -0
  38. package/dist/context/context-file.js.map +1 -0
  39. package/dist/context/history.d.ts +40 -0
  40. package/dist/context/history.js +108 -0
  41. package/dist/context/history.js.map +1 -0
  42. package/dist/daemon.d.ts +39 -0
  43. package/dist/daemon.js +344 -0
  44. package/dist/daemon.js.map +1 -0
  45. package/dist/dashboard-session-registry.d.ts +47 -0
  46. package/dist/dashboard-session-registry.js +161 -0
  47. package/dist/dashboard-session-registry.js.map +1 -0
  48. package/dist/dashboard-state.d.ts +18 -0
  49. package/dist/dashboard-state.js +26 -0
  50. package/dist/dashboard-state.js.map +1 -0
  51. package/dist/dashboard.d.ts +118 -0
  52. package/dist/dashboard.js +91 -0
  53. package/dist/dashboard.js.map +1 -0
  54. package/dist/debug.d.ts +7 -0
  55. package/dist/debug.js +41 -0
  56. package/dist/debug.js.map +1 -0
  57. package/dist/fast-control.d.ts +45 -0
  58. package/dist/fast-control.js +174 -0
  59. package/dist/fast-control.js.map +1 -0
  60. package/dist/hotkeys.d.ts +44 -0
  61. package/dist/hotkeys.js +118 -0
  62. package/dist/hotkeys.js.map +1 -0
  63. package/dist/http-client.d.ts +10 -0
  64. package/dist/http-client.js +54 -0
  65. package/dist/http-client.js.map +1 -0
  66. package/dist/instance-directory.d.ts +32 -0
  67. package/dist/instance-directory.js +82 -0
  68. package/dist/instance-directory.js.map +1 -0
  69. package/dist/instance-registry.d.ts +38 -0
  70. package/dist/instance-registry.js +208 -0
  71. package/dist/instance-registry.js.map +1 -0
  72. package/dist/key-parser.d.ts +30 -0
  73. package/dist/key-parser.js +272 -0
  74. package/dist/key-parser.js.map +1 -0
  75. package/dist/last-used.d.ts +31 -0
  76. package/dist/last-used.js +93 -0
  77. package/dist/last-used.js.map +1 -0
  78. package/dist/main.d.ts +1 -0
  79. package/dist/main.js +2483 -0
  80. package/dist/main.js.map +1 -0
  81. package/dist/metadata-server.d.ts +268 -0
  82. package/dist/metadata-server.js +1379 -0
  83. package/dist/metadata-server.js.map +1 -0
  84. package/dist/metadata-store.d.ts +80 -0
  85. package/dist/metadata-store.js +87 -0
  86. package/dist/metadata-store.js.map +1 -0
  87. package/dist/multiplexer.d.ts +471 -0
  88. package/dist/multiplexer.js +5714 -0
  89. package/dist/multiplexer.js.map +1 -0
  90. package/dist/notification-context.d.ts +18 -0
  91. package/dist/notification-context.js +68 -0
  92. package/dist/notification-context.js.map +1 -0
  93. package/dist/notifications.d.ts +38 -0
  94. package/dist/notifications.js +111 -0
  95. package/dist/notifications.js.map +1 -0
  96. package/dist/notify.d.ts +10 -0
  97. package/dist/notify.js +62 -0
  98. package/dist/notify.js.map +1 -0
  99. package/dist/orchestration-actions.d.ts +76 -0
  100. package/dist/orchestration-actions.js +310 -0
  101. package/dist/orchestration-actions.js.map +1 -0
  102. package/dist/orchestration-dispatcher.d.ts +22 -0
  103. package/dist/orchestration-dispatcher.js +49 -0
  104. package/dist/orchestration-dispatcher.js.map +1 -0
  105. package/dist/orchestration-routing.d.ts +20 -0
  106. package/dist/orchestration-routing.js +78 -0
  107. package/dist/orchestration-routing.js.map +1 -0
  108. package/dist/orchestration.d.ts +26 -0
  109. package/dist/orchestration.js +110 -0
  110. package/dist/orchestration.js.map +1 -0
  111. package/dist/osc-notifications.d.ts +15 -0
  112. package/dist/osc-notifications.js +180 -0
  113. package/dist/osc-notifications.js.map +1 -0
  114. package/dist/paths.d.ts +55 -0
  115. package/dist/paths.js +259 -0
  116. package/dist/paths.js.map +1 -0
  117. package/dist/plugin-runtime.d.ts +46 -0
  118. package/dist/plugin-runtime.js +180 -0
  119. package/dist/plugin-runtime.js.map +1 -0
  120. package/dist/project-events.d.ts +36 -0
  121. package/dist/project-events.js +63 -0
  122. package/dist/project-events.js.map +1 -0
  123. package/dist/project-scanner.d.ts +38 -0
  124. package/dist/project-scanner.js +243 -0
  125. package/dist/project-scanner.js.map +1 -0
  126. package/dist/project-service-manifest.d.ts +18 -0
  127. package/dist/project-service-manifest.js +56 -0
  128. package/dist/project-service-manifest.js.map +1 -0
  129. package/dist/recency.d.ts +2 -0
  130. package/dist/recency.js +34 -0
  131. package/dist/recency.js.map +1 -0
  132. package/dist/recorder.d.ts +14 -0
  133. package/dist/recorder.js +130 -0
  134. package/dist/recorder.js.map +1 -0
  135. package/dist/session-bootstrap.d.ts +45 -0
  136. package/dist/session-bootstrap.js +436 -0
  137. package/dist/session-bootstrap.js.map +1 -0
  138. package/dist/session-message-history.d.ts +27 -0
  139. package/dist/session-message-history.js +105 -0
  140. package/dist/session-message-history.js.map +1 -0
  141. package/dist/session-runtime.d.ts +44 -0
  142. package/dist/session-runtime.js +56 -0
  143. package/dist/session-runtime.js.map +1 -0
  144. package/dist/session-semantics.d.ts +35 -0
  145. package/dist/session-semantics.js +110 -0
  146. package/dist/session-semantics.js.map +1 -0
  147. package/dist/status-detector.d.ts +17 -0
  148. package/dist/status-detector.js +67 -0
  149. package/dist/status-detector.js.map +1 -0
  150. package/dist/statusline-model.d.ts +103 -0
  151. package/dist/statusline-model.js +177 -0
  152. package/dist/statusline-model.js.map +1 -0
  153. package/dist/task-dispatcher.d.ts +63 -0
  154. package/dist/task-dispatcher.js +210 -0
  155. package/dist/task-dispatcher.js.map +1 -0
  156. package/dist/task-workflow.d.ts +13 -0
  157. package/dist/task-workflow.js +153 -0
  158. package/dist/task-workflow.js.map +1 -0
  159. package/dist/tasks.d.ts +60 -0
  160. package/dist/tasks.js +120 -0
  161. package/dist/tasks.js.map +1 -0
  162. package/dist/team.d.ts +28 -0
  163. package/dist/team.js +91 -0
  164. package/dist/team.js.map +1 -0
  165. package/dist/terminal-host.d.ts +10 -0
  166. package/dist/terminal-host.js +52 -0
  167. package/dist/terminal-host.js.map +1 -0
  168. package/dist/threads.d.ts +61 -0
  169. package/dist/threads.js +200 -0
  170. package/dist/threads.js.map +1 -0
  171. package/dist/tmux-doctor.d.ts +47 -0
  172. package/dist/tmux-doctor.js +112 -0
  173. package/dist/tmux-doctor.js.map +1 -0
  174. package/dist/tmux-runtime-manager.d.ts +164 -0
  175. package/dist/tmux-runtime-manager.js +794 -0
  176. package/dist/tmux-runtime-manager.js.map +1 -0
  177. package/dist/tmux-session-transport.d.ts +31 -0
  178. package/dist/tmux-session-transport.js +115 -0
  179. package/dist/tmux-session-transport.js.map +1 -0
  180. package/dist/tmux-statusline.d.ts +17 -0
  181. package/dist/tmux-statusline.js +166 -0
  182. package/dist/tmux-statusline.js.map +1 -0
  183. package/dist/tool-output-watchers.d.ts +10 -0
  184. package/dist/tool-output-watchers.js +190 -0
  185. package/dist/tool-output-watchers.js.map +1 -0
  186. package/dist/tui/render/box.d.ts +1 -0
  187. package/dist/tui/render/box.js +20 -0
  188. package/dist/tui/render/box.js.map +1 -0
  189. package/dist/tui/render/text.d.ts +8 -0
  190. package/dist/tui/render/text.js +92 -0
  191. package/dist/tui/render/text.js.map +1 -0
  192. package/dist/tui/screens/dashboard-renderers.d.ts +23 -0
  193. package/dist/tui/screens/dashboard-renderers.js +411 -0
  194. package/dist/tui/screens/dashboard-renderers.js.map +1 -0
  195. package/dist/tui/screens/overlay-renderers.d.ts +10 -0
  196. package/dist/tui/screens/overlay-renderers.js +274 -0
  197. package/dist/tui/screens/overlay-renderers.js.map +1 -0
  198. package/dist/tui/screens/subscreen-renderers.d.ts +9 -0
  199. package/dist/tui/screens/subscreen-renderers.js +327 -0
  200. package/dist/tui/screens/subscreen-renderers.js.map +1 -0
  201. package/dist/workflow.d.ts +19 -0
  202. package/dist/workflow.js +111 -0
  203. package/dist/workflow.js.map +1 -0
  204. package/dist/worktree.d.ts +23 -0
  205. package/dist/worktree.js +101 -0
  206. package/dist/worktree.js.map +1 -0
  207. package/package.json +70 -0
@@ -0,0 +1,108 @@
1
+ import { existsSync, readFileSync, appendFileSync, mkdirSync, readdirSync, statSync, openSync, readSync, closeSync, } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { getHistoryDir } from "../paths.js";
4
+ function historyPath(sessionId) {
5
+ return join(getHistoryDir(), `${sessionId}.jsonl`);
6
+ }
7
+ /**
8
+ * Append a single turn to the session's JSONL history file.
9
+ * Creates the history directory if it doesn't exist.
10
+ */
11
+ export function appendTurn(sessionId, turn) {
12
+ const dir = getHistoryDir();
13
+ if (!existsSync(dir)) {
14
+ mkdirSync(dir, { recursive: true });
15
+ }
16
+ appendFileSync(historyPath(sessionId), JSON.stringify(turn) + "\n");
17
+ }
18
+ /**
19
+ * Read turns from a session's JSONL history file.
20
+ *
21
+ * Options:
22
+ * - lastN: return only the last N turns
23
+ * - since: filter to turns with ts >= since (ISO string comparison)
24
+ * - maxBytes: max bytes to read from the file (default 100KB).
25
+ * When the file exceeds this, reads from the tail of the file.
26
+ */
27
+ export function readHistory(sessionId, opts) {
28
+ const filePath = historyPath(sessionId);
29
+ if (!existsSync(filePath))
30
+ return [];
31
+ const maxBytes = opts?.maxBytes ?? 100 * 1024;
32
+ let raw;
33
+ try {
34
+ const size = statSync(filePath).size;
35
+ if (size <= maxBytes) {
36
+ raw = readFileSync(filePath, "utf-8");
37
+ }
38
+ else {
39
+ // Read from the tail of the file
40
+ const buf = Buffer.alloc(maxBytes);
41
+ const fd = openSync(filePath, "r");
42
+ try {
43
+ readSync(fd, buf, 0, maxBytes, size - maxBytes);
44
+ }
45
+ finally {
46
+ closeSync(fd);
47
+ }
48
+ raw = buf.toString("utf-8");
49
+ // Drop the first (likely partial) line
50
+ const firstNewline = raw.indexOf("\n");
51
+ if (firstNewline !== -1) {
52
+ raw = raw.slice(firstNewline + 1);
53
+ }
54
+ }
55
+ }
56
+ catch {
57
+ return [];
58
+ }
59
+ let turns = [];
60
+ for (const line of raw.split("\n")) {
61
+ const trimmed = line.trim();
62
+ if (!trimmed)
63
+ continue;
64
+ try {
65
+ turns.push(JSON.parse(trimmed));
66
+ }
67
+ catch {
68
+ // Skip malformed lines
69
+ }
70
+ }
71
+ if (opts?.since) {
72
+ turns = turns.filter((t) => t.ts >= opts.since);
73
+ }
74
+ if (opts?.lastN !== undefined && turns.length > opts.lastN) {
75
+ turns = turns.slice(-opts.lastN);
76
+ }
77
+ return turns;
78
+ }
79
+ /**
80
+ * List all session IDs that have history files.
81
+ * Scans history dir for .jsonl files and returns IDs (filename without extension).
82
+ */
83
+ export function listSessionIds() {
84
+ const dir = getHistoryDir();
85
+ if (!existsSync(dir))
86
+ return [];
87
+ try {
88
+ return readdirSync(dir)
89
+ .filter((f) => f.endsWith(".jsonl"))
90
+ .map((f) => f.replace(/\.jsonl$/, ""));
91
+ }
92
+ catch {
93
+ return [];
94
+ }
95
+ }
96
+ /**
97
+ * Read history from multiple sessions, merge by timestamp.
98
+ * lastN applies per-session (each session contributes at most lastN turns).
99
+ */
100
+ export function readAllHistories(sessionIds, opts) {
101
+ const all = [];
102
+ for (const id of sessionIds) {
103
+ all.push(...readHistory(id, opts));
104
+ }
105
+ all.sort((a, b) => (a.ts < b.ts ? -1 : a.ts > b.ts ? 1 : 0));
106
+ return all;
107
+ }
108
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/context/history.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ export interface AimuxDaemonInfo {
2
+ pid: number;
3
+ port: number;
4
+ startedAt: string;
5
+ updatedAt: string;
6
+ }
7
+ export interface ProjectServiceState {
8
+ projectId: string;
9
+ projectRoot: string;
10
+ pid: number;
11
+ startedAt: string;
12
+ updatedAt: string;
13
+ }
14
+ interface DaemonState {
15
+ version: 1;
16
+ updatedAt: string;
17
+ projects: Record<string, ProjectServiceState>;
18
+ }
19
+ export declare function loadDaemonInfo(): AimuxDaemonInfo | null;
20
+ export declare function stopDaemon(signal?: NodeJS.Signals): Promise<AimuxDaemonInfo | null>;
21
+ export declare function loadDaemonState(): DaemonState;
22
+ export declare function requestDaemonJson(path: string, init?: RequestInit): Promise<any>;
23
+ export declare function ensureDaemonRunning(): Promise<AimuxDaemonInfo>;
24
+ export declare function ensureProjectService(projectRoot: string): Promise<ProjectServiceState>;
25
+ export declare function stopProjectService(projectRoot: string): Promise<ProjectServiceState | null>;
26
+ export declare function projectServiceStatus(projectRoot: string): Promise<ProjectServiceState | null>;
27
+ export declare class AimuxDaemon {
28
+ private server;
29
+ private readonly children;
30
+ private state;
31
+ start(): Promise<void>;
32
+ stop(): void;
33
+ private refreshState;
34
+ private spawnProjectService;
35
+ private ensureProject;
36
+ private stopProject;
37
+ private handle;
38
+ }
39
+ export {};
package/dist/daemon.js ADDED
@@ -0,0 +1,344 @@
1
+ import { createServer } from "node:http";
2
+ import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
3
+ import { dirname, resolve as pathResolve } from "node:path";
4
+ import { spawn } from "node:child_process";
5
+ import { getDaemonInfoPath, getDaemonStatePath, getProjectIdFor } from "./paths.js";
6
+ import { listDesktopProjects } from "./project-scanner.js";
7
+ import { loadMetadataEndpoint } from "./metadata-store.js";
8
+ import { requestJson } from "./http-client.js";
9
+ const DAEMON_PORT = 43190;
10
+ const DAEMON_HOST = "127.0.0.1";
11
+ const DAEMON_STARTUP_TIMEOUT_MS = 10_000;
12
+ function ensureParent(path) {
13
+ mkdirSync(dirname(path), { recursive: true });
14
+ }
15
+ function saveJson(path, value) {
16
+ ensureParent(path);
17
+ const tmpPath = `${path}.tmp`;
18
+ writeFileSync(tmpPath, `${JSON.stringify(value, null, 2)}\n`);
19
+ renameSync(tmpPath, path);
20
+ }
21
+ function clearFile(path) {
22
+ ensureParent(path);
23
+ writeFileSync(path, "");
24
+ }
25
+ function loadJson(path, fallback) {
26
+ if (!existsSync(path))
27
+ return fallback;
28
+ try {
29
+ return JSON.parse(readFileSync(path, "utf-8"));
30
+ }
31
+ catch {
32
+ return fallback;
33
+ }
34
+ }
35
+ function isPidAlive(pid) {
36
+ try {
37
+ process.kill(pid, 0);
38
+ return true;
39
+ }
40
+ catch {
41
+ return false;
42
+ }
43
+ }
44
+ async function readJson(req) {
45
+ const chunks = [];
46
+ for await (const chunk of req) {
47
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
48
+ }
49
+ const body = Buffer.concat(chunks).toString("utf8").trim();
50
+ return body ? JSON.parse(body) : {};
51
+ }
52
+ function send(res, status, body) {
53
+ const payload = JSON.stringify(body);
54
+ res.statusCode = status;
55
+ res.setHeader("content-type", "application/json");
56
+ res.setHeader("content-length", Buffer.byteLength(payload));
57
+ res.setHeader("connection", "close");
58
+ res.end(payload);
59
+ }
60
+ export function loadDaemonInfo() {
61
+ const info = loadJson(getDaemonInfoPath(), null);
62
+ if (!info)
63
+ return null;
64
+ return isPidAlive(info.pid) ? info : null;
65
+ }
66
+ export async function stopDaemon(signal = "SIGTERM") {
67
+ const info = loadDaemonInfo();
68
+ if (!info)
69
+ return null;
70
+ const state = loadDaemonState();
71
+ for (const entry of Object.values(state.projects)) {
72
+ try {
73
+ process.kill(entry.pid, signal);
74
+ }
75
+ catch { }
76
+ }
77
+ try {
78
+ process.kill(info.pid, signal);
79
+ }
80
+ catch { }
81
+ saveJson(getDaemonStatePath(), {
82
+ version: 1,
83
+ updatedAt: new Date().toISOString(),
84
+ projects: {},
85
+ });
86
+ clearFile(getDaemonInfoPath());
87
+ return info;
88
+ }
89
+ export function loadDaemonState() {
90
+ const raw = loadJson(getDaemonStatePath(), {
91
+ version: 1,
92
+ updatedAt: new Date(0).toISOString(),
93
+ projects: {},
94
+ });
95
+ const projects = {};
96
+ for (const [projectId, entry] of Object.entries(raw.projects ?? {})) {
97
+ if (entry && isPidAlive(entry.pid)) {
98
+ projects[projectId] = entry;
99
+ }
100
+ }
101
+ if (Object.keys(projects).length !== Object.keys(raw.projects ?? {}).length) {
102
+ saveJson(getDaemonStatePath(), {
103
+ version: 1,
104
+ updatedAt: new Date().toISOString(),
105
+ projects,
106
+ });
107
+ }
108
+ return {
109
+ version: 1,
110
+ updatedAt: raw.updatedAt,
111
+ projects,
112
+ };
113
+ }
114
+ export async function requestDaemonJson(path, init) {
115
+ const info = loadDaemonInfo();
116
+ if (!info) {
117
+ throw new Error("aimux daemon is not running");
118
+ }
119
+ const { status, json } = await requestJson(`http://${DAEMON_HOST}:${info.port}${path}`, {
120
+ method: init?.method,
121
+ headers: init?.headers,
122
+ body: init?.body,
123
+ });
124
+ if (status < 200 || status >= 300 || json?.ok === false) {
125
+ throw new Error(json?.error || `daemon request failed: ${status}`);
126
+ }
127
+ return json;
128
+ }
129
+ export async function ensureDaemonRunning() {
130
+ const existing = loadDaemonInfo();
131
+ if (existing)
132
+ return existing;
133
+ const child = spawn(process.execPath, [process.argv[1], "daemon", "run"], {
134
+ detached: true,
135
+ stdio: "ignore",
136
+ });
137
+ child.unref();
138
+ const deadline = Date.now() + DAEMON_STARTUP_TIMEOUT_MS;
139
+ while (Date.now() < deadline) {
140
+ const info = loadDaemonInfo();
141
+ if (info) {
142
+ try {
143
+ await requestDaemonJson("/health");
144
+ return info;
145
+ }
146
+ catch { }
147
+ }
148
+ await new Promise((resolve) => setTimeout(resolve, 100));
149
+ }
150
+ throw new Error("timed out waiting for aimux daemon to start");
151
+ }
152
+ export async function ensureProjectService(projectRoot) {
153
+ await ensureDaemonRunning();
154
+ const result = await requestDaemonJson("/projects/ensure", {
155
+ method: "POST",
156
+ headers: { "content-type": "application/json" },
157
+ body: JSON.stringify({ projectRoot }),
158
+ });
159
+ return result.project;
160
+ }
161
+ export async function stopProjectService(projectRoot) {
162
+ await ensureDaemonRunning();
163
+ const result = await requestDaemonJson("/projects/stop", {
164
+ method: "POST",
165
+ headers: { "content-type": "application/json" },
166
+ body: JSON.stringify({ projectRoot }),
167
+ });
168
+ return (result.project ?? null);
169
+ }
170
+ export async function projectServiceStatus(projectRoot) {
171
+ await ensureDaemonRunning();
172
+ const projectId = getProjectIdFor(projectRoot);
173
+ const result = await requestDaemonJson(`/projects/${encodeURIComponent(projectId)}`);
174
+ return (result.project ?? null);
175
+ }
176
+ export class AimuxDaemon {
177
+ server = null;
178
+ children = new Map();
179
+ state = loadDaemonState();
180
+ async start() {
181
+ if (this.server)
182
+ return;
183
+ saveJson(getDaemonInfoPath(), {
184
+ pid: process.pid,
185
+ port: DAEMON_PORT,
186
+ startedAt: new Date().toISOString(),
187
+ updatedAt: new Date().toISOString(),
188
+ });
189
+ this.server = createServer((req, res) => {
190
+ void this.handle(req, res);
191
+ });
192
+ await new Promise((resolve, reject) => {
193
+ this.server.once("error", reject);
194
+ this.server.listen(DAEMON_PORT, DAEMON_HOST, () => {
195
+ this.server?.off("error", reject);
196
+ resolve();
197
+ });
198
+ });
199
+ this.refreshState();
200
+ }
201
+ stop() {
202
+ for (const entry of Object.values(this.state.projects)) {
203
+ try {
204
+ process.kill(entry.pid, "SIGTERM");
205
+ }
206
+ catch { }
207
+ }
208
+ this.children.clear();
209
+ this.state = {
210
+ version: 1,
211
+ updatedAt: new Date().toISOString(),
212
+ projects: {},
213
+ };
214
+ saveJson(getDaemonStatePath(), this.state);
215
+ clearFile(getDaemonInfoPath());
216
+ this.server?.close();
217
+ this.server = null;
218
+ }
219
+ refreshState() {
220
+ const nextProjects = {};
221
+ for (const [projectId, entry] of Object.entries(this.state.projects)) {
222
+ if (isPidAlive(entry.pid)) {
223
+ nextProjects[projectId] = {
224
+ ...entry,
225
+ updatedAt: new Date().toISOString(),
226
+ };
227
+ }
228
+ }
229
+ this.state = {
230
+ version: 1,
231
+ updatedAt: new Date().toISOString(),
232
+ projects: nextProjects,
233
+ };
234
+ saveJson(getDaemonStatePath(), this.state);
235
+ saveJson(getDaemonInfoPath(), {
236
+ pid: process.pid,
237
+ port: DAEMON_PORT,
238
+ startedAt: loadDaemonInfo()?.startedAt ?? new Date().toISOString(),
239
+ updatedAt: new Date().toISOString(),
240
+ });
241
+ }
242
+ spawnProjectService(projectRoot, projectId) {
243
+ const child = spawn(process.execPath, [process.argv[1], "__project-service-internal"], {
244
+ cwd: projectRoot,
245
+ stdio: "ignore",
246
+ });
247
+ this.children.set(projectId, child);
248
+ const now = new Date().toISOString();
249
+ const state = {
250
+ projectId,
251
+ projectRoot,
252
+ pid: child.pid,
253
+ startedAt: now,
254
+ updatedAt: now,
255
+ };
256
+ this.state.projects[projectId] = state;
257
+ child.on("exit", () => {
258
+ this.children.delete(projectId);
259
+ const current = this.state.projects[projectId];
260
+ if (current?.pid === state.pid) {
261
+ delete this.state.projects[projectId];
262
+ this.refreshState();
263
+ }
264
+ });
265
+ this.refreshState();
266
+ return state;
267
+ }
268
+ ensureProject(projectRoot) {
269
+ const resolvedRoot = pathResolve(projectRoot);
270
+ const projectId = getProjectIdFor(resolvedRoot);
271
+ const existing = this.state.projects[projectId];
272
+ if (existing && isPidAlive(existing.pid)) {
273
+ const next = {
274
+ ...existing,
275
+ updatedAt: new Date().toISOString(),
276
+ };
277
+ this.state.projects[projectId] = next;
278
+ this.refreshState();
279
+ return next;
280
+ }
281
+ return this.spawnProjectService(resolvedRoot, projectId);
282
+ }
283
+ stopProject(projectRoot) {
284
+ const projectId = getProjectIdFor(pathResolve(projectRoot));
285
+ const existing = this.state.projects[projectId];
286
+ if (!existing)
287
+ return null;
288
+ try {
289
+ process.kill(existing.pid, "SIGTERM");
290
+ }
291
+ catch { }
292
+ delete this.state.projects[projectId];
293
+ this.children.delete(projectId);
294
+ this.refreshState();
295
+ return existing;
296
+ }
297
+ async handle(req, res) {
298
+ this.refreshState();
299
+ const url = new URL(req.url ?? "/", `http://${DAEMON_HOST}:${DAEMON_PORT}`);
300
+ if (req.method === "GET" && url.pathname === "/health") {
301
+ send(res, 200, { ok: true, pid: process.pid, port: DAEMON_PORT });
302
+ return;
303
+ }
304
+ if (req.method === "GET" && url.pathname === "/projects") {
305
+ const liveById = this.state.projects;
306
+ const projects = listDesktopProjects().map((project) => ({
307
+ ...project,
308
+ service: liveById[project.id] ?? null,
309
+ serviceAlive: Boolean(liveById[project.id]),
310
+ serviceEndpoint: project.path ? loadMetadataEndpoint(project.path) : null,
311
+ }));
312
+ send(res, 200, { ok: true, projects });
313
+ return;
314
+ }
315
+ if (req.method === "GET" && url.pathname.startsWith("/projects/")) {
316
+ const projectId = decodeURIComponent(url.pathname.slice("/projects/".length));
317
+ const project = this.state.projects[projectId] ?? null;
318
+ send(res, 200, { ok: true, project });
319
+ return;
320
+ }
321
+ if (req.method === "POST" && url.pathname === "/projects/ensure") {
322
+ const body = (await readJson(req));
323
+ if (!body.projectRoot) {
324
+ send(res, 400, { ok: false, error: "projectRoot is required" });
325
+ return;
326
+ }
327
+ const project = this.ensureProject(body.projectRoot);
328
+ send(res, 200, { ok: true, project });
329
+ return;
330
+ }
331
+ if (req.method === "POST" && url.pathname === "/projects/stop") {
332
+ const body = (await readJson(req));
333
+ if (!body.projectRoot) {
334
+ send(res, 400, { ok: false, error: "projectRoot is required" });
335
+ return;
336
+ }
337
+ const project = this.stopProject(body.projectRoot);
338
+ send(res, 200, { ok: true, project });
339
+ return;
340
+ }
341
+ send(res, 404, { ok: false, error: "not found" });
342
+ }
343
+ }
344
+ //# sourceMappingURL=daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import type { DashboardSession } from "./dashboard.js";
2
+ import type { SessionState } from "./multiplexer.js";
3
+ import type { InstanceInfo } from "./instance-registry.js";
4
+ export interface DashboardLocalSession {
5
+ id: string;
6
+ command: string;
7
+ tmuxWindowId?: string;
8
+ backendSessionId?: string;
9
+ status: DashboardSession["status"];
10
+ worktreePath?: string;
11
+ }
12
+ export interface DashboardSessionRegistryOptions {
13
+ sessions: DashboardLocalSession[];
14
+ activeIndex: number;
15
+ offlineSessions: SessionState[];
16
+ remoteInstances: InstanceInfo[];
17
+ mainRepoPath?: string;
18
+ getSessionLabel: (sessionId: string) => string | undefined;
19
+ getSessionHeadline: (sessionId: string) => string | undefined;
20
+ getSessionTaskDescription: (sessionId: string) => string | undefined;
21
+ getSessionRole: (sessionId: string) => string | undefined;
22
+ getSessionContext: (sessionId: string) => {
23
+ cwd?: string;
24
+ repo?: {
25
+ owner?: string;
26
+ name?: string;
27
+ remote?: string;
28
+ };
29
+ pr?: {
30
+ number?: number;
31
+ title?: string;
32
+ url?: string;
33
+ };
34
+ } | undefined;
35
+ getSessionDerived: (sessionId: string) => {
36
+ activity?: import("./agent-events.js").AgentActivityState;
37
+ attention?: import("./agent-events.js").AgentAttentionState;
38
+ unseenCount?: number;
39
+ lastEvent?: import("./agent-events.js").AgentEvent;
40
+ services?: import("./metadata-store.js").SessionServiceMetadata[];
41
+ threadId?: string;
42
+ threadName?: string;
43
+ } | undefined;
44
+ }
45
+ export declare function getRemoteOwnedSessionKeys(remoteInstances: InstanceInfo[]): Set<string>;
46
+ export declare function buildDashboardSessions(options: DashboardSessionRegistryOptions): DashboardSession[];
47
+ export declare function orderDashboardSessionsByVisualWorktree(sessions: DashboardSession[], worktreePaths: Array<string | undefined>, mainRepoPath?: string): DashboardSession[];