@agentuity/opencode 0.1.40 → 0.1.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +324 -19
- package/dist/agents/architect.d.ts +4 -0
- package/dist/agents/architect.d.ts.map +1 -0
- package/dist/agents/architect.js +259 -0
- package/dist/agents/architect.js.map +1 -0
- package/dist/agents/builder.d.ts +1 -1
- package/dist/agents/builder.d.ts.map +1 -1
- package/dist/agents/builder.js +44 -1
- package/dist/agents/builder.js.map +1 -1
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +6 -0
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/lead.d.ts +1 -1
- package/dist/agents/lead.d.ts.map +1 -1
- package/dist/agents/lead.js +185 -22
- package/dist/agents/lead.js.map +1 -1
- package/dist/agents/planner.d.ts +4 -0
- package/dist/agents/planner.d.ts.map +1 -0
- package/dist/agents/planner.js +158 -0
- package/dist/agents/planner.js.map +1 -0
- package/dist/agents/runner.d.ts +4 -0
- package/dist/agents/runner.d.ts.map +1 -0
- package/dist/agents/runner.js +364 -0
- package/dist/agents/runner.js.map +1 -0
- package/dist/agents/types.d.ts +5 -1
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/background/concurrency.d.ts +36 -0
- package/dist/background/concurrency.d.ts.map +1 -0
- package/dist/background/concurrency.js +92 -0
- package/dist/background/concurrency.js.map +1 -0
- package/dist/background/index.d.ts +5 -0
- package/dist/background/index.d.ts.map +1 -0
- package/dist/background/index.js +4 -0
- package/dist/background/index.js.map +1 -0
- package/dist/background/manager.d.ts +54 -0
- package/dist/background/manager.d.ts.map +1 -0
- package/dist/background/manager.js +409 -0
- package/dist/background/manager.js.map +1 -0
- package/dist/background/types.d.ts +47 -0
- package/dist/background/types.d.ts.map +1 -0
- package/dist/background/types.js +2 -0
- package/dist/background/types.js.map +1 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +2 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/loader.d.ts +24 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +102 -23
- package/dist/config/loader.js.map +1 -1
- package/dist/config/presets.d.ts +16 -0
- package/dist/config/presets.d.ts.map +1 -0
- package/dist/config/presets.js +20 -0
- package/dist/config/presets.js.map +1 -0
- package/dist/config/validation.d.ts +26 -0
- package/dist/config/validation.d.ts.map +1 -0
- package/dist/config/validation.js +48 -0
- package/dist/config/validation.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/plugin/hooks/cadence.d.ts.map +1 -1
- package/dist/plugin/hooks/cadence.js +3 -1
- package/dist/plugin/hooks/cadence.js.map +1 -1
- package/dist/plugin/hooks/keyword.d.ts.map +1 -1
- package/dist/plugin/hooks/keyword.js +3 -0
- package/dist/plugin/hooks/keyword.js.map +1 -1
- package/dist/plugin/plugin.d.ts.map +1 -1
- package/dist/plugin/plugin.js +335 -36
- package/dist/plugin/plugin.js.map +1 -1
- package/dist/skills/frontmatter.d.ts +7 -0
- package/dist/skills/frontmatter.d.ts.map +1 -0
- package/dist/skills/frontmatter.js +17 -0
- package/dist/skills/frontmatter.js.map +1 -0
- package/dist/skills/index.d.ts +4 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +4 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/loader.d.ts +20 -0
- package/dist/skills/loader.d.ts.map +1 -0
- package/dist/skills/loader.js +152 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/types.d.ts +41 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +2 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/tmux/decision-engine.d.ts +24 -0
- package/dist/tmux/decision-engine.d.ts.map +1 -0
- package/dist/tmux/decision-engine.js +193 -0
- package/dist/tmux/decision-engine.js.map +1 -0
- package/dist/tmux/executor.d.ts +84 -0
- package/dist/tmux/executor.d.ts.map +1 -0
- package/dist/tmux/executor.js +546 -0
- package/dist/tmux/executor.js.map +1 -0
- package/dist/tmux/index.d.ts +7 -0
- package/dist/tmux/index.d.ts.map +1 -0
- package/dist/tmux/index.js +7 -0
- package/dist/tmux/index.js.map +1 -0
- package/dist/tmux/manager.d.ts +116 -0
- package/dist/tmux/manager.d.ts.map +1 -0
- package/dist/tmux/manager.js +488 -0
- package/dist/tmux/manager.js.map +1 -0
- package/dist/tmux/state-query.d.ts +7 -0
- package/dist/tmux/state-query.d.ts.map +1 -0
- package/dist/tmux/state-query.js +70 -0
- package/dist/tmux/state-query.js.map +1 -0
- package/dist/tmux/types.d.ts +97 -0
- package/dist/tmux/types.d.ts.map +1 -0
- package/dist/tmux/types.js +8 -0
- package/dist/tmux/types.js.map +1 -0
- package/dist/tmux/utils.d.ts +32 -0
- package/dist/tmux/utils.d.ts.map +1 -0
- package/dist/tmux/utils.js +80 -0
- package/dist/tmux/utils.js.map +1 -0
- package/dist/tools/background.d.ts +61 -0
- package/dist/tools/background.d.ts.map +1 -0
- package/dist/tools/background.js +78 -0
- package/dist/tools/background.js.map +1 -0
- package/dist/tools/delegate.d.ts +6 -0
- package/dist/tools/delegate.d.ts.map +1 -1
- package/dist/tools/delegate.js +8 -2
- package/dist/tools/delegate.js.map +1 -1
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +1 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/types.d.ts +118 -18
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +49 -7
- package/dist/types.js.map +1 -1
- package/package.json +4 -3
- package/src/agents/architect.ts +262 -0
- package/src/agents/builder.ts +44 -1
- package/src/agents/index.ts +6 -0
- package/src/agents/lead.ts +185 -22
- package/src/agents/planner.ts +161 -0
- package/src/agents/runner.ts +367 -0
- package/src/agents/types.ts +5 -1
- package/src/background/concurrency.ts +116 -0
- package/src/background/index.ts +4 -0
- package/src/background/manager.ts +478 -0
- package/src/background/types.ts +52 -0
- package/src/config/index.ts +2 -0
- package/src/config/loader.ts +128 -31
- package/src/config/presets.ts +21 -0
- package/src/config/validation.ts +70 -0
- package/src/index.ts +1 -0
- package/src/plugin/hooks/cadence.ts +2 -1
- package/src/plugin/hooks/keyword.ts +3 -0
- package/src/plugin/plugin.ts +374 -42
- package/src/skills/frontmatter.ts +25 -0
- package/src/skills/index.ts +3 -0
- package/src/skills/loader.ts +185 -0
- package/src/skills/types.ts +43 -0
- package/src/tmux/decision-engine.ts +246 -0
- package/src/tmux/executor.ts +618 -0
- package/src/tmux/index.ts +14 -0
- package/src/tmux/manager.ts +577 -0
- package/src/tmux/state-query.ts +77 -0
- package/src/tmux/types.ts +107 -0
- package/src/tmux/utils.ts +85 -0
- package/src/tools/background.ts +145 -0
- package/src/tools/delegate.ts +8 -2
- package/src/tools/index.ts +9 -0
- package/src/types.ts +88 -15
|
@@ -0,0 +1,546 @@
|
|
|
1
|
+
import { runTmuxCommand, runTmuxCommandSync } from './utils';
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { spawn, spawnSync } from 'bun';
|
|
6
|
+
/**
|
|
7
|
+
* Path to persist the agents window ID for crash recovery.
|
|
8
|
+
* Uses ~/.config/agentuity/coder/cache/ which is consistent with other Agentuity paths
|
|
9
|
+
* and likely exists for any Agentuity user.
|
|
10
|
+
*/
|
|
11
|
+
const CACHE_DIR = join(homedir(), '.config', 'agentuity', 'coder', 'cache');
|
|
12
|
+
const AGENTS_WINDOW_FILE = join(CACHE_DIR, 'agents-window-id');
|
|
13
|
+
/**
|
|
14
|
+
* Escape a string for safe use in shell commands.
|
|
15
|
+
* Wraps in single quotes and escapes any internal single quotes.
|
|
16
|
+
*/
|
|
17
|
+
function shellEscape(str) {
|
|
18
|
+
// Replace single quotes with '\'' (end quote, escaped quote, start quote)
|
|
19
|
+
return `'${str.replace(/'/g, "'\\''")}'`;
|
|
20
|
+
}
|
|
21
|
+
/** Maximum retries for recursive spawn attempts to prevent infinite loops */
|
|
22
|
+
const MAX_SPAWN_RETRIES = 3;
|
|
23
|
+
const PROCESS_TERM_WAIT_MS = 1000;
|
|
24
|
+
function isProcessAlive(pid) {
|
|
25
|
+
try {
|
|
26
|
+
process.kill(pid, 0);
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
const code = error.code;
|
|
31
|
+
return code !== 'ESRCH';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async function getPanePid(paneId) {
|
|
35
|
+
if (!paneId)
|
|
36
|
+
return undefined;
|
|
37
|
+
const result = await runTmuxCommand(['display', '-p', '-t', paneId, '#{pane_pid}']);
|
|
38
|
+
if (!result.success)
|
|
39
|
+
return undefined;
|
|
40
|
+
const pid = Number(result.output.trim());
|
|
41
|
+
if (!Number.isFinite(pid) || pid <= 0)
|
|
42
|
+
return undefined;
|
|
43
|
+
return pid;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Kill a process and all its children (the entire process tree).
|
|
47
|
+
*
|
|
48
|
+
* This is necessary because we spawn `bash -c "opencode attach ...; tmux kill-pane"`
|
|
49
|
+
* and #{pane_pid} returns the bash PID, not the opencode attach PID.
|
|
50
|
+
* We need to kill the children (opencode attach) not just the parent (bash).
|
|
51
|
+
*/
|
|
52
|
+
export async function killProcessByPid(pid) {
|
|
53
|
+
if (!Number.isFinite(pid) || pid <= 0)
|
|
54
|
+
return false;
|
|
55
|
+
// First, kill all child processes
|
|
56
|
+
try {
|
|
57
|
+
const proc = spawn(['pkill', '-TERM', '-P', String(pid)], {
|
|
58
|
+
stdout: 'pipe',
|
|
59
|
+
stderr: 'pipe',
|
|
60
|
+
});
|
|
61
|
+
await proc.exited;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// Ignore errors - children may not exist
|
|
65
|
+
}
|
|
66
|
+
// Then kill the parent
|
|
67
|
+
try {
|
|
68
|
+
process.kill(pid, 'SIGTERM');
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
const code = error.code;
|
|
72
|
+
if (code === 'ESRCH')
|
|
73
|
+
return true;
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
await new Promise((resolve) => setTimeout(resolve, PROCESS_TERM_WAIT_MS));
|
|
77
|
+
// Check if parent and children are dead
|
|
78
|
+
if (!isProcessAlive(pid))
|
|
79
|
+
return true;
|
|
80
|
+
// Force kill children
|
|
81
|
+
try {
|
|
82
|
+
const proc = spawn(['pkill', '-KILL', '-P', String(pid)], {
|
|
83
|
+
stdout: 'pipe',
|
|
84
|
+
stderr: 'pipe',
|
|
85
|
+
});
|
|
86
|
+
await proc.exited;
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// Ignore errors
|
|
90
|
+
}
|
|
91
|
+
// Force kill parent
|
|
92
|
+
try {
|
|
93
|
+
process.kill(pid, 'SIGKILL');
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
const code = error.code;
|
|
97
|
+
if (code === 'ESRCH')
|
|
98
|
+
return true;
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
return !isProcessAlive(pid);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* State for separate-window mode - tracks the dedicated "Agents" window
|
|
105
|
+
*/
|
|
106
|
+
let agentsWindowId;
|
|
107
|
+
/**
|
|
108
|
+
* Ensure the cache directory exists
|
|
109
|
+
*/
|
|
110
|
+
function ensureCacheDir() {
|
|
111
|
+
if (!existsSync(CACHE_DIR)) {
|
|
112
|
+
mkdirSync(CACHE_DIR, { recursive: true });
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Persist the agents window ID to disk for crash recovery
|
|
117
|
+
*/
|
|
118
|
+
function persistAgentsWindowId(windowId) {
|
|
119
|
+
try {
|
|
120
|
+
ensureCacheDir();
|
|
121
|
+
writeFileSync(AGENTS_WINDOW_FILE, windowId, 'utf-8');
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
// Ignore write errors - persistence is best-effort
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Load the agents window ID from disk (for crash recovery)
|
|
129
|
+
*/
|
|
130
|
+
function loadPersistedAgentsWindowId() {
|
|
131
|
+
try {
|
|
132
|
+
if (!existsSync(AGENTS_WINDOW_FILE))
|
|
133
|
+
return undefined;
|
|
134
|
+
const windowId = readFileSync(AGENTS_WINDOW_FILE, 'utf-8').trim();
|
|
135
|
+
return windowId || undefined;
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
return undefined;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Clear the persisted agents window ID
|
|
143
|
+
*/
|
|
144
|
+
function clearPersistedAgentsWindowId() {
|
|
145
|
+
try {
|
|
146
|
+
if (existsSync(AGENTS_WINDOW_FILE)) {
|
|
147
|
+
unlinkSync(AGENTS_WINDOW_FILE);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
// Ignore delete errors
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Execute a single pane action
|
|
156
|
+
*
|
|
157
|
+
* All agents spawn in a dedicated "Agents" window with tiled grid layout.
|
|
158
|
+
*/
|
|
159
|
+
export async function executeAction(action, ctx) {
|
|
160
|
+
switch (action.type) {
|
|
161
|
+
case 'spawn':
|
|
162
|
+
return spawnInAgentsWindow(action, { serverUrl: ctx.serverUrl });
|
|
163
|
+
case 'close':
|
|
164
|
+
return closePane(action);
|
|
165
|
+
case 'replace':
|
|
166
|
+
return replacePane(action, ctx);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Execute multiple actions in sequence
|
|
171
|
+
*/
|
|
172
|
+
export async function executeActions(actions, ctx) {
|
|
173
|
+
const results = [];
|
|
174
|
+
let spawnedPaneId;
|
|
175
|
+
for (const action of actions) {
|
|
176
|
+
const result = await executeAction(action, ctx);
|
|
177
|
+
results.push({ action, result });
|
|
178
|
+
if (!result.success) {
|
|
179
|
+
return { success: false, spawnedPaneId, results };
|
|
180
|
+
}
|
|
181
|
+
if (action.type === 'spawn' && result.paneId) {
|
|
182
|
+
spawnedPaneId = result.paneId;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return { success: true, spawnedPaneId, results };
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Close an existing pane
|
|
189
|
+
* Uses: tmux kill-pane -t <paneId>
|
|
190
|
+
*/
|
|
191
|
+
async function closePane(action) {
|
|
192
|
+
return closePaneById(action.paneId);
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Close a pane by its ID
|
|
196
|
+
* Exported for use by TmuxSessionManager when sessions complete
|
|
197
|
+
*/
|
|
198
|
+
export async function closePaneById(paneId, pid) {
|
|
199
|
+
let resolvedPid = pid;
|
|
200
|
+
if (!resolvedPid) {
|
|
201
|
+
resolvedPid = await getPanePid(paneId);
|
|
202
|
+
}
|
|
203
|
+
if (resolvedPid) {
|
|
204
|
+
await killProcessByPid(resolvedPid);
|
|
205
|
+
}
|
|
206
|
+
const result = await runTmuxCommand(['kill-pane', '-t', paneId]);
|
|
207
|
+
if (!result.success) {
|
|
208
|
+
return { success: false, error: result.output };
|
|
209
|
+
}
|
|
210
|
+
return { success: true };
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Replace an existing pane with a new session
|
|
214
|
+
* Pane self-destructs when command exits (session complete, server died, etc.)
|
|
215
|
+
*/
|
|
216
|
+
async function replacePane(action, ctx) {
|
|
217
|
+
// Pane kills itself when opencode attach exits (for any reason)
|
|
218
|
+
// Use shellEscape to prevent shell injection via session IDs
|
|
219
|
+
const escapedServerUrl = shellEscape(ctx.serverUrl);
|
|
220
|
+
const escapedSessionId = shellEscape(action.newSessionId);
|
|
221
|
+
const command = `opencode attach ${escapedServerUrl} --session ${escapedSessionId}; tmux kill-pane`;
|
|
222
|
+
const result = await runTmuxCommand(['respawn-pane', '-k', '-t', action.paneId, command]);
|
|
223
|
+
if (!result.success) {
|
|
224
|
+
return { success: false, error: result.output };
|
|
225
|
+
}
|
|
226
|
+
const pid = await getPanePid(action.paneId);
|
|
227
|
+
return { success: true, paneId: action.paneId, pid };
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Spawn agent in a dedicated "Agents" window with tiled grid layout
|
|
231
|
+
*
|
|
232
|
+
* On first spawn: Creates a new window named "Agents"
|
|
233
|
+
* Subsequent spawns: Splits within that window
|
|
234
|
+
* After each spawn: Applies tiled layout for a clean grid
|
|
235
|
+
*
|
|
236
|
+
* This keeps the main pane untouched while grouping all agent panes together.
|
|
237
|
+
* Tip: Click a pane to select it, then press Ctrl-b z to zoom/unzoom.
|
|
238
|
+
*
|
|
239
|
+
* @param retryCount - Internal counter to prevent infinite recursion (default 0)
|
|
240
|
+
*/
|
|
241
|
+
async function spawnInAgentsWindow(action, ctx, retryCount = 0) {
|
|
242
|
+
// Prevent infinite recursion if tmux keeps failing
|
|
243
|
+
if (retryCount >= MAX_SPAWN_RETRIES) {
|
|
244
|
+
return {
|
|
245
|
+
success: false,
|
|
246
|
+
error: `Failed to spawn agent pane after ${MAX_SPAWN_RETRIES} attempts`,
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
// Pane kills itself when opencode attach exits (session complete, server died, etc.)
|
|
250
|
+
// Use shellEscape to prevent shell injection via session IDs
|
|
251
|
+
const escapedServerUrl = shellEscape(ctx.serverUrl);
|
|
252
|
+
const escapedSessionId = shellEscape(action.sessionId);
|
|
253
|
+
const command = `opencode attach ${escapedServerUrl} --session ${escapedSessionId}; tmux kill-pane`;
|
|
254
|
+
const layout = 'tiled'; // Always use tiled layout for grid arrangement
|
|
255
|
+
// Check if we have a cached agents window ID and if it still exists
|
|
256
|
+
if (agentsWindowId) {
|
|
257
|
+
const checkResult = await runTmuxCommand([
|
|
258
|
+
'list-panes',
|
|
259
|
+
'-t',
|
|
260
|
+
agentsWindowId,
|
|
261
|
+
'-F',
|
|
262
|
+
'#{pane_id}',
|
|
263
|
+
]);
|
|
264
|
+
if (!checkResult.success) {
|
|
265
|
+
// Window no longer exists, clear the cache
|
|
266
|
+
agentsWindowId = undefined;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
// If no agents window exists, create one
|
|
270
|
+
if (!agentsWindowId) {
|
|
271
|
+
const createResult = await runTmuxCommand([
|
|
272
|
+
'new-window',
|
|
273
|
+
'-d', // Don't switch to new window
|
|
274
|
+
'-P',
|
|
275
|
+
'-F',
|
|
276
|
+
'#{window_id}:#{pane_id}',
|
|
277
|
+
'-n',
|
|
278
|
+
'Agents',
|
|
279
|
+
command,
|
|
280
|
+
]);
|
|
281
|
+
if (!createResult.success) {
|
|
282
|
+
return { success: false, error: createResult.output };
|
|
283
|
+
}
|
|
284
|
+
// Parse window_id:pane_id from output
|
|
285
|
+
const output = createResult.output?.trim() || '';
|
|
286
|
+
const [windowId, paneId] = output.split(':');
|
|
287
|
+
agentsWindowId = windowId;
|
|
288
|
+
// Persist for crash recovery
|
|
289
|
+
if (agentsWindowId) {
|
|
290
|
+
persistAgentsWindowId(agentsWindowId);
|
|
291
|
+
}
|
|
292
|
+
// Apply initial layout (useful when more panes are added later)
|
|
293
|
+
if (agentsWindowId && layout) {
|
|
294
|
+
await runTmuxCommand(['select-layout', '-t', agentsWindowId, layout]);
|
|
295
|
+
}
|
|
296
|
+
const pid = paneId ? await getPanePid(paneId) : undefined;
|
|
297
|
+
return { success: true, paneId, windowId, pid };
|
|
298
|
+
}
|
|
299
|
+
// Agents window exists - split within it
|
|
300
|
+
// First, get the first pane in the agents window to use as split target
|
|
301
|
+
const listResult = await runTmuxCommand([
|
|
302
|
+
'list-panes',
|
|
303
|
+
'-t',
|
|
304
|
+
agentsWindowId,
|
|
305
|
+
'-F',
|
|
306
|
+
'#{pane_id}',
|
|
307
|
+
]);
|
|
308
|
+
if (!listResult.success || !listResult.output) {
|
|
309
|
+
// Fallback: create new window (with retry counter)
|
|
310
|
+
agentsWindowId = undefined;
|
|
311
|
+
return spawnInAgentsWindow(action, ctx, retryCount + 1);
|
|
312
|
+
}
|
|
313
|
+
const targetPaneId = listResult.output.split('\n')[0]?.trim();
|
|
314
|
+
if (!targetPaneId) {
|
|
315
|
+
// Fallback: create new window (with retry counter)
|
|
316
|
+
agentsWindowId = undefined;
|
|
317
|
+
return spawnInAgentsWindow(action, ctx, retryCount + 1);
|
|
318
|
+
}
|
|
319
|
+
// Split within the agents window
|
|
320
|
+
const splitResult = await runTmuxCommand([
|
|
321
|
+
'split-window',
|
|
322
|
+
action.splitDirection,
|
|
323
|
+
'-t',
|
|
324
|
+
targetPaneId,
|
|
325
|
+
'-P',
|
|
326
|
+
'-F',
|
|
327
|
+
'#{pane_id}',
|
|
328
|
+
command,
|
|
329
|
+
]);
|
|
330
|
+
if (!splitResult.success) {
|
|
331
|
+
return { success: false, error: splitResult.output };
|
|
332
|
+
}
|
|
333
|
+
const paneId = splitResult.output?.trim();
|
|
334
|
+
// Apply the configured layout to the agents window (e.g., tiled for grid)
|
|
335
|
+
if (agentsWindowId && layout) {
|
|
336
|
+
await runTmuxCommand(['select-layout', '-t', agentsWindowId, layout]);
|
|
337
|
+
}
|
|
338
|
+
const pid = paneId ? await getPanePid(paneId) : undefined;
|
|
339
|
+
return {
|
|
340
|
+
success: true,
|
|
341
|
+
paneId: paneId || undefined,
|
|
342
|
+
windowId: agentsWindowId,
|
|
343
|
+
pid,
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Reset the agents window state (for cleanup)
|
|
348
|
+
*/
|
|
349
|
+
export function resetAgentsWindow() {
|
|
350
|
+
agentsWindowId = undefined;
|
|
351
|
+
clearPersistedAgentsWindowId();
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Close the agents window if it exists
|
|
355
|
+
* This kills the entire window, which closes all panes within it
|
|
356
|
+
*/
|
|
357
|
+
export async function closeAgentsWindow() {
|
|
358
|
+
// Try to recover window ID from disk if not in memory
|
|
359
|
+
const windowId = agentsWindowId ?? loadPersistedAgentsWindowId();
|
|
360
|
+
if (!windowId)
|
|
361
|
+
return;
|
|
362
|
+
// Kill the entire window (closes all panes within it)
|
|
363
|
+
await runTmuxCommand(['kill-window', '-t', windowId]);
|
|
364
|
+
agentsWindowId = undefined;
|
|
365
|
+
clearPersistedAgentsWindowId();
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Synchronously close the agents window (for shutdown)
|
|
369
|
+
* Uses spawnSync to ensure it completes before process exit
|
|
370
|
+
*/
|
|
371
|
+
export function closeAgentsWindowSync() {
|
|
372
|
+
// Try to recover window ID from disk if not in memory
|
|
373
|
+
const windowId = agentsWindowId ?? loadPersistedAgentsWindowId();
|
|
374
|
+
if (!windowId)
|
|
375
|
+
return;
|
|
376
|
+
// Kill the entire window synchronously
|
|
377
|
+
runTmuxCommandSync(['kill-window', '-t', windowId]);
|
|
378
|
+
agentsWindowId = undefined;
|
|
379
|
+
clearPersistedAgentsWindowId();
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Get the current agents window ID (for testing/debugging)
|
|
383
|
+
* Also checks persisted file for crash recovery
|
|
384
|
+
*/
|
|
385
|
+
export function getAgentsWindowId() {
|
|
386
|
+
return agentsWindowId ?? loadPersistedAgentsWindowId();
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Kill all orphaned opencode attach processes for a given server URL.
|
|
390
|
+
* This is a fallback cleanup method when PID-based cleanup fails.
|
|
391
|
+
*
|
|
392
|
+
* @param serverUrl - The server URL to match (optional, kills all if not provided)
|
|
393
|
+
* @param logger - Optional logging function for debug output
|
|
394
|
+
* @returns Number of processes killed
|
|
395
|
+
*/
|
|
396
|
+
export async function killOrphanedAttachProcesses(serverUrl, logger) {
|
|
397
|
+
const log = logger ?? (() => { });
|
|
398
|
+
try {
|
|
399
|
+
// Use pkill with pattern matching for opencode attach
|
|
400
|
+
const { spawn } = await import('bun');
|
|
401
|
+
// First, find matching processes to log what we're killing
|
|
402
|
+
const psProc = spawn(['ps', 'aux'], { stdout: 'pipe', stderr: 'pipe' });
|
|
403
|
+
await psProc.exited;
|
|
404
|
+
const psOutput = await new Response(psProc.stdout).text();
|
|
405
|
+
const lines = psOutput.split('\n');
|
|
406
|
+
const matchingPids = [];
|
|
407
|
+
for (const line of lines) {
|
|
408
|
+
if (!line.includes('opencode attach'))
|
|
409
|
+
continue;
|
|
410
|
+
if (serverUrl && !line.includes(serverUrl))
|
|
411
|
+
continue;
|
|
412
|
+
// Don't kill ourselves
|
|
413
|
+
if (line.includes(String(process.pid)))
|
|
414
|
+
continue;
|
|
415
|
+
const parts = line.trim().split(/\s+/);
|
|
416
|
+
const pid = Number(parts[1]);
|
|
417
|
+
if (Number.isFinite(pid) && pid > 0) {
|
|
418
|
+
matchingPids.push(pid);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
if (matchingPids.length === 0) {
|
|
422
|
+
log('No orphaned opencode attach processes found');
|
|
423
|
+
return 0;
|
|
424
|
+
}
|
|
425
|
+
log(`Found ${matchingPids.length} orphaned processes: ${matchingPids.join(', ')}`);
|
|
426
|
+
// Kill each process individually for better control
|
|
427
|
+
let killed = 0;
|
|
428
|
+
for (const pid of matchingPids) {
|
|
429
|
+
try {
|
|
430
|
+
// Try SIGTERM first
|
|
431
|
+
process.kill(pid, 'SIGTERM');
|
|
432
|
+
log(`Sent SIGTERM to PID ${pid}`);
|
|
433
|
+
killed++;
|
|
434
|
+
}
|
|
435
|
+
catch (error) {
|
|
436
|
+
const code = error.code;
|
|
437
|
+
if (code !== 'ESRCH') {
|
|
438
|
+
log(`Failed to kill PID ${pid}: ${code}`);
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
// Wait a bit then SIGKILL any survivors
|
|
443
|
+
await new Promise((resolve) => setTimeout(resolve, PROCESS_TERM_WAIT_MS));
|
|
444
|
+
for (const pid of matchingPids) {
|
|
445
|
+
if (!isProcessAlive(pid))
|
|
446
|
+
continue;
|
|
447
|
+
try {
|
|
448
|
+
process.kill(pid, 'SIGKILL');
|
|
449
|
+
log(`Sent SIGKILL to PID ${pid}`);
|
|
450
|
+
}
|
|
451
|
+
catch {
|
|
452
|
+
// Ignore errors on SIGKILL
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
log(`Cleanup complete: killed ${killed} processes`);
|
|
456
|
+
return killed;
|
|
457
|
+
}
|
|
458
|
+
catch (error) {
|
|
459
|
+
log(`Fallback cleanup failed: ${error}`);
|
|
460
|
+
return 0;
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Synchronous version of killOrphanedAttachProcesses for shutdown handlers.
|
|
465
|
+
* Uses spawnSync to ensure completion before process exit.
|
|
466
|
+
*
|
|
467
|
+
* @param serverUrl - The server URL to match (optional, kills all if not provided)
|
|
468
|
+
* @param logger - Optional logging function for debug output
|
|
469
|
+
* @returns Number of processes killed
|
|
470
|
+
*/
|
|
471
|
+
export function killOrphanedAttachProcessesSync(serverUrl, logger) {
|
|
472
|
+
const log = logger ?? (() => { });
|
|
473
|
+
try {
|
|
474
|
+
// Find matching processes
|
|
475
|
+
const psResult = spawnSync(['ps', 'aux'], { timeout: 2000 });
|
|
476
|
+
if (psResult.exitCode !== 0) {
|
|
477
|
+
log('Failed to list processes');
|
|
478
|
+
return 0;
|
|
479
|
+
}
|
|
480
|
+
const psOutput = psResult.stdout?.toString() ?? '';
|
|
481
|
+
const lines = psOutput.split('\n');
|
|
482
|
+
const matchingPids = [];
|
|
483
|
+
for (const line of lines) {
|
|
484
|
+
if (!line.includes('opencode attach'))
|
|
485
|
+
continue;
|
|
486
|
+
if (serverUrl && !line.includes(serverUrl))
|
|
487
|
+
continue;
|
|
488
|
+
// Don't kill ourselves
|
|
489
|
+
if (line.includes(String(process.pid)))
|
|
490
|
+
continue;
|
|
491
|
+
const parts = line.trim().split(/\s+/);
|
|
492
|
+
const pid = Number(parts[1]);
|
|
493
|
+
if (Number.isFinite(pid) && pid > 0) {
|
|
494
|
+
matchingPids.push(pid);
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
if (matchingPids.length === 0) {
|
|
498
|
+
log('No orphaned opencode attach processes found');
|
|
499
|
+
return 0;
|
|
500
|
+
}
|
|
501
|
+
log(`Found ${matchingPids.length} orphaned processes: ${matchingPids.join(', ')}`);
|
|
502
|
+
// Kill each process
|
|
503
|
+
let killed = 0;
|
|
504
|
+
for (const pid of matchingPids) {
|
|
505
|
+
try {
|
|
506
|
+
process.kill(pid, 'SIGTERM');
|
|
507
|
+
log(`Sent SIGTERM to PID ${pid}`);
|
|
508
|
+
killed++;
|
|
509
|
+
}
|
|
510
|
+
catch (error) {
|
|
511
|
+
const code = error.code;
|
|
512
|
+
if (code !== 'ESRCH') {
|
|
513
|
+
log(`Failed to kill PID ${pid}: ${code}`);
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
// Brief wait using SharedArrayBuffer (sync sleep)
|
|
518
|
+
try {
|
|
519
|
+
const buffer = new SharedArrayBuffer(4);
|
|
520
|
+
const view = new Int32Array(buffer);
|
|
521
|
+
Atomics.wait(view, 0, 0, PROCESS_TERM_WAIT_MS);
|
|
522
|
+
}
|
|
523
|
+
catch {
|
|
524
|
+
// Ignore sleep errors
|
|
525
|
+
}
|
|
526
|
+
// SIGKILL survivors
|
|
527
|
+
for (const pid of matchingPids) {
|
|
528
|
+
if (!isProcessAlive(pid))
|
|
529
|
+
continue;
|
|
530
|
+
try {
|
|
531
|
+
process.kill(pid, 'SIGKILL');
|
|
532
|
+
log(`Sent SIGKILL to PID ${pid}`);
|
|
533
|
+
}
|
|
534
|
+
catch {
|
|
535
|
+
// Ignore errors
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
log(`Cleanup complete: killed ${killed} processes`);
|
|
539
|
+
return killed;
|
|
540
|
+
}
|
|
541
|
+
catch (error) {
|
|
542
|
+
log(`Fallback cleanup failed: ${error}`);
|
|
543
|
+
return 0;
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
//# sourceMappingURL=executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/tmux/executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './types';
|
|
2
|
+
export * from './utils';
|
|
3
|
+
export { queryWindowState } from './state-query';
|
|
4
|
+
export { decideSpawnActions, calculateCapacity } from './decision-engine';
|
|
5
|
+
export { executeAction, executeActions, closeAgentsWindow, closeAgentsWindowSync, getAgentsWindowId, killOrphanedAttachProcesses, killOrphanedAttachProcessesSync, } from './executor';
|
|
6
|
+
export { TmuxSessionManager } from './manager';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tmux/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EACN,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,qBAAqB,EACrB,iBAAiB,EACjB,2BAA2B,EAC3B,+BAA+B,GAC/B,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './types';
|
|
2
|
+
export * from './utils';
|
|
3
|
+
export { queryWindowState } from './state-query';
|
|
4
|
+
export { decideSpawnActions, calculateCapacity } from './decision-engine';
|
|
5
|
+
export { executeAction, executeActions, closeAgentsWindow, closeAgentsWindowSync, getAgentsWindowId, killOrphanedAttachProcesses, killOrphanedAttachProcessesSync, } from './executor';
|
|
6
|
+
export { TmuxSessionManager } from './manager';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tmux/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EACN,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,qBAAqB,EACrB,iBAAiB,EACjB,2BAA2B,EAC3B,+BAA+B,GAC/B,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC"}
|