create-merlin-brain 5.3.8 → 5.4.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.
Files changed (63) hide show
  1. package/bin/install-rtk.cjs +296 -0
  2. package/bin/install.cjs +9 -0
  3. package/dist/server/api/client.d.ts.map +1 -1
  4. package/dist/server/api/client.js +35 -6
  5. package/dist/server/api/client.js.map +1 -1
  6. package/dist/server/server.d.ts.map +1 -1
  7. package/dist/server/server.js +148 -42
  8. package/dist/server/server.js.map +1 -1
  9. package/dist/server/session-coach.d.ts.map +1 -1
  10. package/dist/server/session-coach.js +12 -0
  11. package/dist/server/session-coach.js.map +1 -1
  12. package/dist/server/session-guardian.d.ts +8 -1
  13. package/dist/server/session-guardian.d.ts.map +1 -1
  14. package/dist/server/session-guardian.js +26 -14
  15. package/dist/server/session-guardian.js.map +1 -1
  16. package/dist/server/tools/challenge.d.ts.map +1 -1
  17. package/dist/server/tools/challenge.js +7 -1
  18. package/dist/server/tools/challenge.js.map +1 -1
  19. package/dist/server/tools/computer-use.d.ts.map +1 -1
  20. package/dist/server/tools/computer-use.js +13 -6
  21. package/dist/server/tools/computer-use.js.map +1 -1
  22. package/dist/server/tools/index.d.ts +0 -1
  23. package/dist/server/tools/index.d.ts.map +1 -1
  24. package/dist/server/tools/index.js +0 -1
  25. package/dist/server/tools/index.js.map +1 -1
  26. package/dist/server/tools/project.d.ts.map +1 -1
  27. package/dist/server/tools/project.js +14 -12
  28. package/dist/server/tools/project.js.map +1 -1
  29. package/dist/server/tools/verification-runner.d.ts +45 -0
  30. package/dist/server/tools/verification-runner.d.ts.map +1 -0
  31. package/dist/server/tools/verification-runner.js +264 -0
  32. package/dist/server/tools/verification-runner.js.map +1 -0
  33. package/dist/server/tools/verification.d.ts +3 -0
  34. package/dist/server/tools/verification.d.ts.map +1 -1
  35. package/dist/server/tools/verification.js +8 -265
  36. package/dist/server/tools/verification.js.map +1 -1
  37. package/files/hooks/pre-edit-sights-check.sh +40 -3
  38. package/files/hooks/security-scanner.sh +3 -4
  39. package/files/hooks/session-end.sh +45 -32
  40. package/files/hooks/smart-approve.sh +11 -3
  41. package/files/hooks/user-prompt-router.sh +30 -3
  42. package/files/merlin/VERSION +1 -1
  43. package/package.json +2 -2
  44. package/dist/server/tools/context.d.ts +0 -7
  45. package/dist/server/tools/context.d.ts.map +0 -1
  46. package/dist/server/tools/context.js +0 -614
  47. package/dist/server/tools/context.js.map +0 -1
  48. package/dist/server/tools/hud.d.ts +0 -13
  49. package/dist/server/tools/hud.d.ts.map +0 -1
  50. package/dist/server/tools/hud.js +0 -295
  51. package/dist/server/tools/hud.js.map +0 -1
  52. package/dist/server/tools/provider-ask.d.ts +0 -10
  53. package/dist/server/tools/provider-ask.d.ts.map +0 -1
  54. package/dist/server/tools/provider-ask.js +0 -234
  55. package/dist/server/tools/provider-ask.js.map +0 -1
  56. package/dist/server/tools/rate-limit.d.ts +0 -8
  57. package/dist/server/tools/rate-limit.d.ts.map +0 -1
  58. package/dist/server/tools/rate-limit.js +0 -184
  59. package/dist/server/tools/rate-limit.js.map +0 -1
  60. package/dist/server/tools/team-workers.d.ts +0 -7
  61. package/dist/server/tools/team-workers.d.ts.map +0 -1
  62. package/dist/server/tools/team-workers.js +0 -271
  63. package/dist/server/tools/team-workers.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"provider-ask.js","sourceRoot":"","sources":["../../../src/server/tools/provider-ask.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- /**
2
- * Rate Limit Tools
3
- * Monitor Claude/provider rate-limit state and configure auto-resume behavior.
4
- * State is written by the rate-limit-watch.sh PostToolUse hook.
5
- */
6
- import type { ToolContext } from './types.js';
7
- export declare function registerRateLimitTools(ctx: ToolContext): void;
8
- //# sourceMappingURL=rate-limit.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../../src/server/tools/rate-limit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA0G9C,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CA8H7D"}
@@ -1,184 +0,0 @@
1
- /**
2
- * Rate Limit Tools
3
- * Monitor Claude/provider rate-limit state and configure auto-resume behavior.
4
- * State is written by the rate-limit-watch.sh PostToolUse hook.
5
- */
6
- import { z } from 'zod';
7
- import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
8
- import { join } from 'path';
9
- import { homedir } from 'os';
10
- import { coachWrap } from '../session-coach.js';
11
- const STATE_DIR = join(homedir(), '.merlin', 'state');
12
- const RATE_LIMIT_STATE_FILE = join(STATE_DIR, 'rate-limit.json');
13
- const SESSION_COST_FILE = join(STATE_DIR, 'session-cost.json');
14
- const CONFIG_FILE = join(STATE_DIR, 'rate-limit-config.json');
15
- /** Default config values */
16
- const DEFAULTS = {
17
- warningThreshold: 80,
18
- autoResume: true,
19
- cooldownMinutes: 2,
20
- notifyDesktop: true,
21
- };
22
- // ── Helpers ──────────────────────────────────────────────────────────────────
23
- function readJson(filePath) {
24
- try {
25
- if (!existsSync(filePath))
26
- return null;
27
- return JSON.parse(readFileSync(filePath, 'utf-8'));
28
- }
29
- catch {
30
- return null;
31
- }
32
- }
33
- function ensureStateDir() {
34
- if (!existsSync(STATE_DIR)) {
35
- mkdirSync(STATE_DIR, { recursive: true });
36
- }
37
- }
38
- function readConfig() {
39
- const saved = readJson(CONFIG_FILE);
40
- return {
41
- warningThreshold: saved?.warningThreshold ?? DEFAULTS.warningThreshold,
42
- autoResume: saved?.autoResume ?? DEFAULTS.autoResume,
43
- cooldownMinutes: saved?.cooldownMinutes ?? DEFAULTS.cooldownMinutes,
44
- notifyDesktop: saved?.notifyDesktop ?? DEFAULTS.notifyDesktop,
45
- };
46
- }
47
- /** Seconds until the estimated reset time (negative = already passed) */
48
- function secondsUntilReset(estimatedResetAt) {
49
- try {
50
- const resetMs = new Date(estimatedResetAt).getTime();
51
- return Math.round((resetMs - Date.now()) / 1000);
52
- }
53
- catch {
54
- return 0;
55
- }
56
- }
57
- /** Seconds since a given ISO timestamp */
58
- function secondsSince(isoTs) {
59
- try {
60
- return Math.round((Date.now() - new Date(isoTs).getTime()) / 1000);
61
- }
62
- catch {
63
- return 0;
64
- }
65
- }
66
- /** Determine effective status including cooldown transition */
67
- function effectiveStatus(state, config, usagePercent) {
68
- if (state?.status === 'blocked')
69
- return 'blocked';
70
- // Cooldown: recently cleared within cooldownMinutes window
71
- if (state?.status === 'ok' && state.clearedAt) {
72
- const elapsed = secondsSince(state.clearedAt);
73
- if (elapsed < config.cooldownMinutes * 60)
74
- return 'cooldown';
75
- }
76
- if (usagePercent >= config.warningThreshold)
77
- return 'warning';
78
- return 'ok';
79
- }
80
- // ── Tool registration ─────────────────────────────────────────────────────────
81
- export function registerRateLimitTools(ctx) {
82
- const { server } = ctx;
83
- // ── merlin_rate_limit_status ────────────────────────────────────────────────
84
- server.tool('merlin_rate_limit_status', 'Check current rate limit status across providers. Returns current state (ok/warning/blocked/cooldown), time until reset, and session usage metrics. Use before spawning agents to decide whether to throttle. Blocked = stop spawning. Warning = spawn cautiously. Cooldown = recently unblocked, proceed slowly.', {}, async () => {
85
- try {
86
- const state = readJson(RATE_LIMIT_STATE_FILE);
87
- const cost = readJson(SESSION_COST_FILE);
88
- const config = readConfig();
89
- const usagePercent = cost?.usagePercent ?? 0;
90
- const status = effectiveStatus(state, config, usagePercent);
91
- let statusLine = '';
92
- let recommendation = '';
93
- let resetInfo = '';
94
- if (status === 'blocked') {
95
- const secsLeft = state?.estimatedResetAt ? secondsUntilReset(state.estimatedResetAt) : 0;
96
- const minsLeft = secsLeft > 0 ? Math.ceil(secsLeft / 60) : 0;
97
- resetInfo = secsLeft > 0
98
- ? `Estimated reset: ~${minsLeft} min (${state.estimatedResetAt})`
99
- : `Reset time has passed — state may clear on next tool call`;
100
- statusLine = `**Status: BLOCKED** (trigger: ${state?.trigger ?? 'unknown'})`;
101
- recommendation = config.autoResume
102
- ? `Auto-resume is enabled. Do not spawn new agents. Wait ${minsLeft > 0 ? `~${minsLeft} min` : 'for the next tool call to clear state'}.`
103
- : 'Auto-resume is disabled. Manually call merlin_rate_limit_status again after waiting.';
104
- }
105
- else if (status === 'cooldown') {
106
- const elapsed = state?.clearedAt ? secondsSince(state.clearedAt) : 0;
107
- const remaining = Math.max(0, config.cooldownMinutes * 60 - elapsed);
108
- statusLine = `**Status: COOLDOWN** (${Math.ceil(remaining / 60)} min remaining)`;
109
- recommendation = 'Recently unblocked. Proceed cautiously — spawn agents at reduced rate.';
110
- }
111
- else if (status === 'warning') {
112
- statusLine = `**Status: WARNING** (${usagePercent}% usage — threshold: ${config.warningThreshold}%)`;
113
- recommendation = 'Approaching rate limits. Avoid spawning multiple parallel agents.';
114
- }
115
- else {
116
- statusLine = `**Status: OK** (${usagePercent}% usage)`;
117
- recommendation = 'Normal operations. No restrictions.';
118
- }
119
- const text = `
120
- ${statusLine}
121
-
122
- ${resetInfo ? `${resetInfo}\n` : ''}**Recommendation:** ${recommendation}
123
-
124
- **Config:** warning at ${config.warningThreshold}% · auto-resume: ${config.autoResume} · cooldown: ${config.cooldownMinutes}min
125
-
126
- To update these settings, call \`merlin_rate_limit_configure\`.
127
- `.trim();
128
- return {
129
- content: [{ type: 'text', text: coachWrap('merlin_rate_limit_status', text) }],
130
- };
131
- }
132
- catch (error) {
133
- return {
134
- content: [{
135
- type: 'text',
136
- text: `**Error reading rate limit state:** ${error instanceof Error ? error.message : 'Unknown error'}`,
137
- }],
138
- isError: true,
139
- };
140
- }
141
- });
142
- // ── merlin_rate_limit_configure ─────────────────────────────────────────────
143
- server.tool('merlin_rate_limit_configure', 'Configure rate limit thresholds and auto-resume behavior for Merlin. Sets the warning percentage, whether blocked sessions auto-resume, cooldown duration after unblocking, and desktop notifications. Config is persisted to ~/.merlin/state/rate-limit-config.json.', {
144
- warningThreshold: z.number().min(1).max(100).optional().describe('Usage percentage at which to warn (default: 80)'),
145
- autoResume: z.boolean().optional().describe('Whether to auto-resume blocked sessions when the rate limit clears (default: true)'),
146
- cooldownMinutes: z.number().min(0).max(60).optional().describe('Minutes to stay in cooldown after unblocking (default: 2)'),
147
- notifyDesktop: z.boolean().optional().describe('Send macOS desktop notification when rate limit is detected (default: true)'),
148
- }, async ({ warningThreshold, autoResume, cooldownMinutes, notifyDesktop }) => {
149
- try {
150
- ensureStateDir();
151
- const current = readConfig();
152
- const updated = {
153
- warningThreshold: warningThreshold ?? current.warningThreshold,
154
- autoResume: autoResume ?? current.autoResume,
155
- cooldownMinutes: cooldownMinutes ?? current.cooldownMinutes,
156
- notifyDesktop: notifyDesktop ?? current.notifyDesktop,
157
- };
158
- writeFileSync(CONFIG_FILE, JSON.stringify(updated, null, 2), 'utf-8');
159
- const text = `
160
- **Rate limit config updated**
161
-
162
- - Warning threshold: ${updated.warningThreshold}%
163
- - Auto-resume: ${updated.autoResume}
164
- - Cooldown after unblock: ${updated.cooldownMinutes} min
165
- - Desktop notifications: ${updated.notifyDesktop}
166
-
167
- Saved to \`~/.merlin/state/rate-limit-config.json\`
168
- `.trim();
169
- return {
170
- content: [{ type: 'text', text: coachWrap('merlin_rate_limit_configure', text) }],
171
- };
172
- }
173
- catch (error) {
174
- return {
175
- content: [{
176
- type: 'text',
177
- text: `**Error saving rate limit config:** ${error instanceof Error ? error.message : 'Unknown error'}`,
178
- }],
179
- isError: true,
180
- };
181
- }
182
- });
183
- }
184
- //# sourceMappingURL=rate-limit.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../../src/server/tools/rate-limit.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- /**
2
- * Team Workers Tools — Spawn parallel AI CLI workers in tmux panes.
3
- * Job state persisted to ~/.merlin/state/team/ for status/cleanup queries.
4
- */
5
- import type { ToolContext } from './types.js';
6
- export declare function registerTeamWorkerTools(ctx: ToolContext): void;
7
- //# sourceMappingURL=team-workers.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"team-workers.d.ts","sourceRoot":"","sources":["../../../src/server/tools/team-workers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA0H9C,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CA4J9D"}
@@ -1,271 +0,0 @@
1
- /**
2
- * Team Workers Tools — Spawn parallel AI CLI workers in tmux panes.
3
- * Job state persisted to ~/.merlin/state/team/ for status/cleanup queries.
4
- */
5
- import { z } from 'zod';
6
- import { execFile } from 'child_process';
7
- import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, unlinkSync } from 'fs';
8
- import { homedir } from 'os';
9
- import { join } from 'path';
10
- import { promisify } from 'util';
11
- const execFileAsync = promisify(execFile);
12
- const TEAM_STATE_DIR = join(homedir(), '.merlin', 'state', 'team');
13
- // ── Internal helpers ──────────────────────────────────────────────────────
14
- async function isTmuxAvailable() {
15
- try {
16
- await execFileAsync('which', ['tmux']);
17
- return true;
18
- }
19
- catch {
20
- return false;
21
- }
22
- }
23
- function generateJobId() {
24
- return `merlin-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
25
- }
26
- async function ensureTmuxSession(session) {
27
- try {
28
- await execFileAsync('tmux', ['has-session', '-t', session]);
29
- return true;
30
- }
31
- catch {
32
- try {
33
- await execFileAsync('tmux', ['new-session', '-d', '-s', session]);
34
- return true;
35
- }
36
- catch {
37
- return false;
38
- }
39
- }
40
- }
41
- /** Split a new pane in the session, send command, return pane ID. */
42
- async function createTmuxPane(session, command) {
43
- await execFileAsync('tmux', ['split-window', '-d', '-t', session]);
44
- const { stdout } = await execFileAsync('tmux', [
45
- 'list-panes', '-t', session, '-F', '#{session_name}:#{window_index}.#{pane_index}',
46
- ]);
47
- const panes = stdout.trim().split('\n').filter(Boolean);
48
- if (panes.length === 0)
49
- throw new Error('No panes found after split-window');
50
- const paneId = panes[panes.length - 1];
51
- await execFileAsync('tmux', ['send-keys', '-t', paneId, command, 'Enter']);
52
- return paneId;
53
- }
54
- async function capturePaneOutput(paneId, lines = 50) {
55
- try {
56
- const { stdout } = await execFileAsync('tmux', [
57
- 'capture-pane', '-t', paneId, '-p', '-J', '-S', String(-lines),
58
- ]);
59
- return stdout;
60
- }
61
- catch {
62
- return '(pane output unavailable)';
63
- }
64
- }
65
- async function isPaneAlive(paneId) {
66
- try {
67
- await execFileAsync('tmux', ['list-panes', '-t', paneId]);
68
- return true;
69
- }
70
- catch {
71
- return false;
72
- }
73
- }
74
- /** Build provider CLI command. Escapes task string for send-keys shell boundary. */
75
- function buildProviderCommand(provider, task, agent) {
76
- const t = task.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
77
- switch (provider) {
78
- case 'claude': return `claude ${agent ? `--agent ${agent} ` : ''}-p "${t}" --output-format text`;
79
- case 'codex': return `codex exec "${t}"`;
80
- case 'gemini': return `gemini -p "${t}"`;
81
- }
82
- }
83
- // ── State helpers ─────────────────────────────────────────────────────────
84
- function ensureStateDir() {
85
- if (!existsSync(TEAM_STATE_DIR))
86
- mkdirSync(TEAM_STATE_DIR, { recursive: true });
87
- }
88
- function stateFilePath(teamName) {
89
- return join(TEAM_STATE_DIR, `${teamName}.json`);
90
- }
91
- function saveJobState(state) {
92
- ensureStateDir();
93
- writeFileSync(stateFilePath(state.teamName), JSON.stringify(state, null, 2), 'utf-8');
94
- }
95
- function loadJobState(teamName) {
96
- try {
97
- const p = stateFilePath(teamName);
98
- if (!existsSync(p))
99
- return null;
100
- return JSON.parse(readFileSync(p, 'utf-8'));
101
- }
102
- catch {
103
- return null;
104
- }
105
- }
106
- function listAllJobs() {
107
- try {
108
- ensureStateDir();
109
- return readdirSync(TEAM_STATE_DIR)
110
- .filter(f => f.endsWith('.json'))
111
- .flatMap(f => {
112
- try {
113
- return [JSON.parse(readFileSync(join(TEAM_STATE_DIR, f), 'utf-8'))];
114
- }
115
- catch {
116
- return [];
117
- }
118
- });
119
- }
120
- catch {
121
- return [];
122
- }
123
- }
124
- function resolveJobs(teamName, jobId) {
125
- if (teamName) {
126
- const j = loadJobState(teamName);
127
- return j ? [j] : [];
128
- }
129
- if (jobId) {
130
- const j = listAllJobs().find(x => x.jobId === jobId);
131
- return j ? [j] : [];
132
- }
133
- return listAllJobs();
134
- }
135
- // ── Tool registration ─────────────────────────────────────────────────────
136
- export function registerTeamWorkerTools(ctx) {
137
- const { server } = ctx;
138
- server.tool('merlin_spawn_workers', 'Spawn parallel AI CLI workers in tmux panes for burst execution. Each worker gets its own ' +
139
- 'tmux pane running a claude/codex/gemini CLI instance. Use for maximum parallelism on ' +
140
- 'independent tasks. Persists job state for status queries and cleanup. ' +
141
- 'Requires tmux. Returns jobId and per-worker pane assignments.', {
142
- workers: z.array(z.object({
143
- provider: z.enum(['claude', 'codex', 'gemini']).default('claude'),
144
- task: z.string().describe('Task or prompt for this worker'),
145
- agent: z.string().optional().describe('For claude: agent name (e.g. implementation-dev)'),
146
- })).min(1).describe('Workers to spawn'),
147
- teamName: z.string().optional().default('merlin-team').describe('Logical team name for state tracking'),
148
- sessionName: z.string().optional().describe('tmux session name — defaults to teamName'),
149
- }, async ({ workers, teamName, sessionName }) => {
150
- const resolvedTeam = teamName ?? 'merlin-team';
151
- const tmuxSession = sessionName ?? resolvedTeam;
152
- if (!(await isTmuxAvailable())) {
153
- return {
154
- content: [{ type: 'text',
155
- text: 'tmux not found. Install: macOS `brew install tmux` / Linux `apt install tmux`' }],
156
- isError: true,
157
- };
158
- }
159
- if (!(await ensureTmuxSession(tmuxSession))) {
160
- return {
161
- content: [{ type: 'text', text: `Failed to create tmux session "${tmuxSession}".` }],
162
- isError: true,
163
- };
164
- }
165
- const jobId = generateJobId();
166
- const workerStates = [];
167
- const errors = [];
168
- for (const w of workers) {
169
- try {
170
- const paneId = await createTmuxPane(tmuxSession, buildProviderCommand(w.provider, w.task, w.agent));
171
- workerStates.push({ paneId, provider: w.provider, task: w.task, agent: w.agent, status: 'running' });
172
- }
173
- catch (err) {
174
- errors.push(`${w.provider} / ${w.task.slice(0, 40)}: ${err instanceof Error ? err.message : String(err)}`);
175
- }
176
- }
177
- saveJobState({ jobId, teamName: resolvedTeam, tmuxSession, workers: workerStates, startedAt: new Date().toISOString() });
178
- const lines = [
179
- `Team spawned — jobId: ${jobId}`,
180
- `tmux session: ${tmuxSession}`,
181
- `workers started: ${workerStates.length} / ${workers.length}`,
182
- '',
183
- 'Workers:',
184
- ...workerStates.map((w, i) => ` [${i + 1}] pane=${w.paneId} provider=${w.provider}${w.agent ? ` agent=${w.agent}` : ''} task="${w.task.slice(0, 60)}"`),
185
- ...(errors.length ? ['', 'Errors:', ...errors.map(e => ` ! ${e}`)] : []),
186
- '',
187
- `Status: merlin_team_status(teamName="${resolvedTeam}")`,
188
- `Attach: tmux attach-session -t ${tmuxSession}`,
189
- `Cleanup: merlin_team_cleanup(teamName="${resolvedTeam}")`,
190
- ];
191
- return { content: [{ type: 'text', text: lines.join('\n') }] };
192
- });
193
- server.tool('merlin_team_status', 'Check status of running tmux team workers. Shows pane liveness and captures recent terminal ' +
194
- 'output per worker. Provide teamName or jobId to target a specific job; omit both for all jobs.', {
195
- teamName: z.string().optional().describe('Team name used at spawn time'),
196
- jobId: z.string().optional().describe('Specific job ID'),
197
- }, async ({ teamName, jobId }) => {
198
- const jobs = resolveJobs(teamName, jobId);
199
- if (jobs.length === 0) {
200
- return { content: [{ type: 'text', text: 'No team jobs found. Use merlin_spawn_workers first.' }] };
201
- }
202
- const sections = [];
203
- for (const job of jobs) {
204
- sections.push(`Job: ${job.jobId} team: ${job.teamName} session: ${job.tmuxSession}`);
205
- sections.push(`Started: ${job.startedAt}`, '');
206
- for (const [i, worker] of job.workers.entries()) {
207
- const alive = await isPaneAlive(worker.paneId);
208
- sections.push(`Worker ${i + 1}: pane=${worker.paneId} status=${alive ? 'running' : 'completed/dead'}`);
209
- sections.push(` provider=${worker.provider}${worker.agent ? ` agent=${worker.agent}` : ''}`);
210
- sections.push(` task="${worker.task.slice(0, 80)}"`);
211
- const out = (await capturePaneOutput(worker.paneId, 50)).trim();
212
- if (out) {
213
- sections.push(' --- recent output ---');
214
- out.split('\n').slice(-20).forEach(l => sections.push(` ${l}`));
215
- sections.push(' ---');
216
- }
217
- sections.push('');
218
- }
219
- }
220
- return { content: [{ type: 'text', text: sections.join('\n') }] };
221
- });
222
- server.tool('merlin_team_cleanup', 'Clean up tmux team workers — kills panes and removes persisted job state. ' +
223
- 'Optionally kills the entire tmux session. Omit teamName/jobId to clean up all jobs.', {
224
- teamName: z.string().optional().describe('Team name used at spawn time'),
225
- jobId: z.string().optional().describe('Specific job ID'),
226
- killSession: z.boolean().optional().default(false).describe('Kill the entire tmux session instead of individual panes'),
227
- }, async ({ teamName, jobId, killSession }) => {
228
- const jobs = resolveJobs(teamName, jobId);
229
- if (jobs.length === 0) {
230
- return { content: [{ type: 'text', text: 'No team jobs found. Nothing to clean up.' }] };
231
- }
232
- const report = [];
233
- for (const job of jobs) {
234
- report.push(`Cleaning job: ${job.jobId} team: ${job.teamName}`);
235
- if (killSession) {
236
- try {
237
- await execFileAsync('tmux', ['kill-session', '-t', job.tmuxSession]);
238
- report.push(` session "${job.tmuxSession}" killed`);
239
- }
240
- catch {
241
- report.push(` session "${job.tmuxSession}" already gone`);
242
- }
243
- }
244
- else {
245
- for (const w of job.workers) {
246
- try {
247
- await execFileAsync('tmux', ['kill-pane', '-t', w.paneId]);
248
- report.push(` pane ${w.paneId} killed`);
249
- }
250
- catch {
251
- report.push(` pane ${w.paneId} already gone`);
252
- }
253
- }
254
- }
255
- try {
256
- const p = stateFilePath(job.teamName);
257
- if (existsSync(p)) {
258
- unlinkSync(p);
259
- report.push(' state file removed');
260
- }
261
- }
262
- catch {
263
- report.push(' warning: could not remove state file');
264
- }
265
- report.push('');
266
- }
267
- report.push('Cleanup complete.');
268
- return { content: [{ type: 'text', text: report.join('\n') }] };
269
- });
270
- }
271
- //# sourceMappingURL=team-workers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"team-workers.js","sourceRoot":"","sources":["../../../src/server/tools/team-workers.ts"],"names":[],"mappings":"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"}