@elhu/pit 0.1.1
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/LICENSE +21 -0
- package/README.md +380 -0
- package/dist/adapters/claude-code.d.ts +70 -0
- package/dist/adapters/claude-code.d.ts.map +1 -0
- package/dist/adapters/claude-code.js +166 -0
- package/dist/adapters/claude-code.js.map +1 -0
- package/dist/adapters/index.d.ts +16 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +49 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/opencode.d.ts +53 -0
- package/dist/adapters/opencode.d.ts.map +1 -0
- package/dist/adapters/opencode.js +120 -0
- package/dist/adapters/opencode.js.map +1 -0
- package/dist/adapters/process-utils.d.ts +29 -0
- package/dist/adapters/process-utils.d.ts.map +1 -0
- package/dist/adapters/process-utils.js +96 -0
- package/dist/adapters/process-utils.js.map +1 -0
- package/dist/adapters/types.d.ts +41 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +6 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/assets.generated.d.ts +13 -0
- package/dist/assets.generated.d.ts.map +1 -0
- package/dist/assets.generated.js +162 -0
- package/dist/assets.generated.js.map +1 -0
- package/dist/beads.d.ts +85 -0
- package/dist/beads.d.ts.map +1 -0
- package/dist/beads.js +120 -0
- package/dist/beads.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +39 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/add.d.ts +10 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +58 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/cleanup.d.ts +13 -0
- package/dist/commands/cleanup.d.ts.map +1 -0
- package/dist/commands/cleanup.js +174 -0
- package/dist/commands/cleanup.js.map +1 -0
- package/dist/commands/daemon.d.ts +3 -0
- package/dist/commands/daemon.d.ts.map +1 -0
- package/dist/commands/daemon.js +162 -0
- package/dist/commands/daemon.js.map +1 -0
- package/dist/commands/init.d.ts +20 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +125 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install-keybinding.d.ts +61 -0
- package/dist/commands/install-keybinding.d.ts.map +1 -0
- package/dist/commands/install-keybinding.js +138 -0
- package/dist/commands/install-keybinding.js.map +1 -0
- package/dist/commands/install-status.d.ts +35 -0
- package/dist/commands/install-status.d.ts.map +1 -0
- package/dist/commands/install-status.js +115 -0
- package/dist/commands/install-status.js.map +1 -0
- package/dist/commands/log.d.ts +7 -0
- package/dist/commands/log.d.ts.map +1 -0
- package/dist/commands/log.js +60 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/pause.d.ts +12 -0
- package/dist/commands/pause.d.ts.map +1 -0
- package/dist/commands/pause.js +47 -0
- package/dist/commands/pause.js.map +1 -0
- package/dist/commands/resume.d.ts +12 -0
- package/dist/commands/resume.d.ts.map +1 -0
- package/dist/commands/resume.js +59 -0
- package/dist/commands/resume.js.map +1 -0
- package/dist/commands/shared.d.ts +7 -0
- package/dist/commands/shared.d.ts.map +1 -0
- package/dist/commands/shared.js +56 -0
- package/dist/commands/shared.js.map +1 -0
- package/dist/commands/start.d.ts +12 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +274 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +24 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +101 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stop.d.ts +11 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +52 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/commands/teardown.d.ts +15 -0
- package/dist/commands/teardown.d.ts.map +1 -0
- package/dist/commands/teardown.js +72 -0
- package/dist/commands/teardown.js.map +1 -0
- package/dist/config.d.ts +58 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +129 -0
- package/dist/config.js.map +1 -0
- package/dist/daemon/client.d.ts +38 -0
- package/dist/daemon/client.d.ts.map +1 -0
- package/dist/daemon/client.js +254 -0
- package/dist/daemon/client.js.map +1 -0
- package/dist/daemon/context.d.ts +63 -0
- package/dist/daemon/context.d.ts.map +1 -0
- package/dist/daemon/context.js +14 -0
- package/dist/daemon/context.js.map +1 -0
- package/dist/daemon/handlers.d.ts +79 -0
- package/dist/daemon/handlers.d.ts.map +1 -0
- package/dist/daemon/handlers.js +1260 -0
- package/dist/daemon/handlers.js.map +1 -0
- package/dist/daemon/index.d.ts +6 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +7 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/lifecycle.d.ts +56 -0
- package/dist/daemon/lifecycle.d.ts.map +1 -0
- package/dist/daemon/lifecycle.js +341 -0
- package/dist/daemon/lifecycle.js.map +1 -0
- package/dist/daemon/protocol.d.ts +174 -0
- package/dist/daemon/protocol.d.ts.map +1 -0
- package/dist/daemon/protocol.js +3 -0
- package/dist/daemon/protocol.js.map +1 -0
- package/dist/daemon/recovery.d.ts +37 -0
- package/dist/daemon/recovery.d.ts.map +1 -0
- package/dist/daemon/recovery.js +197 -0
- package/dist/daemon/recovery.js.map +1 -0
- package/dist/daemon/server.d.ts +31 -0
- package/dist/daemon/server.d.ts.map +1 -0
- package/dist/daemon/server.js +294 -0
- package/dist/daemon/server.js.map +1 -0
- package/dist/daemon/socket.d.ts +18 -0
- package/dist/daemon/socket.d.ts.map +1 -0
- package/dist/daemon/socket.js +36 -0
- package/dist/daemon/socket.js.map +1 -0
- package/dist/daemon/state.d.ts +60 -0
- package/dist/daemon/state.d.ts.map +1 -0
- package/dist/daemon/state.js +156 -0
- package/dist/daemon/state.js.map +1 -0
- package/dist/daemon/systemd.d.ts +19 -0
- package/dist/daemon/systemd.d.ts.map +1 -0
- package/dist/daemon/systemd.js +131 -0
- package/dist/daemon/systemd.js.map +1 -0
- package/dist/hooks/claude-code-hook.d.ts +32 -0
- package/dist/hooks/claude-code-hook.d.ts.map +1 -0
- package/dist/hooks/claude-code-hook.js +112 -0
- package/dist/hooks/claude-code-hook.js.map +1 -0
- package/dist/instructions-template.d.ts +9 -0
- package/dist/instructions-template.d.ts.map +1 -0
- package/dist/instructions-template.js +123 -0
- package/dist/instructions-template.js.map +1 -0
- package/dist/logger.d.ts +25 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +44 -0
- package/dist/logger.js.map +1 -0
- package/dist/loop.d.ts +88 -0
- package/dist/loop.d.ts.map +1 -0
- package/dist/loop.js +161 -0
- package/dist/loop.js.map +1 -0
- package/dist/orchestrator-instructions-template.d.ts +13 -0
- package/dist/orchestrator-instructions-template.d.ts.map +1 -0
- package/dist/orchestrator-instructions-template.js +147 -0
- package/dist/orchestrator-instructions-template.js.map +1 -0
- package/dist/output.d.ts +12 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +25 -0
- package/dist/output.js.map +1 -0
- package/dist/plugin/pit.js +57 -0
- package/dist/session.d.ts +55 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +135 -0
- package/dist/session.js.map +1 -0
- package/dist/setup.d.ts +92 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +382 -0
- package/dist/setup.js.map +1 -0
- package/dist/shell-quote.d.ts +16 -0
- package/dist/shell-quote.d.ts.map +1 -0
- package/dist/shell-quote.js +18 -0
- package/dist/shell-quote.js.map +1 -0
- package/dist/signals.d.ts +17 -0
- package/dist/signals.d.ts.map +1 -0
- package/dist/signals.js +26 -0
- package/dist/signals.js.map +1 -0
- package/dist/state-machine.d.ts +74 -0
- package/dist/state-machine.d.ts.map +1 -0
- package/dist/state-machine.js +153 -0
- package/dist/state-machine.js.map +1 -0
- package/dist/tmux.d.ts +101 -0
- package/dist/tmux.d.ts.map +1 -0
- package/dist/tmux.js +208 -0
- package/dist/tmux.js.map +1 -0
- package/dist/worktree.d.ts +33 -0
- package/dist/worktree.d.ts.map +1 -0
- package/dist/worktree.js +116 -0
- package/dist/worktree.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
2
|
+
import * as fs from "node:fs";
|
|
3
|
+
import * as net from "node:net";
|
|
4
|
+
import * as path from "node:path";
|
|
5
|
+
import { ensureSocketDir, cleanupSocket } from "./socket.js";
|
|
6
|
+
export class PitDaemonServer extends EventEmitter {
|
|
7
|
+
server;
|
|
8
|
+
socketPath;
|
|
9
|
+
requestTimeout;
|
|
10
|
+
activeRequests = new Map();
|
|
11
|
+
activeConnections = new Set();
|
|
12
|
+
handlers = new Map();
|
|
13
|
+
shuttingDown = false;
|
|
14
|
+
constructor(options) {
|
|
15
|
+
super();
|
|
16
|
+
this.socketPath = `/tmp/pit/${options.sessionId}/daemon.sock`;
|
|
17
|
+
this.requestTimeout = options.requestTimeout ?? 30000; // 30 seconds default
|
|
18
|
+
// Initialize server without binding to socket yet
|
|
19
|
+
this.server = new net.Server({ allowHalfOpen: false });
|
|
20
|
+
this.setupServerHandlers();
|
|
21
|
+
}
|
|
22
|
+
setupServerHandlers() {
|
|
23
|
+
this.server.on("connection", (socket) => {
|
|
24
|
+
// Track this connection
|
|
25
|
+
this.activeConnections.add(socket);
|
|
26
|
+
let buffer = "";
|
|
27
|
+
socket.on("data", (data) => {
|
|
28
|
+
buffer += data.toString();
|
|
29
|
+
// Process complete JSON messages
|
|
30
|
+
const lines = buffer.split("\n");
|
|
31
|
+
buffer = lines.pop() || ""; // Keep incomplete last line
|
|
32
|
+
for (const line of lines) {
|
|
33
|
+
if (line.trim()) {
|
|
34
|
+
this.handleRequest(socket, line.trim());
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
socket.on("error", (error) => {
|
|
39
|
+
this.emit("socket-error", { socket, error });
|
|
40
|
+
});
|
|
41
|
+
socket.on("close", () => {
|
|
42
|
+
// Remove from active connections
|
|
43
|
+
this.activeConnections.delete(socket);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
this.server.on("error", (error) => {
|
|
47
|
+
this.emit("server-error", { error });
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
async handleRequest(socket, data) {
|
|
51
|
+
let request;
|
|
52
|
+
try {
|
|
53
|
+
request = JSON.parse(data);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
this.sendResponse(socket, {
|
|
57
|
+
id: "",
|
|
58
|
+
success: false,
|
|
59
|
+
error: {
|
|
60
|
+
code: "INVALID_REQUEST",
|
|
61
|
+
message: "Invalid JSON",
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
// Validate request structure
|
|
67
|
+
if (!request.id || !request.method) {
|
|
68
|
+
this.sendResponse(socket, {
|
|
69
|
+
id: request.id || "",
|
|
70
|
+
success: false,
|
|
71
|
+
error: {
|
|
72
|
+
code: "INVALID_REQUEST",
|
|
73
|
+
message: "Missing required fields: id, method",
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
// Handle shutdown specially - respond before emitting shutdown event
|
|
79
|
+
if (request.method === "shutdown") {
|
|
80
|
+
const timeout = setTimeout(() => {
|
|
81
|
+
this.sendResponse(socket, {
|
|
82
|
+
id: request.id,
|
|
83
|
+
success: false,
|
|
84
|
+
error: {
|
|
85
|
+
code: "TIMEOUT",
|
|
86
|
+
message: "Request timed out",
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
}, this.requestTimeout);
|
|
90
|
+
this.activeRequests.set(request.id, timeout);
|
|
91
|
+
try {
|
|
92
|
+
const result = await this.processRequest(request);
|
|
93
|
+
clearTimeout(timeout);
|
|
94
|
+
this.activeRequests.delete(request.id);
|
|
95
|
+
// Send response before starting shutdown
|
|
96
|
+
this.sendResponse(socket, {
|
|
97
|
+
id: request.id,
|
|
98
|
+
success: true,
|
|
99
|
+
result,
|
|
100
|
+
});
|
|
101
|
+
// Notify the owner (runDaemon) to perform the full shutdown sequence.
|
|
102
|
+
// runDaemon is responsible for flushing state, removing PID, closing server, and exiting.
|
|
103
|
+
setImmediate(() => this.emit("shutdown-requested", { reason: "client request" }));
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
clearTimeout(timeout);
|
|
108
|
+
this.activeRequests.delete(request.id);
|
|
109
|
+
const daemonError = {
|
|
110
|
+
code: "INTERNAL_ERROR",
|
|
111
|
+
message: error instanceof Error ? error.message : "Unknown error",
|
|
112
|
+
};
|
|
113
|
+
this.sendResponse(socket, {
|
|
114
|
+
id: request.id,
|
|
115
|
+
success: false,
|
|
116
|
+
error: daemonError,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
// Set up timeout for normal requests
|
|
122
|
+
const timeout = setTimeout(() => {
|
|
123
|
+
this.sendResponse(socket, {
|
|
124
|
+
id: request.id,
|
|
125
|
+
success: false,
|
|
126
|
+
error: {
|
|
127
|
+
code: "TIMEOUT",
|
|
128
|
+
message: "Request timed out",
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
this.activeRequests.delete(request.id);
|
|
132
|
+
}, this.requestTimeout);
|
|
133
|
+
this.activeRequests.set(request.id, timeout);
|
|
134
|
+
try {
|
|
135
|
+
const result = await this.processRequest(request);
|
|
136
|
+
clearTimeout(timeout);
|
|
137
|
+
this.activeRequests.delete(request.id);
|
|
138
|
+
this.sendResponse(socket, {
|
|
139
|
+
id: request.id,
|
|
140
|
+
success: true,
|
|
141
|
+
result,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
clearTimeout(timeout);
|
|
146
|
+
this.activeRequests.delete(request.id);
|
|
147
|
+
let daemonError;
|
|
148
|
+
if (error instanceof Error && error.message === "UNKNOWN_METHOD") {
|
|
149
|
+
daemonError = {
|
|
150
|
+
code: "UNKNOWN_METHOD",
|
|
151
|
+
message: `Method '${request.method}' not recognized`,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
else if (error instanceof Error &&
|
|
155
|
+
["INVALID_PARAMS", "EPIC_NOT_FOUND", "INVALID_STATE"].includes(error.message)) {
|
|
156
|
+
daemonError = {
|
|
157
|
+
code: error.message,
|
|
158
|
+
message: error.cause instanceof Error ? error.cause.message : error.message,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
daemonError = {
|
|
163
|
+
code: "INTERNAL_ERROR",
|
|
164
|
+
message: error instanceof Error ? error.message : "Unknown error",
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
this.sendResponse(socket, {
|
|
168
|
+
id: request.id,
|
|
169
|
+
success: false,
|
|
170
|
+
error: daemonError,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
async processRequest(request) {
|
|
175
|
+
this.emit("request", request);
|
|
176
|
+
const handler = this.handlers.get(request.method);
|
|
177
|
+
if (!handler) {
|
|
178
|
+
throw new Error("UNKNOWN_METHOD");
|
|
179
|
+
}
|
|
180
|
+
return handler(request.params);
|
|
181
|
+
}
|
|
182
|
+
registerHandler(method, handler) {
|
|
183
|
+
this.handlers.set(method, handler);
|
|
184
|
+
}
|
|
185
|
+
sendResponse(socket, response) {
|
|
186
|
+
try {
|
|
187
|
+
socket.write(JSON.stringify(response) + "\n");
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
this.emit("response-error", { socket, response, error });
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
async start() {
|
|
194
|
+
// Ensure socket directory exists and cleanup any existing socket
|
|
195
|
+
ensureSocketDir(this.socketPath);
|
|
196
|
+
cleanupSocket(this.socketPath);
|
|
197
|
+
// NOTE: SIGTERM/SIGINT handlers are registered by runDaemon() in commands/daemon.ts,
|
|
198
|
+
// not here. Having both register handlers creates competing shutdown paths.
|
|
199
|
+
// Handle uncaught exceptions - try to save state before crashing
|
|
200
|
+
process.on("uncaughtException", (err) => {
|
|
201
|
+
this.emit("uncaught-exception", { error: err });
|
|
202
|
+
this.emergencyShutdown();
|
|
203
|
+
});
|
|
204
|
+
return new Promise((resolve, reject) => {
|
|
205
|
+
this.server.listen(this.socketPath, () => {
|
|
206
|
+
this.emit("started", { socketPath: this.socketPath });
|
|
207
|
+
resolve();
|
|
208
|
+
});
|
|
209
|
+
this.server.once("error", reject);
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
async stop() {
|
|
213
|
+
// Clear all pending timeouts
|
|
214
|
+
for (const timeout of this.activeRequests.values()) {
|
|
215
|
+
clearTimeout(timeout);
|
|
216
|
+
}
|
|
217
|
+
this.activeRequests.clear();
|
|
218
|
+
// Close all active connections
|
|
219
|
+
for (const connection of this.activeConnections) {
|
|
220
|
+
connection.destroy();
|
|
221
|
+
}
|
|
222
|
+
this.activeConnections.clear();
|
|
223
|
+
return new Promise((resolve) => {
|
|
224
|
+
this.server.close(() => {
|
|
225
|
+
// Unlink the socket file
|
|
226
|
+
cleanupSocket(this.socketPath);
|
|
227
|
+
this.emit("stopped");
|
|
228
|
+
resolve();
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
getSocketPath() {
|
|
233
|
+
return this.socketPath;
|
|
234
|
+
}
|
|
235
|
+
isListening() {
|
|
236
|
+
return this.server.listening;
|
|
237
|
+
}
|
|
238
|
+
async shutdown(reason) {
|
|
239
|
+
if (this.shuttingDown) {
|
|
240
|
+
// Already shutting down - ignore duplicate signal
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
this.shuttingDown = true;
|
|
244
|
+
this.emit("shutdown-start", { reason });
|
|
245
|
+
try {
|
|
246
|
+
// 1. Close all active connections
|
|
247
|
+
for (const connection of this.activeConnections) {
|
|
248
|
+
connection.destroy();
|
|
249
|
+
}
|
|
250
|
+
this.activeConnections.clear();
|
|
251
|
+
// 2. Close all pending requests
|
|
252
|
+
for (const [_id, timeout] of this.activeRequests) {
|
|
253
|
+
clearTimeout(timeout);
|
|
254
|
+
// Respond to pending requests with shutdown error
|
|
255
|
+
// Note: We can't send responses after destroying connections
|
|
256
|
+
}
|
|
257
|
+
this.activeRequests.clear();
|
|
258
|
+
// 3. Close Unix socket server
|
|
259
|
+
await new Promise((resolve) => {
|
|
260
|
+
this.server.close(() => {
|
|
261
|
+
// Remove socket file
|
|
262
|
+
cleanupSocket(this.socketPath);
|
|
263
|
+
resolve();
|
|
264
|
+
});
|
|
265
|
+
});
|
|
266
|
+
this.emit("shutdown-complete");
|
|
267
|
+
// Caller (runDaemon in commands/daemon.ts) is responsible for process.exit()
|
|
268
|
+
}
|
|
269
|
+
catch (err) {
|
|
270
|
+
this.emit("shutdown-error", { error: err });
|
|
271
|
+
// Caller (runDaemon in commands/daemon.ts) is responsible for process.exit()
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
emergencyShutdown() {
|
|
275
|
+
// Synchronous cleanup for crash scenarios
|
|
276
|
+
try {
|
|
277
|
+
cleanupSocket(this.socketPath);
|
|
278
|
+
}
|
|
279
|
+
catch {
|
|
280
|
+
// Best effort - nothing we can do
|
|
281
|
+
}
|
|
282
|
+
try {
|
|
283
|
+
const pidPath = path.join(path.dirname(this.socketPath), "daemon.pid");
|
|
284
|
+
if (fs.existsSync(pidPath)) {
|
|
285
|
+
fs.unlinkSync(pidPath);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
catch {
|
|
289
|
+
// Best effort - nothing we can do
|
|
290
|
+
}
|
|
291
|
+
process.exit(1);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/daemon/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import * as net from "node:net";
|
|
2
|
+
/**
|
|
3
|
+
* Returns the daemon socket path for the given project path and tmux session
|
|
4
|
+
*/
|
|
5
|
+
export declare function getSocketPath(projectPath: string, tmuxSession: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* Ensures the socket directory exists
|
|
8
|
+
*/
|
|
9
|
+
export declare function ensureSocketDir(socketPath: string): void;
|
|
10
|
+
/**
|
|
11
|
+
* Cleans up an existing socket file if it exists
|
|
12
|
+
*/
|
|
13
|
+
export declare function cleanupSocket(socketPath: string): void;
|
|
14
|
+
/**
|
|
15
|
+
* Creates a Unix domain socket server
|
|
16
|
+
*/
|
|
17
|
+
export declare function createSocketServer(socketPath: string): net.Server;
|
|
18
|
+
//# sourceMappingURL=socket.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../src/daemon/socket.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAGhC;;GAEG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAG9E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAKxD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAItD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAKjE"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as net from "node:net";
|
|
3
|
+
import { generateSessionId } from "../session.js";
|
|
4
|
+
/**
|
|
5
|
+
* Returns the daemon socket path for the given project path and tmux session
|
|
6
|
+
*/
|
|
7
|
+
export function getSocketPath(projectPath, tmuxSession) {
|
|
8
|
+
const sessionId = generateSessionId(projectPath, tmuxSession);
|
|
9
|
+
return `/tmp/pit/${sessionId}/daemon.sock`;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Ensures the socket directory exists
|
|
13
|
+
*/
|
|
14
|
+
export function ensureSocketDir(socketPath) {
|
|
15
|
+
const dir = socketPath.substring(0, socketPath.lastIndexOf("/"));
|
|
16
|
+
if (!fs.existsSync(dir)) {
|
|
17
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Cleans up an existing socket file if it exists
|
|
22
|
+
*/
|
|
23
|
+
export function cleanupSocket(socketPath) {
|
|
24
|
+
if (fs.existsSync(socketPath)) {
|
|
25
|
+
fs.unlinkSync(socketPath);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Creates a Unix domain socket server
|
|
30
|
+
*/
|
|
31
|
+
export function createSocketServer(socketPath) {
|
|
32
|
+
ensureSocketDir(socketPath);
|
|
33
|
+
cleanupSocket(socketPath);
|
|
34
|
+
return net.createServer({ allowHalfOpen: false });
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=socket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../../src/daemon/socket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,WAAmB,EAAE,WAAmB;IACpE,MAAM,SAAS,GAAG,iBAAiB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAC9D,OAAO,YAAY,SAAS,cAAc,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,UAAkB;IAChD,MAAM,GAAG,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IACjE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,UAAkB;IAC9C,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAkB;IACnD,eAAe,CAAC,UAAU,CAAC,CAAC;IAC5B,aAAa,CAAC,UAAU,CAAC,CAAC;IAE1B,OAAO,GAAG,CAAC,YAAY,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { MachineState } from "../state-machine.js";
|
|
2
|
+
export interface DaemonState {
|
|
3
|
+
protocolVersion: string;
|
|
4
|
+
pitVersion: string;
|
|
5
|
+
sessionId: string;
|
|
6
|
+
projectRoot: string;
|
|
7
|
+
tmuxSession: string;
|
|
8
|
+
agent: string;
|
|
9
|
+
options: PersistedOptions;
|
|
10
|
+
epics: Record<string, PersistedEpicState>;
|
|
11
|
+
startedAt: string;
|
|
12
|
+
lastUpdated: string;
|
|
13
|
+
}
|
|
14
|
+
export interface PersistedOptions {
|
|
15
|
+
worktreeDir: string;
|
|
16
|
+
baseBranch: string;
|
|
17
|
+
promptTemplate?: string;
|
|
18
|
+
instructionsTemplate?: string;
|
|
19
|
+
inlinePromptTemplate?: string;
|
|
20
|
+
clearDelay: number;
|
|
21
|
+
initDelay: number;
|
|
22
|
+
ticketTimeout: number | null;
|
|
23
|
+
}
|
|
24
|
+
export interface PersistedEpicState {
|
|
25
|
+
epic: string;
|
|
26
|
+
state: MachineState;
|
|
27
|
+
pauseReason: string | null;
|
|
28
|
+
worktreePath: string;
|
|
29
|
+
windowName: string;
|
|
30
|
+
currentTicket: string | null;
|
|
31
|
+
ticketStartedAt: string | null;
|
|
32
|
+
}
|
|
33
|
+
export declare const CURRENT_PROTOCOL_VERSION = "1.0";
|
|
34
|
+
/**
|
|
35
|
+
* Returns the daemon state file path for the given session ID
|
|
36
|
+
*/
|
|
37
|
+
export declare function getDaemonStatePath(sessionId: string): string;
|
|
38
|
+
/**
|
|
39
|
+
* Atomically writes daemon state to disk
|
|
40
|
+
*/
|
|
41
|
+
export declare function saveDaemonState(state: DaemonState): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Loads daemon state from disk, returns null if missing, corrupt, or version incompatible
|
|
44
|
+
*/
|
|
45
|
+
export declare function loadDaemonState(sessionId: string): Promise<DaemonState | null>;
|
|
46
|
+
/**
|
|
47
|
+
* Creates a debounced saver that limits state writes to at most once per 500ms
|
|
48
|
+
*/
|
|
49
|
+
export declare function createDebouncedSaver(_sessionId: string): (state: DaemonState) => void;
|
|
50
|
+
/**
|
|
51
|
+
* Creates a new daemon state object with default values
|
|
52
|
+
*/
|
|
53
|
+
export declare function createDaemonState(params: {
|
|
54
|
+
sessionId: string;
|
|
55
|
+
projectRoot: string;
|
|
56
|
+
tmuxSession: string;
|
|
57
|
+
agent: string;
|
|
58
|
+
options: PersistedOptions;
|
|
59
|
+
}): DaemonState;
|
|
60
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/daemon/state.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAmBxD,MAAM,WAAW,WAAW;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,gBAAgB,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,YAAY,CAAC;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAGD,eAAO,MAAM,wBAAwB,QAAQ,CAAC;AAE9C;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAOvE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAwEpF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CA6BrF;AAaD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,gBAAgB,CAAC;CAC3B,GAAG,WAAW,CAed"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import * as fsp from "node:fs/promises";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
import { createRequire } from "node:module";
|
|
4
|
+
import { atomicWrite } from "../signals.js";
|
|
5
|
+
import { sessionDir } from "../session.js";
|
|
6
|
+
import { DEFAULT_CONFIG } from "../config.js";
|
|
7
|
+
// Read version once at module load time from package.json
|
|
8
|
+
const _require = createRequire(import.meta.url);
|
|
9
|
+
let PIT_VERSION;
|
|
10
|
+
try {
|
|
11
|
+
const pkg = _require("../../package.json");
|
|
12
|
+
if (!pkg.version) {
|
|
13
|
+
throw new Error("package.json does not contain a 'version' field");
|
|
14
|
+
}
|
|
15
|
+
PIT_VERSION = pkg.version;
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
throw new Error(`[daemon] Failed to read version from package.json: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
|
|
19
|
+
}
|
|
20
|
+
// Current protocol version for compatibility checking
|
|
21
|
+
export const CURRENT_PROTOCOL_VERSION = "1.0";
|
|
22
|
+
/**
|
|
23
|
+
* Returns the daemon state file path for the given session ID
|
|
24
|
+
*/
|
|
25
|
+
export function getDaemonStatePath(sessionId) {
|
|
26
|
+
return path.join(sessionDir(sessionId), "daemon-state.json");
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Atomically writes daemon state to disk
|
|
30
|
+
*/
|
|
31
|
+
export async function saveDaemonState(state) {
|
|
32
|
+
const filePath = getDaemonStatePath(state.sessionId);
|
|
33
|
+
const content = JSON.stringify(state, null, 2);
|
|
34
|
+
await atomicWrite(filePath, content);
|
|
35
|
+
// Update lastUpdated timestamp
|
|
36
|
+
state.lastUpdated = new Date().toISOString();
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Loads daemon state from disk, returns null if missing, corrupt, or version incompatible
|
|
40
|
+
*/
|
|
41
|
+
export async function loadDaemonState(sessionId) {
|
|
42
|
+
const filePath = getDaemonStatePath(sessionId);
|
|
43
|
+
try {
|
|
44
|
+
const content = await fsp.readFile(filePath, "utf8");
|
|
45
|
+
const state = JSON.parse(content);
|
|
46
|
+
// Validate required fields
|
|
47
|
+
if (!state.protocolVersion || !state.pitVersion || !state.sessionId) {
|
|
48
|
+
console.warn(`[daemon] Invalid daemon state file for session ${sessionId}: missing required fields`);
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
// Check protocol version compatibility
|
|
52
|
+
if (isProtocolVersionIncompatible(state.protocolVersion)) {
|
|
53
|
+
console.warn(`[daemon] Protocol version mismatch for session ${sessionId}: stored=${state.protocolVersion}, current=${CURRENT_PROTOCOL_VERSION}`);
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
// Backward compatibility: older state files may not have currentTicket / ticketStartedAt
|
|
57
|
+
for (const epicState of Object.values(state.epics)) {
|
|
58
|
+
if (!("currentTicket" in epicState)) {
|
|
59
|
+
epicState["currentTicket"] = null;
|
|
60
|
+
}
|
|
61
|
+
if (!("ticketStartedAt" in epicState)) {
|
|
62
|
+
epicState["ticketStartedAt"] = null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Backward compatibility: older state files may not have new PersistedOptions fields
|
|
66
|
+
const opts = state.options;
|
|
67
|
+
if (!("clearDelay" in opts)) {
|
|
68
|
+
opts["clearDelay"] = DEFAULT_CONFIG.clearDelay;
|
|
69
|
+
}
|
|
70
|
+
if (!("initDelay" in opts)) {
|
|
71
|
+
opts["initDelay"] = DEFAULT_CONFIG.initDelay;
|
|
72
|
+
}
|
|
73
|
+
if (!("ticketTimeout" in opts)) {
|
|
74
|
+
opts["ticketTimeout"] = DEFAULT_CONFIG.ticketTimeout;
|
|
75
|
+
}
|
|
76
|
+
// Backward compatibility: older state files may not have template path fields
|
|
77
|
+
if (state.options) {
|
|
78
|
+
if (!("promptTemplate" in state.options)) {
|
|
79
|
+
state.options["promptTemplate"] = undefined;
|
|
80
|
+
}
|
|
81
|
+
if (!("instructionsTemplate" in state.options)) {
|
|
82
|
+
state.options["instructionsTemplate"] = undefined;
|
|
83
|
+
}
|
|
84
|
+
if (!("inlinePromptTemplate" in state.options)) {
|
|
85
|
+
state.options["inlinePromptTemplate"] = undefined;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return state;
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
if (error.code === "ENOENT") {
|
|
92
|
+
// File doesn't exist, this is normal for new sessions
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
// File exists but is corrupt or unreadable
|
|
96
|
+
console.warn(`[daemon] Failed to load daemon state for session ${sessionId}:`, error instanceof Error ? error.message : error);
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Creates a debounced saver that limits state writes to at most once per 500ms
|
|
102
|
+
*/
|
|
103
|
+
export function createDebouncedSaver(_sessionId) {
|
|
104
|
+
let timeoutId = null;
|
|
105
|
+
let pendingState = null;
|
|
106
|
+
return (state) => {
|
|
107
|
+
pendingState = state;
|
|
108
|
+
if (timeoutId) {
|
|
109
|
+
// Clear existing timeout
|
|
110
|
+
clearTimeout(timeoutId);
|
|
111
|
+
}
|
|
112
|
+
// Set new timeout
|
|
113
|
+
timeoutId = setTimeout(async () => {
|
|
114
|
+
if (pendingState) {
|
|
115
|
+
try {
|
|
116
|
+
await saveDaemonState(pendingState);
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
console.error("[daemon] Failed to save daemon state:", error instanceof Error ? error.message : error);
|
|
120
|
+
}
|
|
121
|
+
finally {
|
|
122
|
+
pendingState = null;
|
|
123
|
+
timeoutId = null;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}, 500);
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Checks if the stored protocol version is incompatible with current version
|
|
131
|
+
*/
|
|
132
|
+
function isProtocolVersionIncompatible(storedVersion) {
|
|
133
|
+
const currentMajor = CURRENT_PROTOCOL_VERSION.split(".")[0];
|
|
134
|
+
const storedMajor = storedVersion.split(".")[0];
|
|
135
|
+
// Different major versions are considered incompatible
|
|
136
|
+
return currentMajor !== storedMajor;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Creates a new daemon state object with default values
|
|
140
|
+
*/
|
|
141
|
+
export function createDaemonState(params) {
|
|
142
|
+
const now = new Date().toISOString();
|
|
143
|
+
return {
|
|
144
|
+
protocolVersion: CURRENT_PROTOCOL_VERSION,
|
|
145
|
+
pitVersion: PIT_VERSION,
|
|
146
|
+
sessionId: params.sessionId,
|
|
147
|
+
projectRoot: params.projectRoot,
|
|
148
|
+
tmuxSession: params.tmuxSession,
|
|
149
|
+
agent: params.agent,
|
|
150
|
+
options: params.options,
|
|
151
|
+
epics: {},
|
|
152
|
+
startedAt: now,
|
|
153
|
+
lastUpdated: now,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/daemon/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* systemd integration for pit daemon auto-start.
|
|
3
|
+
*
|
|
4
|
+
* Provides install/uninstall commands that create and manage a systemd user
|
|
5
|
+
* service for automatically starting the pit daemon on login.
|
|
6
|
+
*
|
|
7
|
+
* These functions have zero coupling to daemon runtime state — they only use
|
|
8
|
+
* execFileAsync, fs, path, and os.
|
|
9
|
+
*/
|
|
10
|
+
export interface InstallOptions {
|
|
11
|
+
projectRoot?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface UninstallOptions {
|
|
14
|
+
projectRoot?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare const SERVICE_TEMPLATE = "[Unit]\nDescription=pit daemon for %i\nAfter=default.target\n\n[Service]\nType=simple\nExecStart=/bin/sh -c 'pit daemon start --project-root \"$(echo %i | base64 -d)\"'\nExecStop=/bin/sh -c 'pit daemon stop --project-root \"$(echo %i | base64 -d)\"'\nRestart=on-failure\nRestartSec=5\nEnvironment=PATH=/usr/local/bin:/usr/bin:/bin\n\n[Install]\nWantedBy=default.target\n";
|
|
17
|
+
export declare function daemonInstallCommand(options: InstallOptions): Promise<void>;
|
|
18
|
+
export declare function daemonUninstallCommand(options: UninstallOptions): Promise<void>;
|
|
19
|
+
//# sourceMappingURL=systemd.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"systemd.d.ts","sourceRoot":"","sources":["../../src/daemon/systemd.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAcH,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAMD,eAAO,MAAM,gBAAgB,uXAc5B,CAAC;AA6BF,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAmDjF;AAED,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsCrF"}
|