termify-agent 1.0.24 → 1.0.26
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/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +61 -1
- package/dist/agent.js.map +1 -1
- package/dist/pty-manager.d.ts +13 -0
- package/dist/pty-manager.d.ts.map +1 -1
- package/dist/pty-manager.js +187 -18
- package/dist/pty-manager.js.map +1 -1
- package/dist/ws-client.d.ts +7 -0
- package/dist/ws-client.d.ts.map +1 -1
- package/dist/ws-client.js +40 -0
- package/dist/ws-client.js.map +1 -1
- package/hooks/CLAUDE.md +12 -0
- package/hooks/termify-auto-working.js +41 -0
- package/mcp/termify-mcp-bundle.mjs +19144 -0
- package/package.json +4 -2
- package/scripts/CLAUDE.md +12 -0
- package/scripts/postinstall.js +283 -1
package/dist/agent.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAatC,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,KAAM,SAAQ,YAAY;IACrC,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,SAAS,CAAuB;;IAmBxC;;OAEG;IACH,OAAO,CAAC,aAAa;IAkLrB;;OAEG;IACG,KAAK,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;IAgCzD;;OAEG;IACH,IAAI,IAAI,IAAI;IAuBZ;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAe5B;;OAEG;IACH,OAAO,CAAC,cAAc;IAMtB;;OAEG;IACH,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED;;OAEG;IACH,IAAI,EAAE,IAAI,MAAM,GAAG,IAAI,CAEtB;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,GAAG,IAAI,CAExB;IAED;;OAEG;IACH,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED;;OAEG;IACH,SAAS,IAAI;QACX,OAAO,EAAE,OAAO,CAAC;QACjB,SAAS,EAAE,OAAO,CAAC;QACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,aAAa,EAAE,MAAM,CAAC;QACtB,MAAM,EAAE;YACN,SAAS,EAAE,MAAM,CAAC;YAClB,SAAS,EAAE,MAAM,CAAC;YAClB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;SAC9B,CAAC;KACH;CAeF"}
|
package/dist/agent.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { EventEmitter } from 'events';
|
|
2
|
+
import os from 'os';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { promises as fs } from 'fs';
|
|
2
5
|
import { WSClient } from './ws-client.js';
|
|
3
6
|
import { PTYManager } from './pty-manager.js';
|
|
4
7
|
import { SSHManager } from './ssh-manager.js';
|
|
@@ -44,12 +47,25 @@ export class Agent extends EventEmitter {
|
|
|
44
47
|
return;
|
|
45
48
|
}
|
|
46
49
|
logger.info(`Creating local terminal ${terminalId}`);
|
|
50
|
+
const config = getConfig();
|
|
51
|
+
const serverUrl = (config.serverUrl || '').replace(/\/$/, '');
|
|
52
|
+
const termifyStatusUrl = serverUrl ? `${serverUrl}/api/mcp/status` : undefined;
|
|
53
|
+
const termifySessionId = config.agentId || config.machineId || terminalId;
|
|
54
|
+
const env = {
|
|
55
|
+
...(options.env || {}),
|
|
56
|
+
};
|
|
57
|
+
if (!env.TERMIFY_STATUS_URL && termifyStatusUrl)
|
|
58
|
+
env.TERMIFY_STATUS_URL = termifyStatusUrl;
|
|
59
|
+
if (!env.TERMIFY_TERMINAL_ID)
|
|
60
|
+
env.TERMIFY_TERMINAL_ID = terminalId;
|
|
61
|
+
if (!env.TERMIFY_SESSION_ID)
|
|
62
|
+
env.TERMIFY_SESSION_ID = termifySessionId;
|
|
47
63
|
const created = this.ptyManager.create(terminalId, {
|
|
48
64
|
cols,
|
|
49
65
|
rows,
|
|
50
66
|
cwd: options.cwd,
|
|
51
67
|
shell: options.shell,
|
|
52
|
-
env
|
|
68
|
+
env,
|
|
53
69
|
});
|
|
54
70
|
if (created) {
|
|
55
71
|
this.wsClient.sendTerminalStatus(terminalId, 'RUNNING');
|
|
@@ -78,6 +94,50 @@ export class Agent extends EventEmitter {
|
|
|
78
94
|
this.ptyManager.write(terminalId, data);
|
|
79
95
|
}
|
|
80
96
|
});
|
|
97
|
+
// Terminal paste files - write to disk locally and paste @paths into the terminal.
|
|
98
|
+
this.wsClient.on('terminalPasteFiles', async (terminalId, files) => {
|
|
99
|
+
try {
|
|
100
|
+
if (!Array.isArray(files) || files.length === 0)
|
|
101
|
+
return;
|
|
102
|
+
if (files.length > 10) {
|
|
103
|
+
logger.warn(`[PasteFiles] Too many files for terminal ${terminalId} (${files.length})`);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const totalB64 = files.reduce((sum, f) => sum + ((f?.dataBase64?.length) || 0), 0);
|
|
107
|
+
if (totalB64 > 25 * 1024 * 1024) {
|
|
108
|
+
logger.warn(`[PasteFiles] Payload too large for terminal ${terminalId}`);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const baseDir = path.join(os.tmpdir(), 'termify-pastes', terminalId, String(Date.now()));
|
|
112
|
+
await fs.mkdir(baseDir, { recursive: true });
|
|
113
|
+
const sanitize = (name) => {
|
|
114
|
+
const base = (name || 'attachment').split('/').pop() || 'attachment';
|
|
115
|
+
return base.replace(/[^a-zA-Z0-9._-]/g, '_').slice(0, 180) || 'attachment';
|
|
116
|
+
};
|
|
117
|
+
const writtenPaths = [];
|
|
118
|
+
for (const f of files) {
|
|
119
|
+
const fileName = sanitize(f.name);
|
|
120
|
+
const outPath = path.join(baseDir, fileName);
|
|
121
|
+
const buf = Buffer.from(f.dataBase64 || '', 'base64');
|
|
122
|
+
await fs.writeFile(outPath, buf);
|
|
123
|
+
writtenPaths.push(outPath);
|
|
124
|
+
}
|
|
125
|
+
// Paste paths into whichever terminal type is active.
|
|
126
|
+
// NOTE: For SSH terminals, these files exist locally on the agent, not on the remote host.
|
|
127
|
+
for (const p of writtenPaths) {
|
|
128
|
+
const text = `@${p}\r`;
|
|
129
|
+
if (this.sshManager.has(terminalId)) {
|
|
130
|
+
this.sshManager.write(terminalId, text);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
this.ptyManager.write(terminalId, text);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
logger.warn(`[PasteFiles] Failed for terminal ${terminalId}: ${err instanceof Error ? err.message : String(err)}`);
|
|
139
|
+
}
|
|
140
|
+
});
|
|
81
141
|
// Terminal resize - route to appropriate manager
|
|
82
142
|
this.wsClient.on('terminalResize', (terminalId, cols, rows) => {
|
|
83
143
|
if (this.sshManager.has(terminalId)) {
|
package/dist/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/pty-manager.d.ts
CHANGED
|
@@ -17,6 +17,8 @@ export interface PTYInstance {
|
|
|
17
17
|
rows: number;
|
|
18
18
|
isWorking: boolean;
|
|
19
19
|
lastInputTime: number;
|
|
20
|
+
lastWriteAt?: number;
|
|
21
|
+
lastWriteHadNewline?: boolean;
|
|
20
22
|
idleTimeout: NodeJS.Timeout | null;
|
|
21
23
|
processCheckInterval: NodeJS.Timeout | null;
|
|
22
24
|
processCheckGeneration: number;
|
|
@@ -31,6 +33,8 @@ export interface PTYInstance {
|
|
|
31
33
|
lastOutputTime?: number;
|
|
32
34
|
mcpAutoActive?: boolean;
|
|
33
35
|
lastMcpStatusSent?: MCPStatus;
|
|
36
|
+
lastMcpMessageSent?: string;
|
|
37
|
+
lastMcpNeedsInputPromptSent?: string;
|
|
34
38
|
mcpKeepaliveTimer?: NodeJS.Timeout | null;
|
|
35
39
|
}
|
|
36
40
|
type DataCallback = (terminalId: string, data: string) => void;
|
|
@@ -56,6 +60,8 @@ export declare class PTYManager {
|
|
|
56
60
|
private nodePtyModule;
|
|
57
61
|
private static PROCESS_CHECK_INTERVAL_MS;
|
|
58
62
|
private static AI_TOOL_PATTERNS;
|
|
63
|
+
private static MCP_AUTHORITATIVE_PATTERNS;
|
|
64
|
+
private static MCP_AUTO_ENABLED;
|
|
59
65
|
private static REPL_PROCESS_PATTERNS;
|
|
60
66
|
/**
|
|
61
67
|
* Check if a file exists and is executable
|
|
@@ -95,7 +101,13 @@ export declare class PTYManager {
|
|
|
95
101
|
* Check if process appears to be an AI terminal tool (Claude/Codex/etc.).
|
|
96
102
|
*/
|
|
97
103
|
private isAiToolProcess;
|
|
104
|
+
private getSilenceTimeout;
|
|
105
|
+
private isMcpAuthoritativeProcess;
|
|
98
106
|
private static readonly MCP_KEEPALIVE_MS;
|
|
107
|
+
private stripAnsi;
|
|
108
|
+
private detectNeedsInputPrompt;
|
|
109
|
+
private detectErrorMessage;
|
|
110
|
+
private sendMcpStatusIfChanged;
|
|
99
111
|
private mapDaemonStateToMcpStatus;
|
|
100
112
|
private stopMcpKeepalive;
|
|
101
113
|
private startMcpKeepalive;
|
|
@@ -107,6 +119,7 @@ export declare class PTYManager {
|
|
|
107
119
|
* Only applies to REPL processes - normal commands trust daemon state directly.
|
|
108
120
|
*/
|
|
109
121
|
private static readonly OUTPUT_SILENCE_TIMEOUT;
|
|
122
|
+
private static readonly AI_SILENCE_TIMEOUT;
|
|
110
123
|
private startOutputSilenceTimer;
|
|
111
124
|
private clearOutputSilenceTimer;
|
|
112
125
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pty-manager.d.ts","sourceRoot":"","sources":["../src/pty-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAIrC,OAAO,EAA0B,YAAY,EAAE,MAAM,eAAe,CAAC;AAIrE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAmC,MAAM,oBAAoB,CAAC;AAEnF,KAAK,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,aAAa,GAAG,UAAU,GAAG,OAAO,CAAC;AAK3E,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,IAAI,CAAC;IACV,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"pty-manager.d.ts","sourceRoot":"","sources":["../src/pty-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/pty-manager.js
CHANGED
|
@@ -27,6 +27,15 @@ export class PTYManager {
|
|
|
27
27
|
static PROCESS_CHECK_INTERVAL_MS = 300;
|
|
28
28
|
// AI tool patterns for MCP detection
|
|
29
29
|
static AI_TOOL_PATTERNS = ['claude', 'codex', 'aider', 'cursor'];
|
|
30
|
+
// Processes where MCP is the source of truth for terminal state.
|
|
31
|
+
// For these, we suppress legacy `working` inference to avoid conflicting UI.
|
|
32
|
+
static MCP_AUTHORITATIVE_PATTERNS = ['claude', 'codex'];
|
|
33
|
+
// Maestro-style behavior: AI tools (Claude/Codex) should own status by calling
|
|
34
|
+
// the MCP tool (`termify_status`). Agent-side auto-MCP can fight the model and
|
|
35
|
+
// cause incorrect states (e.g. keypresses flipping state).
|
|
36
|
+
//
|
|
37
|
+
// Set TERMIFY_MCP_AUTO=1 only if you explicitly want agent-side inference.
|
|
38
|
+
static MCP_AUTO_ENABLED = process.env.TERMIFY_MCP_AUTO === '1';
|
|
30
39
|
// REPL/long-lived processes where event loop stays active even when idle.
|
|
31
40
|
// For these, output silence = idle. For all others, trust daemon state directly.
|
|
32
41
|
static REPL_PROCESS_PATTERNS = ['node', 'python', 'python3', 'ruby', 'irb', 'julia', 'R', 'ghci', 'claude', 'codex', 'aider', 'cursor'];
|
|
@@ -129,12 +138,15 @@ export class PTYManager {
|
|
|
129
138
|
instance.daemonState = event.state;
|
|
130
139
|
instance.activeProcess = effectiveProcessName;
|
|
131
140
|
this.maybeSendAutoMcpStatus(event.terminalId, instance, event.state, effectiveProcessName);
|
|
141
|
+
// For MCP-authoritative tools (Claude/Codex), MCP can be the source of truth
|
|
142
|
+
// when present, but we still allow legacy working detection as a fallback.
|
|
143
|
+
// The server will suppress legacy updates when a fresh MCP override exists.
|
|
132
144
|
// Map daemon state to working state.
|
|
133
145
|
// For generic REPLs (node/python/etc.) on macOS, daemon can report
|
|
134
146
|
// NeedsInput while process is still active (event loop SSLEEP). Keep these
|
|
135
147
|
// as working and rely on output silence to mark idle.
|
|
136
148
|
// For AI tools (claude/codex/etc.), NeedsInput means "waiting for user",
|
|
137
|
-
// so treat it as NOT working.
|
|
149
|
+
// so treat it as NOT working and send MCP needs_input.
|
|
138
150
|
const isReplActive = this.isReplProcess(effectiveProcessName);
|
|
139
151
|
const isAiToolActive = this.isAiToolProcess(effectiveProcessName);
|
|
140
152
|
if (event.state === TerminalState.Working ||
|
|
@@ -163,6 +175,11 @@ export class PTYManager {
|
|
|
163
175
|
this.onWorking(event.terminalId, false, effectiveProcessName);
|
|
164
176
|
}
|
|
165
177
|
}
|
|
178
|
+
// For AI tools, NeedsInput → send MCP needs_input so the UI shows
|
|
179
|
+
// the orange banner (works even when MCP_AUTO is disabled).
|
|
180
|
+
if (event.state === TerminalState.NeedsInput && isAiToolActive) {
|
|
181
|
+
this.wsClient?.sendTerminalMcpStatus(event.terminalId, 'needs_input');
|
|
182
|
+
}
|
|
166
183
|
}
|
|
167
184
|
// Handle terminal finished (shell died)
|
|
168
185
|
if (event.state === TerminalState.Finished) {
|
|
@@ -190,7 +207,82 @@ export class PTYManager {
|
|
|
190
207
|
const lower = processName.toLowerCase();
|
|
191
208
|
return PTYManager.AI_TOOL_PATTERNS.some((p) => lower.includes(p));
|
|
192
209
|
}
|
|
210
|
+
getSilenceTimeout(processName) {
|
|
211
|
+
return this.isAiToolProcess(processName) ? PTYManager.AI_SILENCE_TIMEOUT : PTYManager.OUTPUT_SILENCE_TIMEOUT;
|
|
212
|
+
}
|
|
213
|
+
isMcpAuthoritativeProcess(processName) {
|
|
214
|
+
if (!processName)
|
|
215
|
+
return false;
|
|
216
|
+
const lower = processName.toLowerCase();
|
|
217
|
+
return PTYManager.MCP_AUTHORITATIVE_PATTERNS.some((p) => lower.includes(p));
|
|
218
|
+
}
|
|
193
219
|
static MCP_KEEPALIVE_MS = 15_000;
|
|
220
|
+
stripAnsi(input) {
|
|
221
|
+
// Basic ANSI escape stripping for prompt detection.
|
|
222
|
+
return input.replace(/\x1B\[[0-?]*[ -/]*[@-~]/g, '');
|
|
223
|
+
}
|
|
224
|
+
detectNeedsInputPrompt(output) {
|
|
225
|
+
const text = this.stripAnsi(output);
|
|
226
|
+
const lower = text.toLowerCase();
|
|
227
|
+
// Be conservative: "needs_input" should only light up for explicit selection / confirmation prompts,
|
|
228
|
+
// not just because the AI is waiting for normal chat input (that's "idle").
|
|
229
|
+
const explicit =
|
|
230
|
+
// English
|
|
231
|
+
/(select|choose|pick)\s+(an?\s+)?(option|one)\b/.test(lower) ||
|
|
232
|
+
/(enter|type)\s+(your\s+)?(choice|selection|option|number)\b/.test(lower) ||
|
|
233
|
+
/\benter\s+to\s+select\b/.test(lower) ||
|
|
234
|
+
/\besc\s+to\s+cancel\b/.test(lower) ||
|
|
235
|
+
/\b(choice|selection)\s*:\s*$/.test(lower) ||
|
|
236
|
+
/\b(y\/n)\b|\[y\/n\]|\(y\/n\)|\bcontinue\?\s*\[y\/n\]|\bproceed\?\s*\[y\/n\]/.test(lower) ||
|
|
237
|
+
/\bpress\s+(enter|return)\s+to\s+continue\b/.test(lower) ||
|
|
238
|
+
// Spanish
|
|
239
|
+
/elige\s+(una|un|la|el)\b/.test(lower) ||
|
|
240
|
+
/selecciona\b/.test(lower) ||
|
|
241
|
+
/[¿?]?\s*cu[aá]l\s+elig(e|es)\b/.test(lower) ||
|
|
242
|
+
/(opci[oó]n|opciones)\b.*\b(elige|selecciona)\b/.test(lower) ||
|
|
243
|
+
/\bpulsa\s+(enter|intro|retorno)\b/.test(lower) ||
|
|
244
|
+
/\bpresiona\s+(enter|intro|retorno)\b/.test(lower) ||
|
|
245
|
+
/\b(enter|intro)\s+para\s+(seleccionar|elegir|continuar)\b/.test(lower) ||
|
|
246
|
+
/\besc\s+para\s+cancelar\b/.test(lower) ||
|
|
247
|
+
/\bintro\s+para\s+seleccionar\b/.test(lower);
|
|
248
|
+
// Numbered options often come with an "enter your choice" style line; don't trigger on numbers alone.
|
|
249
|
+
if (!explicit)
|
|
250
|
+
return null;
|
|
251
|
+
// Keep prompt short for UI.
|
|
252
|
+
const snippet = text.trim().slice(-220);
|
|
253
|
+
return snippet.length ? snippet : null;
|
|
254
|
+
}
|
|
255
|
+
detectErrorMessage(output) {
|
|
256
|
+
const text = this.stripAnsi(output);
|
|
257
|
+
const lower = text.toLowerCase();
|
|
258
|
+
// Keep conservative: only obvious failures should flip the terminal into "error".
|
|
259
|
+
const explicit = /\berror\b\s*[:\]]/.test(lower) ||
|
|
260
|
+
/\bfailed\b/.test(lower) ||
|
|
261
|
+
/\bexception\b/.test(lower) ||
|
|
262
|
+
/\btraceback\b/.test(lower) ||
|
|
263
|
+
/\bpanic\b/.test(lower) ||
|
|
264
|
+
/\bunhandled\b/.test(lower);
|
|
265
|
+
if (!explicit)
|
|
266
|
+
return null;
|
|
267
|
+
const snippet = text.trim().slice(-220);
|
|
268
|
+
return snippet.length ? snippet : 'Error';
|
|
269
|
+
}
|
|
270
|
+
sendMcpStatusIfChanged(terminalId, instance, state, message, needsInputPrompt) {
|
|
271
|
+
if (!PTYManager.MCP_AUTO_ENABLED)
|
|
272
|
+
return;
|
|
273
|
+
if (instance.lastMcpStatusSent === state &&
|
|
274
|
+
instance.lastMcpMessageSent === message &&
|
|
275
|
+
instance.lastMcpNeedsInputPromptSent === needsInputPrompt) {
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
instance.lastMcpStatusSent = state;
|
|
279
|
+
instance.lastMcpMessageSent = message;
|
|
280
|
+
instance.lastMcpNeedsInputPromptSent = needsInputPrompt;
|
|
281
|
+
if (process.env.TERMIFY_MCP_DEBUG === '1') {
|
|
282
|
+
logger.info(`[MCP] terminal=${terminalId.substring(0, 8)}... state=${state} proc=${instance.activeProcess || 'null'}`);
|
|
283
|
+
}
|
|
284
|
+
this.wsClient?.sendTerminalMcpStatus(terminalId, state, message, needsInputPrompt);
|
|
285
|
+
}
|
|
194
286
|
mapDaemonStateToMcpStatus(state) {
|
|
195
287
|
switch (state) {
|
|
196
288
|
case TerminalState.Idle:
|
|
@@ -208,12 +300,16 @@ export class PTYManager {
|
|
|
208
300
|
}
|
|
209
301
|
}
|
|
210
302
|
stopMcpKeepalive(instance) {
|
|
303
|
+
if (!PTYManager.MCP_AUTO_ENABLED)
|
|
304
|
+
return;
|
|
211
305
|
if (instance.mcpKeepaliveTimer) {
|
|
212
306
|
clearInterval(instance.mcpKeepaliveTimer);
|
|
213
307
|
instance.mcpKeepaliveTimer = null;
|
|
214
308
|
}
|
|
215
309
|
}
|
|
216
310
|
startMcpKeepalive(terminalId, instance) {
|
|
311
|
+
if (!PTYManager.MCP_AUTO_ENABLED)
|
|
312
|
+
return;
|
|
217
313
|
if (instance.mcpKeepaliveTimer)
|
|
218
314
|
return;
|
|
219
315
|
instance.mcpKeepaliveTimer = setInterval(() => {
|
|
@@ -225,15 +321,15 @@ export class PTYManager {
|
|
|
225
321
|
}, PTYManager.MCP_KEEPALIVE_MS);
|
|
226
322
|
}
|
|
227
323
|
maybeSendAutoMcpStatus(terminalId, instance, state, processName) {
|
|
228
|
-
|
|
324
|
+
if (!PTYManager.MCP_AUTO_ENABLED)
|
|
325
|
+
return;
|
|
229
326
|
const isAi = this.isAiToolProcess(processName);
|
|
327
|
+
const isMcpAuth = this.isMcpAuthoritativeProcess(processName);
|
|
230
328
|
// Start/stop auto MCP reporting based on whether an AI tool is the active process.
|
|
231
329
|
if (!isAi) {
|
|
232
330
|
if (instance.mcpAutoActive) {
|
|
233
331
|
// Leaving an AI tool: clear overrides server-side.
|
|
234
|
-
|
|
235
|
-
this.wsClient?.sendTerminalMcpStatus(terminalId, 'idle');
|
|
236
|
-
}
|
|
332
|
+
this.sendMcpStatusIfChanged(terminalId, instance, 'idle');
|
|
237
333
|
instance.mcpAutoActive = false;
|
|
238
334
|
instance.lastMcpStatusSent = 'idle';
|
|
239
335
|
this.stopMcpKeepalive(instance);
|
|
@@ -242,10 +338,32 @@ export class PTYManager {
|
|
|
242
338
|
}
|
|
243
339
|
instance.mcpAutoActive = true;
|
|
244
340
|
this.startMcpKeepalive(terminalId, instance);
|
|
245
|
-
|
|
341
|
+
// For MCP-authoritative tools (Claude/Codex), use local heuristics:
|
|
342
|
+
// - default to idle when entering the tool
|
|
343
|
+
// - set working on real output / Enter (see write + handleTerminalOutput)
|
|
344
|
+
// - set idle on typing + output silence timer
|
|
345
|
+
// - set needs_input only on explicit option/confirmation prompts in output
|
|
346
|
+
if (isMcpAuth) {
|
|
347
|
+
if (state === TerminalState.Finished) {
|
|
348
|
+
this.sendMcpStatusIfChanged(terminalId, instance, 'finished');
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
if (state === TerminalState.Error) {
|
|
352
|
+
this.sendMcpStatusIfChanged(terminalId, instance, 'error');
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
// Forward daemon NeedsInput for AI tools that don't call termify_status (e.g. Codex)
|
|
356
|
+
if (state === TerminalState.NeedsInput) {
|
|
357
|
+
this.sendMcpStatusIfChanged(terminalId, instance, 'needs_input');
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
360
|
+
if (!instance.lastMcpStatusSent) {
|
|
361
|
+
this.sendMcpStatusIfChanged(terminalId, instance, 'idle');
|
|
362
|
+
}
|
|
246
363
|
return;
|
|
247
|
-
|
|
248
|
-
this.
|
|
364
|
+
}
|
|
365
|
+
const mapped = this.mapDaemonStateToMcpStatus(state);
|
|
366
|
+
this.sendMcpStatusIfChanged(terminalId, instance, mapped);
|
|
249
367
|
}
|
|
250
368
|
/**
|
|
251
369
|
* Output-based idle detection: if daemon says Working but no output for N seconds,
|
|
@@ -253,22 +371,41 @@ export class PTYManager {
|
|
|
253
371
|
* Node.js event loop stays active even when idle, so daemon can't tell the difference.
|
|
254
372
|
* Only applies to REPL processes - normal commands trust daemon state directly.
|
|
255
373
|
*/
|
|
256
|
-
static OUTPUT_SILENCE_TIMEOUT = 3000; // 3 seconds
|
|
374
|
+
static OUTPUT_SILENCE_TIMEOUT = 3000; // 3 seconds for regular REPLs
|
|
375
|
+
static AI_SILENCE_TIMEOUT = 15000; // 15 seconds for AI tools (longer thinking pauses)
|
|
257
376
|
startOutputSilenceTimer(terminalId, instance) {
|
|
258
377
|
this.clearOutputSilenceTimer(instance);
|
|
378
|
+
const timeoutMs = this.getSilenceTimeout(instance.activeProcess);
|
|
259
379
|
instance.outputSilenceTimer = setTimeout(() => {
|
|
260
380
|
// Mark timer as consumed so future command cycles can re-arm it.
|
|
261
381
|
instance.outputSilenceTimer = null;
|
|
262
|
-
//
|
|
382
|
+
// For MCP-authoritative tools, silence means "idle" (normal prompt).
|
|
383
|
+
// This prevents sticky "working" on TUIs that keep the process alive.
|
|
384
|
+
if (this.isMcpAuthoritativeProcess(instance.activeProcess)) {
|
|
385
|
+
// If agent-side MCP is enabled, drop "working" or "needs_input" back to "idle" on silence.
|
|
386
|
+
if (PTYManager.MCP_AUTO_ENABLED && (instance.lastMcpStatusSent === 'working' || instance.lastMcpStatusSent === 'needs_input')) {
|
|
387
|
+
this.sendMcpStatusIfChanged(terminalId, instance, 'idle');
|
|
388
|
+
}
|
|
389
|
+
// Legacy fallback: clear working after silence so Claude/Codex don't stay "working".
|
|
390
|
+
if (instance.isWorking) {
|
|
391
|
+
instance.isWorking = false;
|
|
392
|
+
logger.debug(`[OUTPUT IDLE][AI] terminal=${terminalId.substring(0, 8)}... marking idle after ${timeoutMs}ms silence`);
|
|
393
|
+
if (this.onWorking) {
|
|
394
|
+
this.onWorking(terminalId, false, instance.activeProcess);
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
return;
|
|
398
|
+
}
|
|
399
|
+
// No output for N seconds → REPL is likely idle (waiting for user input).
|
|
263
400
|
// Works regardless of daemon state (daemon may not emit events on macOS).
|
|
264
401
|
if (instance.isWorking && this.isReplProcess(instance.activeProcess)) {
|
|
265
402
|
instance.isWorking = false;
|
|
266
|
-
logger.debug(`[OUTPUT IDLE] terminal=${terminalId.substring(0, 8)}... no output for ${
|
|
403
|
+
logger.debug(`[OUTPUT IDLE] terminal=${terminalId.substring(0, 8)}... no output for ${timeoutMs}ms, marking idle`);
|
|
267
404
|
if (this.onWorking) {
|
|
268
405
|
this.onWorking(terminalId, false, instance.activeProcess);
|
|
269
406
|
}
|
|
270
407
|
}
|
|
271
|
-
},
|
|
408
|
+
}, timeoutMs);
|
|
272
409
|
}
|
|
273
410
|
clearOutputSilenceTimer(instance) {
|
|
274
411
|
if (instance.outputSilenceTimer) {
|
|
@@ -401,11 +538,24 @@ export class PTYManager {
|
|
|
401
538
|
if (!current || current.processCheckGeneration !== generation) {
|
|
402
539
|
return;
|
|
403
540
|
}
|
|
541
|
+
// If the user is in an MCP-authoritative AI tool (Claude/Codex), do not let
|
|
542
|
+
// legacy heuristics hold the terminal in "working". MCP will drive status.
|
|
543
|
+
if (this.isMcpAuthoritativeProcess(processName)) {
|
|
544
|
+
current.activeProcess = processName;
|
|
545
|
+
this.clearOutputSilenceTimer(current);
|
|
546
|
+
if (current.isWorking) {
|
|
547
|
+
current.isWorking = false;
|
|
548
|
+
if (this.onWorking) {
|
|
549
|
+
this.onWorking(terminalId, false, processName);
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
return;
|
|
553
|
+
}
|
|
404
554
|
if (processName !== current.activeProcess) {
|
|
405
555
|
current.activeProcess = processName;
|
|
406
556
|
// Only emit WORKING if terminal is actually in working mode.
|
|
407
557
|
// This avoids stale async ticks re-enabling working after command end.
|
|
408
|
-
if (current.isWorking && this.onWorking) {
|
|
558
|
+
if (current.isWorking && this.onWorking && !this.isMcpAuthoritativeProcess(processName)) {
|
|
409
559
|
this.onWorking(terminalId, true, processName);
|
|
410
560
|
}
|
|
411
561
|
}
|
|
@@ -413,7 +563,9 @@ export class PTYManager {
|
|
|
413
563
|
// timer for idle detection instead of staying working forever.
|
|
414
564
|
// Only start timer once (check !outputSilenceTimer to avoid resetting
|
|
415
565
|
// the countdown every 300ms tick).
|
|
416
|
-
if (this.isReplProcess(current.activeProcess) &&
|
|
566
|
+
if (this.isReplProcess(current.activeProcess) &&
|
|
567
|
+
!this.isMcpAuthoritativeProcess(current.activeProcess) &&
|
|
568
|
+
!current.outputSilenceTimer) {
|
|
417
569
|
this.startOutputSilenceTimer(terminalId, current);
|
|
418
570
|
}
|
|
419
571
|
}
|
|
@@ -506,8 +658,13 @@ export class PTYManager {
|
|
|
506
658
|
});
|
|
507
659
|
term.kill();
|
|
508
660
|
`;
|
|
661
|
+
// Important: the child process must be able to resolve `node-pty`.
|
|
662
|
+
// If we use the user's current working directory, `require('node-pty')` can fail
|
|
663
|
+
// even though termify-agent has it installed as a dependency (or it is hoisted).
|
|
664
|
+
const nodePtyDir = this.getNodePtyDir();
|
|
665
|
+
const smokeTestCwd = nodePtyDir ? path.resolve(nodePtyDir, '..', '..') : process.cwd();
|
|
509
666
|
const result = spawnSync(process.execPath, ['-e', script], {
|
|
510
|
-
cwd:
|
|
667
|
+
cwd: smokeTestCwd,
|
|
511
668
|
env: process.env,
|
|
512
669
|
stdio: 'pipe',
|
|
513
670
|
encoding: 'utf8',
|
|
@@ -726,6 +883,12 @@ export class PTYManager {
|
|
|
726
883
|
return false;
|
|
727
884
|
}
|
|
728
885
|
try {
|
|
886
|
+
const isMcpAuth = this.isMcpAuthoritativeProcess(instance.activeProcess);
|
|
887
|
+
instance.lastWriteAt = Date.now();
|
|
888
|
+
instance.lastWriteHadNewline = data.includes('\r') || data.includes('\n');
|
|
889
|
+
// IMPORTANT: For MCP-authoritative AI tools (Claude/Codex), the AI itself should
|
|
890
|
+
// report status via the `termify_status` MCP tool (Maestro pattern).
|
|
891
|
+
// The agent must not infer MCP status from keystrokes.
|
|
729
892
|
// For AI tools, typing means the tool is waiting for user input (idle),
|
|
730
893
|
// not "working". Avoid sticky working indicators when users compose prompts.
|
|
731
894
|
// We'll mark working again on Enter (newline) and on real (non-echo) output.
|
|
@@ -748,21 +911,27 @@ export class PTYManager {
|
|
|
748
911
|
instance.pendingEcho = next;
|
|
749
912
|
instance.pendingEchoUpdatedAt = Date.now();
|
|
750
913
|
}
|
|
751
|
-
// Detect command execution (newline/carriage return)
|
|
914
|
+
// Detect command execution (newline/carriage return).
|
|
915
|
+
// This includes AI TUIs (Claude/Codex): we want a responsive "working" fallback
|
|
916
|
+
// even if the model doesn't call the MCP status tool.
|
|
752
917
|
if (data.includes('\r') || data.includes('\n')) {
|
|
753
918
|
instance.lastInputTime = Date.now();
|
|
754
919
|
// Set optimistic working state immediately for responsive UI
|
|
755
920
|
if (!instance.isWorking) {
|
|
756
921
|
instance.isWorking = true;
|
|
757
922
|
if (this.onWorking) {
|
|
758
|
-
this.onWorking(terminalId, true, null);
|
|
923
|
+
this.onWorking(terminalId, true, instance.activeProcess || null);
|
|
759
924
|
}
|
|
760
925
|
}
|
|
761
926
|
// Always start process check as reliable fallback.
|
|
762
927
|
// Daemon events provide faster detection when working,
|
|
763
928
|
// but process check ensures commands are always detected
|
|
764
929
|
// (daemon may not emit events reliably on macOS).
|
|
765
|
-
|
|
930
|
+
// For MCP-authoritative tools, process check isn't useful (they're long-lived).
|
|
931
|
+
// For normal commands, process check ensures we detect completion.
|
|
932
|
+
if (!isMcpAuth) {
|
|
933
|
+
this.startProcessCheck(terminalId);
|
|
934
|
+
}
|
|
766
935
|
}
|
|
767
936
|
return true;
|
|
768
937
|
}
|