@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,174 @@
|
|
|
1
|
+
export declare const PROTOCOL_VERSION = "1.0";
|
|
2
|
+
export type DaemonMethod = "start" | "status" | "pause" | "resume" | "log" | "stop" | "teardown" | "add" | "health" | "shutdown" | "agent-idle" | "agent-permission";
|
|
3
|
+
export interface DaemonRequest {
|
|
4
|
+
id: string;
|
|
5
|
+
method: DaemonMethod;
|
|
6
|
+
params: unknown;
|
|
7
|
+
}
|
|
8
|
+
export interface DaemonResponse {
|
|
9
|
+
id: string;
|
|
10
|
+
success: boolean;
|
|
11
|
+
result?: unknown;
|
|
12
|
+
error?: DaemonError;
|
|
13
|
+
}
|
|
14
|
+
export interface DaemonError {
|
|
15
|
+
code: DaemonErrorCode;
|
|
16
|
+
message: string;
|
|
17
|
+
}
|
|
18
|
+
export type DaemonErrorCode = "INVALID_REQUEST" | "UNKNOWN_METHOD" | "INVALID_PARAMS" | "EPIC_NOT_FOUND" | "INVALID_STATE" | "INTERNAL_ERROR" | "TIMEOUT";
|
|
19
|
+
export interface StartParams {
|
|
20
|
+
epics: string[];
|
|
21
|
+
agent?: string;
|
|
22
|
+
worktreeDir?: string;
|
|
23
|
+
baseBranch?: string;
|
|
24
|
+
promptTemplate?: string;
|
|
25
|
+
instructionsTemplate?: string;
|
|
26
|
+
/**
|
|
27
|
+
* Ticket timeout in minutes, or null to explicitly disable.
|
|
28
|
+
* Three-state semantics:
|
|
29
|
+
* undefined = not sent (fall through to .pit.json / default)
|
|
30
|
+
* null = user explicitly wants no timeout (override config)
|
|
31
|
+
* number = timeout in minutes
|
|
32
|
+
*/
|
|
33
|
+
ticketTimeout?: number | null;
|
|
34
|
+
/** Model to use for all epics, or null to use agent default. */
|
|
35
|
+
model?: string | null;
|
|
36
|
+
/** Per-epic model overrides, keyed by epic ID. */
|
|
37
|
+
epicModels?: Record<string, string>;
|
|
38
|
+
}
|
|
39
|
+
export interface StartResult {
|
|
40
|
+
sessionId: string;
|
|
41
|
+
epics: {
|
|
42
|
+
epic: string;
|
|
43
|
+
status: "ok" | "error";
|
|
44
|
+
worktreePath?: string;
|
|
45
|
+
windowName?: string;
|
|
46
|
+
error?: string;
|
|
47
|
+
/** True when this epic was already tracked and the request re-attached to it. */
|
|
48
|
+
reused?: boolean;
|
|
49
|
+
/** Current state when reused=true */
|
|
50
|
+
state?: "running" | "paused" | "done";
|
|
51
|
+
/** Progress info when reused=true */
|
|
52
|
+
progress?: {
|
|
53
|
+
done: number;
|
|
54
|
+
total: number;
|
|
55
|
+
};
|
|
56
|
+
}[];
|
|
57
|
+
}
|
|
58
|
+
export interface StatusResult {
|
|
59
|
+
daemonVersion: string;
|
|
60
|
+
protocolVersion: string;
|
|
61
|
+
uptime: number;
|
|
62
|
+
sessionId: string;
|
|
63
|
+
projectRoot: string;
|
|
64
|
+
tmuxSession: string;
|
|
65
|
+
epics: {
|
|
66
|
+
epic: string;
|
|
67
|
+
state: "running" | "paused" | "done";
|
|
68
|
+
progress: {
|
|
69
|
+
done: number;
|
|
70
|
+
total: number;
|
|
71
|
+
};
|
|
72
|
+
pauseReason: string | null;
|
|
73
|
+
}[];
|
|
74
|
+
}
|
|
75
|
+
export interface PauseParams {
|
|
76
|
+
epic: string;
|
|
77
|
+
}
|
|
78
|
+
export interface PauseResult {
|
|
79
|
+
epic: string;
|
|
80
|
+
previousState: string;
|
|
81
|
+
newState: "paused";
|
|
82
|
+
}
|
|
83
|
+
export interface ResumeParams {
|
|
84
|
+
epic: string;
|
|
85
|
+
message?: string;
|
|
86
|
+
}
|
|
87
|
+
export interface ResumeResult {
|
|
88
|
+
epic: string;
|
|
89
|
+
previousState: "paused";
|
|
90
|
+
newState: "running";
|
|
91
|
+
warning?: string;
|
|
92
|
+
}
|
|
93
|
+
export interface AgentIdleParams {
|
|
94
|
+
epicId: string;
|
|
95
|
+
}
|
|
96
|
+
export interface AgentIdleResult {
|
|
97
|
+
ok: boolean;
|
|
98
|
+
action?: "continue" | "done" | "paused" | "ignored";
|
|
99
|
+
}
|
|
100
|
+
export interface AgentPermissionParams {
|
|
101
|
+
epicId: string;
|
|
102
|
+
tool?: string;
|
|
103
|
+
input?: string;
|
|
104
|
+
}
|
|
105
|
+
export interface AgentPermissionResult {
|
|
106
|
+
ok: boolean;
|
|
107
|
+
}
|
|
108
|
+
export interface LogParams {
|
|
109
|
+
epic: string;
|
|
110
|
+
lines?: number;
|
|
111
|
+
raw?: boolean;
|
|
112
|
+
}
|
|
113
|
+
export interface LogResult {
|
|
114
|
+
output: string;
|
|
115
|
+
epic: string;
|
|
116
|
+
lines: number;
|
|
117
|
+
}
|
|
118
|
+
export interface StopParams {
|
|
119
|
+
epic?: string;
|
|
120
|
+
}
|
|
121
|
+
export interface StopResult {
|
|
122
|
+
success: true;
|
|
123
|
+
stopped: string[];
|
|
124
|
+
}
|
|
125
|
+
export interface TeardownParams {
|
|
126
|
+
epic?: string;
|
|
127
|
+
keepWorktrees?: boolean;
|
|
128
|
+
force?: boolean;
|
|
129
|
+
}
|
|
130
|
+
export interface TeardownResult {
|
|
131
|
+
success: true;
|
|
132
|
+
cleaned: {
|
|
133
|
+
windows: string[];
|
|
134
|
+
worktrees: string[];
|
|
135
|
+
dirtyWorktrees: string[];
|
|
136
|
+
sessionDir: string;
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
export interface AddParams {
|
|
140
|
+
epic: string;
|
|
141
|
+
agent?: string;
|
|
142
|
+
/** Model to use for this epic's agent. */
|
|
143
|
+
model?: string;
|
|
144
|
+
}
|
|
145
|
+
export interface AddResult {
|
|
146
|
+
success: true;
|
|
147
|
+
epic: string;
|
|
148
|
+
windowName: string;
|
|
149
|
+
worktreePath: string;
|
|
150
|
+
agent: string;
|
|
151
|
+
}
|
|
152
|
+
export interface ShutdownParams {
|
|
153
|
+
pauseEpics?: boolean;
|
|
154
|
+
}
|
|
155
|
+
export interface ShutdownResult {
|
|
156
|
+
success: true;
|
|
157
|
+
message: string;
|
|
158
|
+
}
|
|
159
|
+
export interface HealthRequest {
|
|
160
|
+
method: "health";
|
|
161
|
+
}
|
|
162
|
+
export interface HealthResponse {
|
|
163
|
+
success: true;
|
|
164
|
+
status: "healthy" | "degraded" | "unhealthy";
|
|
165
|
+
uptime: number;
|
|
166
|
+
memoryMB: number;
|
|
167
|
+
checks: {
|
|
168
|
+
tmuxSession: boolean;
|
|
169
|
+
epicsHealthy: number;
|
|
170
|
+
epicsDegraded: number;
|
|
171
|
+
};
|
|
172
|
+
degradedReasons: string[];
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/daemon/protocol.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,gBAAgB,QAAQ,CAAC;AAEtC,MAAM,MAAM,YAAY,GACpB,OAAO,GACP,QAAQ,GACR,OAAO,GACP,QAAQ,GACR,KAAK,GACL,MAAM,GACN,UAAU,GACV,KAAK,GACL,QAAQ,GACR,UAAU,GACV,YAAY,GACZ,kBAAkB,CAAC;AAEvB,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,eAAe,GACvB,iBAAiB,GACjB,gBAAgB,GAChB,gBAAgB,GAChB,gBAAgB,GAChB,eAAe,GACf,gBAAgB,GAChB,SAAS,CAAC;AAGd,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC;QACvB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,iFAAiF;QACjF,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,qCAAqC;QACrC,KAAK,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;QACtC,qCAAqC;QACrC,QAAQ,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;KAC5C,EAAE,CAAC;CACL;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;QACrC,QAAQ,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;QAC1C,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;KAC5B,EAAE,CAAC;CACL;AAGD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAGD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,QAAQ,CAAC;IACxB,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAGD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;CACrD;AAGD,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,OAAO,CAAC;CACb;AAGD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAGD,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,IAAI,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAGD,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,IAAI,CAAC;IACd,OAAO,EAAE;QACP,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAGD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf;AAGD,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,IAAI,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAGD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,QAAQ,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,IAAI,CAAC;IACd,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE;QACN,WAAW,EAAE,OAAO,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/daemon/protocol.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAElE,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daemon state recovery.
|
|
3
|
+
*
|
|
4
|
+
* This module contains the logic for recovering daemon state after a restart.
|
|
5
|
+
* It is responsible for:
|
|
6
|
+
* - Loading persisted state from disk
|
|
7
|
+
* - Verifying the tmux session and windows still exist
|
|
8
|
+
* - Recovering each epic's loop handle in the appropriate state
|
|
9
|
+
* - Triggering clearAndReprompt if a ticket was completed while the daemon was down
|
|
10
|
+
*
|
|
11
|
+
* All functions accept a DaemonContext parameter instead of closing over
|
|
12
|
+
* module-level globals.
|
|
13
|
+
*/
|
|
14
|
+
import { type PersistedEpicState } from "./state.js";
|
|
15
|
+
import type { DaemonContext, ClearAndRepromptFn } from "./context.js";
|
|
16
|
+
/**
|
|
17
|
+
* Attempt to recover daemon state from a previous session.
|
|
18
|
+
*
|
|
19
|
+
* Loads persisted state, verifies the tmux session is still alive, resolves the
|
|
20
|
+
* agent adapter, and recovers each epic by calling recoverEpic(). Updates
|
|
21
|
+
* ctx.daemonState, ctx.agentInstance, ctx.debouncedSaver, and ctx.loopHandles
|
|
22
|
+
* in place.
|
|
23
|
+
*/
|
|
24
|
+
export declare function recoverFromPersistedState(ctx: DaemonContext, clearAndReprompt: ClearAndRepromptFn): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Recover a single epic from persisted state.
|
|
27
|
+
*
|
|
28
|
+
* Verifies the tmux window exists, checks whether the agent process is still
|
|
29
|
+
* running, and starts the loop handle in the appropriate state. If a ticket
|
|
30
|
+
* was closed while the daemon was down, triggers clearAndReprompt to advance
|
|
31
|
+
* to the next ticket (or transition to DONE).
|
|
32
|
+
*
|
|
33
|
+
* Returns true if recovery succeeded (loop started), false if the epic should
|
|
34
|
+
* be skipped (window gone, agent dead, etc.).
|
|
35
|
+
*/
|
|
36
|
+
export declare function recoverEpic(ctx: DaemonContext, epicId: string, persisted: PersistedEpicState, clearAndReprompt: ClearAndRepromptFn): Promise<boolean>;
|
|
37
|
+
//# sourceMappingURL=recovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../src/daemon/recovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EAAyC,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAK5F,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAItE;;;;;;;GAOG;AACH,wBAAsB,yBAAyB,CAC7C,GAAG,EAAE,aAAa,EAClB,gBAAgB,EAAE,kBAAkB,GACnC,OAAO,CAAC,IAAI,CAAC,CA+Cf;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,aAAa,EAClB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,kBAAkB,EAC7B,gBAAgB,EAAE,kBAAkB,GACnC,OAAO,CAAC,OAAO,CAAC,CAqIlB"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daemon state recovery.
|
|
3
|
+
*
|
|
4
|
+
* This module contains the logic for recovering daemon state after a restart.
|
|
5
|
+
* It is responsible for:
|
|
6
|
+
* - Loading persisted state from disk
|
|
7
|
+
* - Verifying the tmux session and windows still exist
|
|
8
|
+
* - Recovering each epic's loop handle in the appropriate state
|
|
9
|
+
* - Triggering clearAndReprompt if a ticket was completed while the daemon was down
|
|
10
|
+
*
|
|
11
|
+
* All functions accept a DaemonContext parameter instead of closing over
|
|
12
|
+
* module-level globals.
|
|
13
|
+
*/
|
|
14
|
+
import * as beads from "../beads.js";
|
|
15
|
+
import { resolveAdapter } from "../adapters/index.js";
|
|
16
|
+
import { createDebouncedSaver, loadDaemonState } from "./state.js";
|
|
17
|
+
import { sessionExists, windowExists, sendBell } from "../tmux.js";
|
|
18
|
+
import { startLoop } from "../loop.js";
|
|
19
|
+
import { createLogger } from "../logger.js";
|
|
20
|
+
import { makeStatusBarUpdater } from "./handlers.js";
|
|
21
|
+
const logger = createLogger();
|
|
22
|
+
/**
|
|
23
|
+
* Attempt to recover daemon state from a previous session.
|
|
24
|
+
*
|
|
25
|
+
* Loads persisted state, verifies the tmux session is still alive, resolves the
|
|
26
|
+
* agent adapter, and recovers each epic by calling recoverEpic(). Updates
|
|
27
|
+
* ctx.daemonState, ctx.agentInstance, ctx.debouncedSaver, and ctx.loopHandles
|
|
28
|
+
* in place.
|
|
29
|
+
*/
|
|
30
|
+
export async function recoverFromPersistedState(ctx, clearAndReprompt) {
|
|
31
|
+
try {
|
|
32
|
+
const persistedState = await loadDaemonState(ctx.sessionId);
|
|
33
|
+
if (!persistedState) {
|
|
34
|
+
logger.info("No persisted state found, starting fresh");
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
// Verify tmux session still exists
|
|
38
|
+
if (!(await sessionExists(ctx.tmuxSession))) {
|
|
39
|
+
logger.warn("tmux session no longer exists, starting fresh");
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
// Initialize daemon state with persisted data
|
|
43
|
+
ctx.agentInstance = await resolveAdapter(persistedState.agent);
|
|
44
|
+
ctx.daemonState = {
|
|
45
|
+
...persistedState,
|
|
46
|
+
sessionId: ctx.sessionId,
|
|
47
|
+
projectRoot: ctx.projectRoot,
|
|
48
|
+
tmuxSession: ctx.tmuxSession,
|
|
49
|
+
};
|
|
50
|
+
// Create debounced saver
|
|
51
|
+
ctx.debouncedSaver = createDebouncedSaver(ctx.sessionId);
|
|
52
|
+
// Recover each epic
|
|
53
|
+
let recoveredCount = 0;
|
|
54
|
+
for (const [epicId, epicState] of Object.entries(persistedState.epics)) {
|
|
55
|
+
if (await recoverEpic(ctx, epicId, epicState, clearAndReprompt)) {
|
|
56
|
+
recoveredCount++;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
logger.info(`Recovered ${recoveredCount} epics from persisted state`);
|
|
60
|
+
// Save recovered state
|
|
61
|
+
if (ctx.debouncedSaver && ctx.daemonState) {
|
|
62
|
+
ctx.debouncedSaver(ctx.daemonState);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
logger.warn("Failed to recover from persisted state, starting fresh", {
|
|
67
|
+
error: error instanceof Error ? error.message : String(error),
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Recover a single epic from persisted state.
|
|
73
|
+
*
|
|
74
|
+
* Verifies the tmux window exists, checks whether the agent process is still
|
|
75
|
+
* running, and starts the loop handle in the appropriate state. If a ticket
|
|
76
|
+
* was closed while the daemon was down, triggers clearAndReprompt to advance
|
|
77
|
+
* to the next ticket (or transition to DONE).
|
|
78
|
+
*
|
|
79
|
+
* Returns true if recovery succeeded (loop started), false if the epic should
|
|
80
|
+
* be skipped (window gone, agent dead, etc.).
|
|
81
|
+
*/
|
|
82
|
+
export async function recoverEpic(ctx, epicId, persisted, clearAndReprompt) {
|
|
83
|
+
try {
|
|
84
|
+
// Verify tmux window exists
|
|
85
|
+
if (!(await windowExists(ctx.tmuxSession, persisted.windowName))) {
|
|
86
|
+
logger.warn(`Window for epic ${epicId} no longer exists, skipping recovery`);
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
// Start loop with recovered state
|
|
90
|
+
const adapter = ctx.agentInstance || (await resolveAdapter("auto"));
|
|
91
|
+
// After verifying window exists, verify agent is running
|
|
92
|
+
const agentRunning = await adapter.verifyRunning(ctx.tmuxSession, persisted.windowName);
|
|
93
|
+
if (!agentRunning) {
|
|
94
|
+
logger.warn(`Agent for epic ${epicId} is not running`, {
|
|
95
|
+
windowName: persisted.windowName,
|
|
96
|
+
lastState: persisted.state,
|
|
97
|
+
});
|
|
98
|
+
// Add this epic to daemonState with PAUSED state
|
|
99
|
+
if (ctx.daemonState) {
|
|
100
|
+
// Override recovered state to PAUSED
|
|
101
|
+
ctx.daemonState.epics[epicId] = {
|
|
102
|
+
...persisted,
|
|
103
|
+
state: "PAUSED",
|
|
104
|
+
pauseReason: "agent process not running (detected on recovery)",
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
// Ring bell to alert human
|
|
108
|
+
await sendBell(ctx.tmuxSession, persisted.windowName).catch(() => {
|
|
109
|
+
// Ignore errors - bell is best-effort
|
|
110
|
+
});
|
|
111
|
+
return false; // Don't start normal loop - agent is dead
|
|
112
|
+
}
|
|
113
|
+
// Agent is running — check beads state for current ticket
|
|
114
|
+
if (persisted.currentTicket) {
|
|
115
|
+
let ticket = null;
|
|
116
|
+
try {
|
|
117
|
+
ticket = await beads.show(persisted.currentTicket, { cwd: ctx.projectRoot });
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
logger.warn(`[${epicId}] beads.show() failed during recovery, falling back to persisted state`, {
|
|
121
|
+
error: err instanceof Error ? err.message : String(err),
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
if (ticket && ticket.status === "closed") {
|
|
125
|
+
// Agent finished the ticket while daemon was down — start loop in RUNNING then
|
|
126
|
+
// immediately trigger clearAndReprompt to advance to next ticket (or DONE)
|
|
127
|
+
logger.info(`[${epicId}] Ticket ${persisted.currentTicket} closed during downtime, running clearAndReprompt`);
|
|
128
|
+
const loopHandle = startLoop({
|
|
129
|
+
epic: epicId,
|
|
130
|
+
tmuxSession: ctx.tmuxSession,
|
|
131
|
+
windowName: persisted.windowName,
|
|
132
|
+
adapter,
|
|
133
|
+
logger: createLogger(),
|
|
134
|
+
initialState: "RUNNING",
|
|
135
|
+
onStatusBarUpdate: makeStatusBarUpdater(ctx),
|
|
136
|
+
});
|
|
137
|
+
ctx.loopHandles.set(epicId, loopHandle);
|
|
138
|
+
// Store initial epic state before clearAndReprompt
|
|
139
|
+
if (ctx.daemonState) {
|
|
140
|
+
ctx.daemonState.epics[epicId] = {
|
|
141
|
+
...persisted,
|
|
142
|
+
state: loopHandle.state,
|
|
143
|
+
pauseReason: loopHandle.pauseReason,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
try {
|
|
147
|
+
const { nextTicket } = await clearAndReprompt({
|
|
148
|
+
epicId,
|
|
149
|
+
machine: loopHandle.machine,
|
|
150
|
+
windowName: persisted.windowName,
|
|
151
|
+
adapter,
|
|
152
|
+
transitionReason: "TICKET_COMPLETE",
|
|
153
|
+
epicState: ctx.daemonState?.epics[epicId] ?? persisted,
|
|
154
|
+
});
|
|
155
|
+
if (ctx.daemonState) {
|
|
156
|
+
ctx.daemonState.epics[epicId].currentTicket = nextTicket?.id ?? null;
|
|
157
|
+
ctx.daemonState.epics[epicId].ticketStartedAt = nextTicket
|
|
158
|
+
? new Date().toISOString()
|
|
159
|
+
: null;
|
|
160
|
+
ctx.daemonState.epics[epicId].state = loopHandle.state;
|
|
161
|
+
ctx.daemonState.epics[epicId].pauseReason = loopHandle.pauseReason;
|
|
162
|
+
ctx.debouncedSaver?.(ctx.daemonState);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
catch (err) {
|
|
166
|
+
logger.error(`[${epicId}] clearAndReprompt failed during recovery`, {
|
|
167
|
+
error: err instanceof Error ? err.message : String(err),
|
|
168
|
+
});
|
|
169
|
+
// Fall through — loop is still running, daemon state updated below
|
|
170
|
+
}
|
|
171
|
+
return true;
|
|
172
|
+
}
|
|
173
|
+
// else: ticket still open or beads failed → fall through to normal start
|
|
174
|
+
}
|
|
175
|
+
// Default: start loop in persisted state
|
|
176
|
+
const loopHandle = startLoop({
|
|
177
|
+
epic: epicId,
|
|
178
|
+
tmuxSession: ctx.tmuxSession,
|
|
179
|
+
windowName: persisted.windowName,
|
|
180
|
+
adapter,
|
|
181
|
+
logger: createLogger(),
|
|
182
|
+
initialState: persisted.state,
|
|
183
|
+
initialPauseReason: persisted.pauseReason,
|
|
184
|
+
onStatusBarUpdate: makeStatusBarUpdater(ctx),
|
|
185
|
+
});
|
|
186
|
+
// Store LoopHandle in daemon memory
|
|
187
|
+
ctx.loopHandles.set(epicId, loopHandle);
|
|
188
|
+
return true;
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
logger.error(`Failed to recover epic ${epicId}`, {
|
|
192
|
+
error: error instanceof Error ? error.message : String(error),
|
|
193
|
+
});
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=recovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery.js","sourceRoot":"","sources":["../../src/daemon/recovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
2
|
+
import type { DaemonMethod } from "./protocol.js";
|
|
3
|
+
export type RequestHandler = (params: unknown) => Promise<unknown>;
|
|
4
|
+
export interface PitDaemonServerOptions {
|
|
5
|
+
sessionId: string;
|
|
6
|
+
projectRoot: string;
|
|
7
|
+
tmuxSession: string;
|
|
8
|
+
requestTimeout?: number;
|
|
9
|
+
}
|
|
10
|
+
export declare class PitDaemonServer extends EventEmitter {
|
|
11
|
+
private server;
|
|
12
|
+
private socketPath;
|
|
13
|
+
private requestTimeout;
|
|
14
|
+
private activeRequests;
|
|
15
|
+
private activeConnections;
|
|
16
|
+
private handlers;
|
|
17
|
+
private shuttingDown;
|
|
18
|
+
constructor(options: PitDaemonServerOptions);
|
|
19
|
+
private setupServerHandlers;
|
|
20
|
+
private handleRequest;
|
|
21
|
+
private processRequest;
|
|
22
|
+
registerHandler(method: DaemonMethod, handler: RequestHandler): void;
|
|
23
|
+
private sendResponse;
|
|
24
|
+
start(): Promise<void>;
|
|
25
|
+
stop(): Promise<void>;
|
|
26
|
+
getSocketPath(): string;
|
|
27
|
+
isListening(): boolean;
|
|
28
|
+
shutdown(reason: string): Promise<void>;
|
|
29
|
+
emergencyShutdown(): void;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/daemon/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAK3C,OAAO,KAAK,EAA8C,YAAY,EAAE,MAAM,eAAe,CAAC;AAE9F,MAAM,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAEnE,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,cAAc,CAAqC;IAC3D,OAAO,CAAC,iBAAiB,CAAyB;IAClD,OAAO,CAAC,QAAQ,CAA2C;IAC3D,OAAO,CAAC,YAAY,CAAS;gBAEjB,OAAO,EAAE,sBAAsB;IAW3C,OAAO,CAAC,mBAAmB;YAoCb,aAAa;YAyIb,cAAc;IAW5B,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAIpE,OAAO,CAAC,YAAY;IAQd,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB3B,aAAa,IAAI,MAAM;IAIvB,WAAW,IAAI,OAAO;IAIhB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyC7C,iBAAiB,IAAI,IAAI;CAiB1B"}
|